2009-08-14 38 views
1

在我的wxPython應用程序中,我有一個EVT_IDLE處理函數,它調用一些函數,每150毫秒左右調用一次函數。調用該函數後,處理程序調用:wxPython:wx.CallLater很晚

wx.CallLater(150,self._clear_idle_block_and_do) 

_clear_idle_block_and_do功能基本上張貼另一EVT_IDLE事件,持續的週期。

現在我注意到,當GUI中的其他小部件正在努力工作時,幾乎不會調用EVT_IDLE事件處理程序!有時它不會被要求4秒,這太多了。

這是因爲wx.CallLater表現不佳嗎?有什麼我可以做的嗎?

回答

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) 
5

等待需要很長時間,因爲它等待空閒時間。顯然,如果你有「其他小工具正在努力工作」,很快就不會有空閒時間。如果您想要定期活動,請使用定時器。