繁体   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