我最近从wxPython切换到PyQT,找不到等效的CallAfter。由于某些导入,我需要使用pubsub,并且使用wx我刚刚通过CallAfter发送了消息-有没有办法在PyQT中做类似的事情?基本上,我想用pyQT向mainloop中注入一些东西。
编辑更多信息:
在我的旧GUI中,使用wxPython,我使用的是python-openzwave,它使用了旧的调度程序模块。我将捕获旧的调度程序信号,并将其转换为pubsub消息(为了易于使用),并使用CallAfter发送新消息,如下所示:
wx.CallAfter(pub.sendMessage, messagePack.signal, message = messagePack.message)
然后,我能够通过捕获消息并直接在gui元素上进行操作来更新GUI,因为它实际上是在主循环中注入了一些东西。
现在,使用pyqt,就没有callafter了,因此,我具有没有callafter的相同系统设置,但是由于消息位于mainloop的中间,因此无法执行在收到消息后必须执行的操作。
最佳答案
我能想到的最接近的事情是在短时间内使用QTimer.singleShot
,这将迫使它进入下一个事件循环。
def other_function(self):
print 'other'
def my_function(self):
print 'one'
QTimer.singleShot(1, self.other_function)
print 'two'
Qt有一个事件循环的想法,它将检查是否有需要处理的事件,例如单击按钮,或者需要重绘小部件的一部分等。通常,一个函数作为事件的结果被调用。
QTimer.singleShot
将函数调用放在事件循环的下一个循环中要处理的事物列表的末尾。但是我同意其中的一些意见,您可能只需要使用在另一个线程中运行的单独QObject来处理openzwave事件,并将消息重新分配为Qt Signals,主线程就可以侦听并更新GUI。
关于python - PyQT相当于wx CallAfter吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34956113/