wxPython: 使用EVT_IDLE
我定义了一个处理程序,用来处理EVT_IDLE
事件,这个事件会帮我做一些后台任务。(这个任务是把几个进程完成的工作整合到一个对象里,从而在界面上显示出变化。)
问题是,当用户不移动鼠标或者不做任何事情的时候,EVT_IDLE
事件不会被调用超过一次。我希望这个处理程序能够一直工作。所以我尝试在处理程序的最后调用event.RequestMore()
。这样做是有效的,但现在它占用了很多CPU资源。(我猜这只是一直在重复执行那个任务。)
我愿意限制每秒执行这个任务的次数;我该怎么做呢?
或者你有没有其他的解决方案?
2 个回答
0
这听起来像是应该用wxTimerEvent而不是wxIdleEvent的情况。当有事情需要处理时,调用wxTimerEvent.Start()。如果没有事情要做,就调用wxTimerEvent.Stop(),然后通过EVT_TIMER来执行你的处理方法。
(注意:我使用的是C++的wxWidgets,对wxPython不太熟悉,但我想它们的接口应该类似。)
2
像这样(每秒最多执行一次):
...
def On_Idle(self, event):
if not self.queued_batch:
wx.CallLater(1000, self.Do_Batch)
self.queued_batch = True
def Do_Batch(self):
# <- insert your stuff here
self.queued_batch = False
...
哦,别忘了在构造函数里把 self.queued_batch 设置为 False,并且在 On_Idle 中以某种方式调用 event.RequestMore()。