2009-10-27 6 views
0

J'ai un peu de mal avec un panneau qui a deux TextCtrls wxPython. Je veux un gestionnaire EVT_CHAR ou EVT_KEY_UP lié aux deux contrôles, et je veux être capable de dire quel TextCtrl a généré l'événement. Je pense que event.Id me le dirait, mais dans l'exemple de code suivant c'est toujours 0. Des pensées? Je n'ai testé ceci sur OS X.Utiliser le même gestionnaire pour plusieurs wx.TextCtrls?

Ce code vérifie simplement que les deux ont TextCtrls un texte en eux avant d'activer le bouton Terminé

import wx 

class MyFrame(wx.Frame): 
    def __init__(self, parent, ID, title): 
     wx.Frame.__init__(self, parent, ID, title, 
         wx.DefaultPosition, wx.Size(200, 150)) 
     self.panel = BaseNameEntryPanel(self) 

class BaseNameEntryPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent, -1) 

     self.entry = wx.TextCtrl(self, wx.NewId()) 
     self.entry2 = wx.TextCtrl(self, wx.NewId()) 

     self.donebtn = wx.Button(self, wx.NewId(), "Done") 
     self.donebtn.Disable() 

     vsizer = wx.BoxSizer(wx.VERTICAL) 

     vsizer.Add(self.entry, 1, wx.EXPAND|wx.GROW) 
     vsizer.Add(self.entry2, 1, wx.EXPAND|wx.GROW) 
     vsizer.Add(self.donebtn, 1, wx.EXPAND|wx.GROW) 
     self.SetSizer(vsizer) 
     self.Fit() 
     self.entry.Bind(wx.EVT_KEY_UP, self.Handle) 
     self.entry2.Bind(wx.EVT_KEY_UP, self.Handle) 


    def Handle(self, event): 
     keycode = event.GetKeyCode() 
     print keycode, event.Id # <- event.Id is always 0! 

     def checker(entry): 
      return bool(entry.GetValue().strip()) 

     self.donebtn.Enable(checker(self.entry) and checker(self.entry2)) 



class MyApp(wx.App): 
    def OnInit(self): 
     frame = MyFrame(None, -1, "Hello from wxPython") 
     frame.Show(True) 
     self.SetTopWindow(frame) 
     return True 

app = MyApp(0) 
app.MainLoop() 

Répondre

4

Vous pouvez essayer event.GetId() ou event.GetEventObject() et voir si l'un de ces travail.

Une autre approche consiste à utiliser lambda ou functools.partial pour passer efficacement un paramètre au gestionnaire. Ainsi, par exemple, sous dans les lignes ci-dessous dans votre programme:

 self.entry.Bind(wx.EVT_KEY_UP, functools.partial(self.Handle, ob=self.entry)) 
     self.entry2.Bind(wx.EVT_KEY_UP, functools.partial(self.Handle, ob=self.entry2)) 

    def Handle(self, event, ob=None): 
      print ob 

Et ob sera soit entry ou entry2 selon le panneau est cliqué. Mais, bien sûr, cela ne devrait pas être nécessaire, et GetId et GetEventObject() devraient fonctionner tous les deux - même si je n'ai pas (encore) de Mac pour les essayer.

+1

événement.GetEventObject(). GetId() a bien fonctionné, merci. Bonne idée aussi avec functools.partial! –

Questions connexes