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



我正在使用:

wxPython 4.0.7.post2

Pypubsub 4.0.3

Python 3.8.1

我写了以下示例程序:

import wx
import time
from threading import Thread
from pubsub import pub
TIME_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的pub.sendMessage(TIME_UPDATED,seconds=TIME_elaped(。CallAfter,它似乎运行良好。我不知道为什么。

有人能解释一下wx。CallAfter是必要的吗?

如果是,你能解释一下为什么是这样吗?是不是有些wx方法把一些东西放到了调度队列中,而另一些则没有?

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

最新更新