首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Wxpython Break While循环

Wxpython Break While循环
EN

Stack Overflow用户
提问于 2019-11-23 20:08:53
回答 2查看 329关注 0票数 0

我正在创建一个简单的图形用户界面,一个有两个按钮,开始按钮和停止按钮使用wxpythonframe。当你按下开始按钮时,程序应该从1开始打印数字。当你按下停止按钮时,程序应该停止打印数字并打印‘完成’。我使用了一个while循环来连续打印数字。停止按钮应该“中断”while循环,但是它会导致程序冻结。我知道我应该以某种方式使用线程。我的问题是:如何将按钮事件创建为线程?

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-23 21:24:42

尝试创建初始设置为false的布尔值

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

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

这里有一个解释python线程的链接

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

票数 0
EN

Stack Overflow用户

发布于 2019-11-24 22:26:18

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

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59007449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档