Seite 1 von 1

Menü: add_command - command Eigenschaft mit Parameter?

Verfasst: Freitag 12. Mai 2006, 07:18
von line5
Hallo!

Ich hoffe ihr könnt mir helfen!

Ich möchte jedem einzelnen Menü Command ein und dieselbe Funktion zu ordnen, jedoch immer einen unterschiedlichen Parameter zu übergehen!

Menü wird erstellt:

Code: Alles auswählen

def editabc(i):
    tkMessageBox.showinfo('', i)
    

# Popup Menue gestalten
popup = Menu(root,tearoff=0)

#Popup Menue an X, Y oeffnen(eventausloeser)
def popupMenu(event):
    popup.post(event.x_root, event.y_root)
    x = labels_ident[event.widget]
    #tkMessageBox.showinfo('', x)

#Popup Menue Eintrage erstellen 1-10 ohne 10!
for i in range(1, 10):
    popup.add_command(label=i, command = editabc(i) )

So habe ich mir das Gedacht, jedoch wird editabc(i) beim Starten des Programms aufgerufen, aber dann auch nicht mehr. Auch nicht, wenn ich auf die einzelnen Menüeintrage aufrufe!

Genau andersrum soll es sein ;) Beim Starten des Programm soll eben nichts ausgeführt werden, sondern nur dann, wenn die Einträge geklickt werden!

Ich hoffe ihr könnt mir helfen!
Danke

Verfasst: Freitag 12. Mai 2006, 07:48
von Mawilo
Hallo,

ich würde eine lambda-Funktion definieren.

Code: Alles auswählen

for i in range(1, 10):
    popup.add_command(label=i, command = lambda:editabc(i) )
Dann sollte es funktionieren.

Stephan

Re: Menü: add_command - command Eigenschaft mit Parameter?

Verfasst: Freitag 12. Mai 2006, 08:49
von Michael Schneider
line5 hat geschrieben: Ich möchte jedem einzelnen Menü Command ein und dieselbe Funktion zu ordnen, jedoch immer einen unterschiedlichen Parameter zu übergehen!
Hallo Line,

das ist ein Standardproblem (Problem=Aufgabe), das im Prinzip ganz einfach gelöst wird: Du nutzt die Eigenschaft der Optionen, dass ihre Initialwerte während des ersten Durchlaufes gesetzt werden. Dazu brauchst Du die Definition von editabc nur in die Erzeugerschleife verlegen und die Schleifenvariable als Vorgabewert einzusetzen:

Code: Alles auswählen

#Popup Menue Eintrage erstellen 1-10 ohne 10!
for i in range(1, 10):
    def editabc(i = i):
        tkMessageBox.showinfo('', i)
    popup.add_command(label=i, command = editabc )
Praktisch erzeugst Du nacheinander 9 Funktionen mit unterschiedlichen Initialwerten. Das sieht etwas seltsam aus, das erste i ist das neue locale Attribut und das Zweite repräsentiert den Wert von i. Außerdem musste '(i)' bei der Command-Ressource weg, schließlich wollen wir die Referenz übergeben und die Funktion noch nicht ausführen.

Die Verwendung von Lambda ist nicht verkehrt, solange die Funktion so einfach bleibt.