2010-04-04 6 views
0

Lorsqu'il y a deux événements identiques dans la boucle d'événements, wxPython les traitera-t-il tous les deux ou appellera-t-il le gestionnaire une seule fois pour les deux? Je veux dire, dans mon widget je veux avoir un événement comme EVT_NEED_TO_RECALCULATE_X. Je veux que cet événement soit publié dans toutes sortes de circonstances différentes qui nécessitent x pour être recalculé. Cependant, même s'il y a deux raisons différentes de recalculer x, un seul recalcul doit être effectué.wxWidgets/wxPython: deux événements identiques entraînent-ils deux manipulations?

Comment faire?

EDIT:

J'ai essayé ce code:

import wx 

class Frame(wx.Frame): 
    def __init__(self, parent=None): 
     wx.Frame.__init__(self, parent) 

     self.Bind(wx.EVT_COLOURPICKER_CHANGED, self.on_event) 

     self.Centre() 
     self.Show(True) 

     self.i = 0 

     self.event_all() 

    def on_event(self, event): 
     print self.i 
     self.i += 1 

    def event_all(self): 
     for j in range(1000): 
      event = wx.PyEvent() 
      event.SetEventType(wx.EVT_COLOURPICKER_CHANGED.evtType[0]) 
      wx.PostEvent(self, event) 


app = wx.App() 
Frame(None) 
app.MainLoop() 

Si les événements font se regrouper, je pense qu'il ne pas compter tout le chemin à 1000. Mais Est-ce que. Sont-ils regroupés ou non?

Répondre

0

vous parlez trois choses

  • l'événement
  • la source de l'événement
  • la gestion des événements

L'événement est un seul (X doit être recalculé). Il a plusieurs sources. Mais il n'a qu'un seul gestionnaire.

Cela devrait donc fonctionner. Vous en faites un seul événement, ajoutez un seul gestionnaire, mais signalez/augmentez l'événement quand vous voulez - chaque fois que vous augmentez le drapeau X recalculé, le gestionnaire devrait s'exécuter une fois.


EDIT:

Cette ligne ...

event = wx.PyEvent() 

... crée un nouvel événement . Cela signifie que quelque chose s'est passé et doit être réagi. Si vous créez 1000 événements, alors le gestionnaire d'événements sera appelé 1000 fois. Le gestionnaire sera appelé une fois pour chaque fois que l'événement se produit, c'est-à-dire une fois pour chaque instance PyEvent qui est publiée dans la file d'attente des événements.

Si vous voulez groupe eux, une façon est de ne pas créer une nouvelle PyEvent exemple, si l'on est en attente:

class Frame(wx.Frame): 
    def __init__(self, parent=None): 
     wx.Frame.__init__(self, parent) 
     self.Bind(wx.EVT_COLOURPICKER_CHANGED, self.on_event) 
     self.Centre() 
     self.Show(True) 
     self.i = 0 
     self.recalculating = False 
     self.event_all() 

    def on_event(self, event): 
     self.recalculating = False 
     print self.i 
     self.i += 1 

    def event_all(self): 
     for j in range(1000): 
      if not self.recalculating: 
       event = wx.PyEvent() 
       event.SetEventType(wx.EVT_COLOURPICKER_CHANGED.evtType[0]) 
       wx.PostEvent(self, event) 
       self.recalculating = True 
+0

Attendez, dois-je créer ce drapeau ** besoin X recalculé ** ou est-il créé pour moi? –

+0

Voir ma modification ci-dessus. –

0

Si vous afficherez un événement 1000 fois, vous recevrez 1000 fois, pourquoi n'importe quel système d'événements les regrouperait, ce serait un bug.Si vous ne voulez pas traiter tous les 1000 d'entre eux les ignorer, seulement vous pouvez décider comment ils doivent être groupés, si l'utilisateur change quelque chose rapidement voulez-vous regrouper ces changements ou répondre à tous les événements et avoir un interface utilisateur plus réactive?

En vous cas vous devez soit groupe

  1. leur temps par exemple gérer les événements qui sont distants de N msec
  2. Groupez la valeur avec, par ex. si la dernière valeur est la même que la valeur actuelle ne rien
  3. Définir un indicateur est un objet a été modifié, vous obtenez l'événement, vous faites quelque chose et de réinitialiser le drapeau, la prochaine fois que le drapeau de contrôle d'événement est quelque chose a vraiment changé ou non

Mais la ligne du bas est Vous devez décider comment vous réagissez aux événements.

Questions connexes