wxPython:wx.CallLater很晚

时间:2009-08-14 13:52:40

标签: wxpython

在我的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表现不佳吗?有什么我可以做的吗?

2 个答案:

答案 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)