在我的wxPython应用程序中,我有一个EVT_IDLE
处理程序,它调用一个必须每150毫秒左右调用一次的函数。调用该函数后,处理程序调用:
wx.CallLater(150,self._clear_idle_block_and_do)
_clear_idle_block_and_do
函数基本上发布了另一个EVT_IDLE
事件,继续循环。
现在我注意到当GUI中的其他小部件正在努力工作时,EVT_IDLE
事件处理程序几乎不会被调用!有时它不会被召唤4秒,这太过分了。
这是因为wx.CallLater表现不佳吗?有什么我可以做的吗?
答案 0 :(得分:5)
等待需要很长时间,因为它等待空闲时间。显然,如果你有“其他小部件正在努力工作”,那么很快就不会有空闲时间。如果您想要定期活动,请使用计时器。
答案 1 :(得分:2)
这是一个创建计时器的模块,不会遇到这个问题。
#threadtimer.py
import threading
import time
import wx
wxEVT_THREAD_TIMER = wx.NewEventType()
EVT_THREAD_TIMER = wx.PyEventBinder(wxEVT_THREAD_TIMER, 1)
class ThreadTimer(object):
def __init__(self, parent):
self.parent = parent
self.thread = Thread()
self.thread.parent = self
self.alive = False
def start(self, interval):
self.interval = interval
self.alive = True
self.thread.start()
def stop(self):
self.alive = False
class Thread(threading.Thread):
def run(self):
while self.parent.alive:
time.sleep(self.parent.interval / 1000.0)
event = wx.PyEvent()
event.SetEventType(wxEVT_THREAD_TIMER)
wx.PostEvent(self.parent.parent, event)
在程序中使用:
import threadtimer
timer = threadtimer.ThreadTimer(window)
timer.start(150)
window.Bind(threadtimer.EVT_THREAD_TIMER, function_to_call)