[英]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線程的鏈接
這是我的解決方案。 如果有改進的余地,請告訴我。
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.