wxPython: 使用EVT_IDLE

3 投票
2 回答
1759 浏览
提问于 2025-04-15 11:13

我定义了一个处理程序,用来处理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()。

撰写回答