2009-10-08 12 views
8

Ich mache ein einfaches kleines Dienstprogramm, während ich Python lerne. Es erzeugt dynamisch eine Liste von Tasten:Bestimmen Sie, welche Taste in Tkinter gedrückt wurde?

for method in methods: 
    button = Button(self.methodFrame, text=method, command=self.populateMethod) 
    button.pack({'fill': 'x', 'expand': 1, 'padx': 5, 'pady': 3}) 

Dieser Teil funktioniert gut. Ich muss jedoch wissen, welche der Tasten in gedrückt wurde. Irgendwelche Ratschläge, wie ich das erzählen könnte?

Antwort

15

Sie können Lambda verwenden, um Argumente an einen Befehl übergeben:

def populateMethod(self, method): 
    print "method:", method 

for method in ["one","two","three"]: 
    button = Button(self.methodFrame, text=method, 
     command=lambda m=method: self.populateMethod(m)) 
    button.pack({'fill': 'x', 'expand': 1, 'padx': 5, 'pady': 3}) 
1

Es scheint, dass die Befehlsmethode kein Ereignisobjekt übergeben wurde.

Ich denke an zwei Workarounds können:

  • Gesellschafter eine eindeutige Rückruf jeder Taste

  • Anruf button.bind('<Button-1>', self.populateMethod) statt self.populateMethod als command übergeben. self.populateMethod muss dann ein zweites Argument akzeptieren, das ein Ereignisobjekt sein wird.

    Angenommen, dieses zweite Argument heißt event, event.widget ist ein Verweis auf die Schaltfläche, die angeklickt wurde.

+0

habe ich die zweite Methode, und es scheint zu tun, was ich will. Vielen Dank! – Sydius

+0

Wenn Sie 'bind' verwenden, anstatt das integrierte Attribut' command' zu nutzen, können Sie Tkinter nicht mehr verwenden, um mit der Tastatur zu navigieren und auf Schaltflächen zu klicken. Natürlich können Sie eine Reihe von Bindungen anwenden, um alle Sonderfälle zu behandeln, aber es ist einfacher, nur das Attribut 'command' zu verwenden. –

+0

@BryanOakley: tatsächlich; Ihr Vorschlag, Lambda zu verwenden, ist viel sauberer. –