2016-08-02 5 views
0

Ich lese mehrere wxPython Bücher und bin jetzt ziemlich vertraut mit der Bindung einer Schaltfläche mit einem Ereignis. Wie in einem __init__ Methode des wx.Frame, schrieb ich:Ereignis an wx.button directy mit wx.EVT_BUTTON binden?

self.btn = wx.Button(self, 2, "click me") 
self.btn.bind(wx.EVT_BUTTON, self.onclick) 

wo onclick etwas tun müssen, wenn die Schaltfläche geklickt wird.

Vor kurzem lese ich jemandes WxPython Code und kommen über den folgenden Code:

wx.Button(self, 2, "click me") 
wx.EVT_BUTTON(self, 2, self.onclick) 

Der Verfasser der obigen Art und Weise verwenden Methode zu binden für jede Taste. Somit habe ich zwei Fragen:

  1. Der wx.Button wird instanziiert, indem er nicht an irgendeine Variable gebunden ist. Bedeutet das, dass Müll gesammelt wird?
  2. Ich kann kein Dokument über den Aufruf von wx.EVT_BUTTON direkt finden. Was schafft es eigentlich? Was ist der Unterschied zwischen der Verwendung der bind() Funktion?
+1

Das ist eine sehr alte Syntax. Vor einigen Jahren war es der einzige Weg, und ich denke, es funktioniert immer noch. Aber jetzt wird empfohlen, die neue Syntax zu verwenden, die Sie im ersten Beispiel gezeigt haben. –

+0

Vergessen wir nicht 'self.Bind (wx.EVT_BUTTON, self.btn, self.onclick)' https://wiki.wxpython.org/self.Bind%20vs.%20self.button.Bind –

Antwort

1

Paul Kommentar ist richtig, aber hier sind einige weitere Informationen:

zu beantworten # 1, nein, es wird nicht Müll gesammelt werden. Das übergeordnete Fenster besitzt den C++ - Teil des Schaltflächenobjekts, der wiederum einen Verweis auf den Python-Teil des Schaltflächenobjekts enthält. Daher wird das Python-Objekt so lange bestehen bleiben, wie das C++ - Objekt tut.

Für # 2: Es gibt sehr wenig Unterschied. Vor vielen Jahren waren die wx.EVT_* Elemente in WX gewöhnliche Funktionen. Jetzt sind sie Instanzen der wx.PyEventBinder Klasse, die eine __call__ Methode haben, um Kompatibilität mit den alten Funktionen zu gewährleisten. Aber wie Paul erwähnte, wird die Verwendung der Binder-Instanzen mit der Bind-Methode aus der wx.Window-Klasse bevorzugt, da sie eher pythonisch ist und den Code ein wenig selbst-erklärender macht.