Parameterübergabe bei wx.Bind()

Plattformunabhängige GUIs mit wxWidgets.
Antworten
alan
User
Beiträge: 81
Registriert: Dienstag 10. April 2007, 11:30

Dienstag 18. September 2007, 16:19

Hallo

Ich habe eine Reihe von Buttons, deren einzige Aufgabe es ist, einen konstanten Zahlenwert zu übergeben.

Momentan würde ich das so lösen:

Code: Alles auswählen

self.Bind(wx.EVT_BUTTON, self.OnButton0, button0)
self.Bind(wx.EVT_BUTTON, self.OnButton1, button1)
self.Bind(wx.EVT_BUTTON, self.OnButton2, button2)
Wobei dann die "OnButton"s so aussähen:

Code: Alles auswählen

def OnButton0(self, event):
    self.value = 0
def OnButton1(self, event):
    self.value = 1
def OnButton2(self, event):
    self.value = 2
Ist natürlich nicht sehr elegant und ziemlich schreibaufwendig und ich würde das gerne abkürzen. Gibt es eine Möglichkeit, bei self.Bind der Funktion, die das Event behandeln soll, auch noch einen weiteren Parameter (z.B. value) zu übergeben?
BlackJack

Dienstag 18. September 2007, 17:57

Eine Möglichkeit (ungetestet):

Code: Alles auswählen

from functools import partial

    # ...
        self.Bind(wx.EVT_BUTTON, partial(self.OnButtonX, value=0), button0)
        self.Bind(wx.EVT_BUTTON, partial(self.OnButtonX, value=1), button1)
        self.Bind(wx.EVT_BUTTON, partial(self.OnButtonX, value=2), button2)
        # ...
    
    def OnButtonX(self, event, value):
        self.value = value
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Dienstag 18. September 2007, 18:22

Oh wie nett. Schickes Ding, Blackjack.

Ich wollte eigentlich "ClientData" vorschlagen, aber das funktioniert nicht bei Buttons, kann das sein??
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Dienstag 18. September 2007, 19:14

partial ist wohl auch Python 2.5?
Warum nicht einfach mit lambda:

Code: Alles auswählen

self.Bind(wx.EVT_BUTTON, lambda x=0: self.value = x, button0)
MfG
HWK
alan
User
Beiträge: 81
Registriert: Dienstag 10. April 2007, 11:30

Dienstag 18. September 2007, 19:30

Thx BlackJack, das schaut so aus, als wärs genau das was ich brache.

@HWK
Das ist sicher auch nicht schlecht, aber mit BlackJacks Vorschlag kann man halt auch noch mehr Anweisungen unterbringen. Und ich hab gerade gemerkt, dass ich das doch brauche :)
Antworten