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()
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top