【问题标题】:Wxpython Break While LoopWxpython Break While 循环
【发布时间】:2019-11-23 12:08:52
【问题描述】:

我正在创建一个简单的 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()

【问题讨论】:

    标签: python multithreading while-loop wxpython


    【解决方案1】:

    尝试创建一个初始设置为 false 的 bool

    让您的开始按钮调用一个将 bool 设置为 true 的线程,然后基于此 bool 启动一个 while 循环,在此循环内有您的计数器和任何其他逻辑。

    现在您的计数器在自己的线程中,停止按钮可用于将 bool 设置为 false,从而终止 while 循环,然后线程将结束。

    这是一个解释 python 线程的链接

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

    【讨论】:

    • 我知道如何创建线程对象,但是如何使用按钮调用线程呢?我应该在绑定函数中更改什么,self.btn_start.Bind(wx.EVT_BUTTON, self.Loop)
    • 我能够解决我的问题。谢谢你'Spriggsy'。如果我想将我的解决方案分享给其他人,如何在此处添加?
    • “添加另一个答案”或“回答您的问题”下方应该有一个蓝色按钮,选择它并输入答案。展示您如何解决问题总是很好
    【解决方案2】:

    这是我的解决方案。如果有改进的余地,请告诉我。

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 2020-06-03
      相关资源
      最近更新 更多