簡體   English   中英

Wxpython Break While 循環

[英]Wxpython Break While Loop

我正在創建一個簡單的 GUI,一個帶有兩個按鈕的frame ,使用wxpython開始按鈕和停止按鈕。 當您按下開始按鈕時,程序應該開始打印從 1 開始的數字。當您按下停止按鈕時,程序應該停止打印數字並打印“完成”。 我正在使用 while 循環來連續打印數字。 停止按鈕應該“中斷”while 循環,但是它會導致程序凍結。 我知道我應該以某種方式使用線程。 我的問題是:如何將按鈕事件創建為線程?

import wx
import time

class PanelOne(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        sizer = wx.BoxSizer(wx.VERTICAL)

        self.btn_start = wx.Button(self, label="Start")

        self.btn_start.Bind(wx.EVT_BUTTON, self.Loop)

        self.btn_stop = wx.Button(self, label="Stop")

        self.btn_stop.Bind(wx.EVT_BUTTON, self.Loop)

        sizer.Add(self.btn_start, 0, wx.ALL|wx.EXPAND, 5)

        sizer.Add(self.btn_stop, 0, wx.ALL|wx.EXPAND, 5)

        self.SetSizer(sizer)

        self.condition = True

    def Loop(self, event):        
        count = 0
        button = event.GetEventObject()

        while self.condition:
            labelName = button.GetLabel()
            count = count+1
            print(count)
            time.sleep(1)
            if labelName == 'Stop':
                print("Done")
                break       

class FrameOne(wx.Frame):    
    def __init__(self):
        wx.Frame.__init__(self, None, title="First Frame")
        panel = PanelOne(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = FrameOne()
    app.MainLoop()

嘗試創建一個初始設置為 false 的 bool

讓你的開始按鈕調用一個線程,將 bool 設置為 true,然后基於這個 bool 啟動一個 while 循環,在這個循環內有你的計數器和任何其他邏輯。

現在您的計數器在它自己的線程中,停止按鈕可用於將 bool 設置為 false 並因此終止 while 循環,線程將結束。

這是一個解釋python線程的鏈接

https://realpython.com/intro-to-python-threading/

這是我的解決方案。 如果有改進的余地,請告訴我。

import wx
import time
import threading

class PanelOne(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        sizer = wx.BoxSizer(wx.VERTICAL)

        self.btn_start = wx.Button(self, label="Start")

        self.btn_start.Bind(wx.EVT_BUTTON, self.LoopCond)

        #self.condition

        self.btn_stop = wx.Button(self, label="Stop")

        self.btn_stop.Bind(wx.EVT_BUTTON, self.LoopCond)

        sizer.Add(self.btn_start, 0, wx.ALL|wx.EXPAND, 5)

        sizer.Add(self.btn_stop, 0, wx.ALL|wx.EXPAND, 5)

        self.SetSizer(sizer)

    def LoopCond(self, event):
        button = event.GetEventObject()
        self.labelName = button.GetLabel()
        if self.labelName == 'Start':
            self.condition = True
            threading.Thread(target= self.Loop, args=(self.condition,), daemon=True).start()
            self.btn_start.Enable(False)
        else:
            self.condition = False
            threading.Thread(target= self.Loop, args=(self.condition,), daemon=True).start()
            self.btn_start.Enable(True)
            #parent_frame = self.GetParent()
            #parent_frame.Close()


    def Loop(self, condition):        
        count = 0
        while condition:
            count = count+1
            print(count)
            time.sleep(1)            
            if self.labelName == 'Stop':
                print("Done")
                break            

class FrameOne(wx.Frame):    
    def __init__(self):
        wx.Frame.__init__(self, None, title="First Frame")
        panel = PanelOne(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = FrameOne()
    app.MainLoop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM