Menü: add_command - command Eigenschaft mit Parameter?

Fragen zu Tkinter.
Antworten
line5
User
Beiträge: 4
Registriert: Montag 5. Dezember 2005, 18:11

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
Benutzeravatar
Mawilo
User
Beiträge: 452
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

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
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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.
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten