2008-10-06 12 views
25

Ich habe anderswo keine Antwort gefunden, und das scheint SO noch nicht gestellt worden zu sein.Können Argumente in Ereignisbindungen übergeben werden?

Beim Erstellen einer Ereignisbindung in WxPython ist es möglich, zusätzliche Argumente an das Ereignis zu übergeben? Zum Beispiel ist dies der normale Weg:

b = wx.Button(self, 10, "Default Button", (20, 20)) 
     self.Bind(wx.EVT_BUTTON, self.OnClick, b) 
def OnClick(self, event): 
     self.log.write("Click! (%d)\n" % event.GetId()) 

Aber ist es möglich, ein anderes Argument an die Methode übergeben zu haben? So dass die Methode feststellen kann, ob mehr als ein Widget es aufruft, aber immer noch den gleichen Wert zurückgibt?

Es würde stark reduzieren Kopie & einfügen den gleichen Code, aber mit anderen Anrufern.

Antwort

42

Sie können immer ein Lambda oder eine andere Funktion verwenden, um Ihre Methode zu beenden und ein anderes Argument zu übergeben, nicht WX-spezifisch.

b = wx.Button(self, 10, "Default Button", (20, 20)) 
     self.Bind(wx.EVT_BUTTON, lambda event: self.OnClick(event, 'somevalue'), b) 
def OnClick(self, event, somearg): 
     self.log.write("Click! (%d)\n" % event.GetId()) 

Wenn Sie unterwegs sind, die Menge an Code zu reduzieren, zu geben versuchen Sie vielleicht auch ein wenig Automatismus wie:

class foo(whateverwxobject): 
    def better_bind(self, type, instance, handler, *args, **kwargs): 
     self.Bind(type, lambda event: handler(event, *args, **kwargs), instance) 

    def __init__(self): 
     self.better_bind(wx.EVT_BUTTON, b, self.OnClick, 'somevalue') 
+0

Große Antwort. Vielen Dank! –

11

die schönste Art, einen Generator von Event-Handler zu machen wäre, zB:

def getOnClick(self, additionalArgument): 
    def OnClick(self, event): 
     self.log.write("Click! (%d), arg: %s\n" 
         % (event.GetId(), additionalArgument)) 
    return OnClick 

Jetzt binden Sie es mit:

b = wx.Button(self, 10, "Default Button", (20, 20)) 
b.Bind(wx.EVT_BUTTON, self.getOnClick('my additional data'))