Mehrere Buttons unterscheiden

Plattformunabhängige GUIs mit wxWidgets.
Antworten
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Mittwoch 2. Mai 2007, 20:56

Hey Leute,

Ich habe eine wxPython Applikation. In dieser werden mehrere Werte (Staedte) aus einer Datenbank ausgelesen und untereinander dargestellt.
Ich will fuer jede Stadt die Moeglichkeit schaffen, noch eine Dialog zu oeffnen in den mehr Informationen aus der Datenbank angezeit werden...

Ich dachte mir das geht am besten mit einem Button neben jeder Stadt, doch ich will ja dass jeder Button die gleich Funktion aufruft, ihr jedoch den Namen der Stadt als Parameter mituebergibt...
Wie kann ich das machen??

so long,
Samy
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 2. Mai 2007, 21:30

samy-delux hat geschrieben:doch ich will ja dass jeder Button die gleich Funktion aufruft, ihr jedoch den Namen der Stadt als Parameter mituebergibt...
Hi Samy!

Es gibt mehrere Möglichkeiten. Eine davon ist ``lambda``:

Code: Alles auswählen

button.Bind(wx.EVT_BUTTON, lambda event: self.my_eventhandler(event, "Name der Stadt"))

...

def my_eventhandler(self, event, town_name):
    print "Name der Stadt:", town_name
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Freitag 4. Mai 2007, 17:09

Das mit dem lambda haette schon fast geklappt. Das Problem ist jedoch die die Ausgabe wird in einer for-Schleife erstellt, so wie auch die Buttons. Es werden mehrere Zeilen untereinander ausgegeben, mit jeweils einem Button pro Zeile.

Wenn ich jetzt will, dass der Button die Zeile an die Funktion uebergibt in der er steht, klappt dies nicht, da die Zeilennummer ja hochgezaehlt wird und da der Button ja den Wert der Zeilenvariable erst dann aussliest, wenn er geklickt wird, liefert jeder Button z.B. '5" an die Funktion die ausgefuehrt werden soll.

Leider faellt mir im Moment nichts ein um dies zu umgehen...
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Freitag 4. Mai 2007, 18:11

Ok, das Problem hat sich erledigt.
Konnte es selbst loesen, indem ich jedem Button eine hochgezaehlte Id gegeben habe, und diese dann ueber das uebergebene event wieder ermittele!

Mein Code, bereinigt von den Sachen die zum Rest des Programms gehoeren:

Code: Alles auswählen

    def ShowResult(self):
        num = 0
        for connection in connections:
            self.resultwidgets.append( wx.Button(self, num, 'Karte', (450, 100)) )
            self.resultwidgets[-1].Bind(wx.EVT_BUTTON, self.ShowMap)
            num += 1

    def ShowMap(self, event):
        button = event.GetEventObject()
        conid = button.GetId()
so long,
Samy
Antworten