Utiliser le même gestionnaire pour plusieurs wx.TextCtrls?
Question
Je rencontre un problème avec un panneau qui contient deux wxPython TextCtrls. Je veux un gestionnaire EVT_CHAR ou EVT_KEY_UP lié aux deux contrôles et je veux pouvoir savoir quel TextCtrl a généré l'événement. Je penserais que cet événement.Id me dirait cela, mais dans l'exemple de code suivant, il est toujours 0. Des pensées? Je ne l'ai testé que sur OS X.
Ce code vérifie simplement que les deux TextCtrls ont du texte 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()
La solution
Vous pouvez essayer event.GetId ()
ou event.GetEventObject ()
et voir si l'un de ces travaux fonctionne.
Une autre approche consiste à utiliser lambda ou functools.partial pour transmettre 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
Ensuite, ob sera entrée
ou entrée2
en fonction du panneau sur lequel l'utilisateur a cliqué. Bien sûr, cela ne devrait pas être nécessaire, et GetId et GetEventObject () devraient tous les deux fonctionner, même si je n’ai pas (encore) de Mac pour les essayer.