Frage

Ich habe ein paar Probleme mit einer Platte, die zwei WxPython TextCtrls in ihm hat. Ich möchte entweder ein EVT_CHAR oder EVT_KEY_UP Handler für beide Steuerelemente gebunden, und ich möchte in der Lage zu sagen, welche TextCtrl das Ereignis generiert hat. Ich würde denken, dass event.Id mir das sagen würde, aber in der folgenden Beispielcode, es ist immer 0. Irgendwelche Gedanken? Ich habe nur getestet dies auf O X.

Dieser Code prüft einfach, dass beiden TextCtrls in ihnen einen Text haben, bevor die Schaltfläche Fertig ermöglicht

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()
War es hilfreich?

Lösung

Sie könnten versuchen event.GetId() oder event.GetEventObject() und sehen, ob einer von ihnen arbeiten.

Ein weiterer Ansatz dazu ist Lambda oder functools.partial zu verwenden, um effektiv einen Parameter an die Prozedur übergeben. So zum Beispiel Unter in den folgenden Zeilen in Ihr Programm:

        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

Und dann wird ob entweder entry oder entry2 je nachdem, welche Panel geklickt wird. Aber natürlich sollte dies nicht notwendig sein, und GetId und GetEventObject () sollten beide arbeiten -. Obwohl ich (noch) nicht haben ein Mac diese anprobieren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top