2009-08-14 6 views
1

Dans mon application wxPython, j'ai un gestionnaire EVT_IDLE qui appelle une fonction qui doit être appelée une fois toutes les 150 millisecondes environ. Après avoir appelé la fonction, le gestionnaire appelle:wxPython: wx.CallLater étant très en retard

wx.CallLater(150,self._clear_idle_block_and_do) 

Cette fonction _clear_idle_block_and_do publie essentiellement un autre événement EVT_IDLE, la poursuite du cycle.

Maintenant, je remarque que lorsque d'autres widgets dans l'interface graphique font un travail difficile, le gestionnaire d'événements EVT_IDLE est à peine appelé! Parfois, il n'est pas appelé pendant 4 secondes, ce qui est beaucoup trop. Est-ce parce que wx.CallLater ne fonctionne pas bien? Y a-t-il quelque chose que je puisse faire?

Répondre

2

Voici un module qui crée un temporisateur qui ne souffre pas de ce problème.

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

Pour utiliser dans le programme:

import threadtimer 

timer = threadtimer.ThreadTimer(window) 
timer.start(150) 
window.Bind(threadtimer.EVT_THREAD_TIMER, function_to_call) 
5

L'attente prend tellement de temps, car elle attend le temps d'inactivité. Évidemment, si vous avez d'autres widgets qui travaillent dur, il n'y aura pas de temps d'inactivité bientôt. Si vous voulez un événement périodique, utilisez une minuterie.