Seite 1 von 1

Mehrere Buttons unterscheiden

Verfasst: Mittwoch 2. Mai 2007, 20:56
von samy-delux
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

Re: Mehrere Buttons unterscheiden

Verfasst: Mittwoch 2. Mai 2007, 21:30
von gerold
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
:-)

Verfasst: Freitag 4. Mai 2007, 17:09
von samy-delux
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...

Verfasst: Freitag 4. Mai 2007, 18:11
von samy-delux
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