为了账号安全,请及时绑定邮箱和手机立即绑定

Python:带有线程的 PubSub 和 WxPython 是否需要 wx.CallAfter?

Python:带有线程的 PubSub 和 WxPython 是否需要 wx.CallAfter?

杨魅力 2022-10-18 14:53:59
我在用:wxPython 4.0.7.post2Pypubsub 4.0.3Python 3.8.1我有以下我编写的示例程序:import wximport timefrom threading import Threadfrom pubsub import pubTIME_UPDATED = "time.updated"class MyFrame(wx.Frame):    def __init__(self):        super().__init__(parent=None, title="Example")        self.text = wx.StaticText(self, label="I will display seconds elapsed!")        self.othertext = wx.StaticText(self, label="I will Update")        sizer = wx.BoxSizer(orient=wx.VERTICAL)        sizer.Add(self.text)        sizer.Add(self.othertext)        self.SetSizer(sizer)        self.timer = wx.Timer(self)        pub.subscribe(self.UpdateTime, TIME_UPDATED)        self.Bind(wx.EVT_TIMER, self.OnTime, self.timer)        self.Show()        self.i = 0        self.timer.Start(500)    def OnTime(self, _):        self.i += 1        self.othertext.SetLabel(str(self.i))    def UpdateTime(self, seconds):        self.text.SetLabel("{seconds} seconds have elapsed".format(seconds=seconds))        self.text.Refresh()class BackgroundThread(Thread):    def run(self):        time_elapsed = 0        while True:            # Lets sleep 1 second            time.sleep(1)            time_elapsed += 1            # <<<<---- This line is what I am worried about.            pub.sendMessage(TIME_UPDATED, seconds=time_elapsed)if __name__ == '__main__':    app = wx.App()    frame = MyFrame()    background = BackgroundThread(daemon=True)    background.start()    app.MainLoop()我正在执行没有 wx.CallAfter 的 pub.sendMessage(TIME_UPDATED, seconds=time_elapsed) ,它似乎工作正常。我不确定为什么。有人可以解释一下是否需要 wx.CallAfter 吗?如果是,你能解释为什么会这样吗?是否某些 wx 方法将某些内容放入调度队列而其他方法没有?
查看完整描述

1 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

是的,您仍然应该确保 UI 操作发生在 UI 线程上。仅仅因为做某事不安全并不意味着它在某些情况下不能正常工作(或看起来工作正常)。



查看完整回答
反对 回复 2022-10-18
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号