2009-04-23 11 views
3

J'ai défini un gestionnaire pour EVT_IDLE qui effectue une certaine tâche d'arrière-plan pour moi. (Cette tâche consiste à effectuer un travail complet à partir de quelques processus et à l'intégrer dans un objet, en modifiant l'interface graphique.)wxPython: Utilisation de EVT_IDLE

Le problème est que lorsque l'utilisateur ne bouge pas la souris ou ne fait rien, EVT_IDLE Ne sois pas appelé plus d'une fois. Je voudrais que ce gestionnaire travaille tout le temps. J'ai donc essayé d'appeler event.RequestMore() à la fin du gestionnaire. Fonctionne, mais maintenant il faut beaucoup de CPU. (Je devine que c'est juste en boucle trop sur cette tâche.)

Je suis prêt à limiter le nombre de fois que la tâche sera effectuée par seconde; Comment je fais ça?

Ou avez-vous une autre solution en tête?

Répondre

2

Quelque chose comme ça (exécute au plus chaque seconde):

... 

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 

... 

Oh, et ne pas oublier de mettre self.queued_batch sur False dans le constructeur et peut-être appeler event.RequestMore() d'une certaine façon dans On_Idle.

0

Cela ressemble à un cas d'utilisation pour wxTimerEvent au lieu de wxIdleEvent. Quand il y a un traitement à faire, appelez wxTimerEvent.Start(). Quand il n'y en a pas, appelez wxTimerEvent.Stop() et appelez vos méthodes pour effectuer le traitement à partir de EVT_TIMER. (Note: j'utilise wxWidghets pour C++ et ne suis pas familier avec wxPython mais je suppose qu'ils ont une API similaire)