2009-10-08 16 views
8

Tworzę proste małe narzędzie podczas nauki Pythona. Dynamicznie generuje listę przycisków:Ustal, który przycisk został naciśnięty w aplikacji Tkinter?

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

Ta część działa poprawnie. Jednak muszę wiedzieć, który z przycisków został wciśnięty wewnątrz self.populateMethod. Jakieś rady na temat tego, co mogę powiedzieć?

Odpowiedz

15

można wykorzystywać lambda, aby przekazywać argumenty do polecenia:

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

Wygląda na to, że metoda polecenia nie jest przekazywana do żadnego obiektu zdarzenia.

mogę myśleć dwa obejścia:

  • skojarzyć wyjątkowy oddzwonienia do każdego przycisku

  • połączeń button.bind('<Button-1>', self.populateMethod) zamiast przechodzenia self.populateMethod jak command. self.populateMethod musi następnie zaakceptować drugi argument, który będzie obiektem zdarzenia.

    Przyjmując, że ten drugi argument nazywa się event, event.widget jest odniesieniem do klikniętego przycisku.

+0

Zrobiłem drugą metodę i wydaje się, aby robić to, co chcę. Dzięki! – Sydius

+0

Jeśli użyjesz 'bind' zamiast korzystać z wbudowanego atrybutu' command', stracisz możliwość korzystania z wbudowanej funkcji Tkintera do nawigowania i klikania przycisków za pomocą klawiatury. Oczywiście można zastosować kilka wiązań, aby obsłużyć wszystkie specjalne przypadki, ale łatwiej jest użyć atrybutu 'command'. –

+0

@BryanOakley: istotnie; Twoja sugestia używania lambdas jest znacznie czystsza. –

Powiązane problemy