2009-10-08 6 views
8

Je fais un petit utilitaire simple en apprenant Python. Il génère dynamiquement une liste de boutons:Déterminez quel bouton a été enfoncé dans Tkinter?

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

Cette partie fonctionne très bien. Cependant, j'ai besoin de savoir lequel des boutons a été enfoncé à l'intérieur self.populateMethod. Un conseil sur comment je pourrais être capable de dire?

Répondre

15

Vous pouvez utiliser lambda pour passer des arguments à une commande:

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

Il semble que la méthode de commande ne passe aucun objet événement.

je peux penser à deux solutions de contournement:

  • associé un rappel unique à chaque bouton

  • appel button.bind('<Button-1>', self.populateMethod) au lieu de passer self.populateMethod comme command. self.populateMethod doit alors accepter un second argument qui sera un objet événement.

    En supposant que ce deuxième argument est appelé event, event.widget est une référence au bouton sur lequel vous avez cliqué.

+0

J'ai fait la deuxième méthode et il semble faire ce que je veux. Merci! – Sydius

+0

Si vous utilisez 'bind' au lieu de tirer parti de l'attribut' command' intégré, vous perdez la possibilité d'utiliser la capacité intégrée de Tkinter pour naviguer et cliquer sur les boutons avec le clavier. Bien sûr, vous pouvez appliquer un tas de liaisons pour gérer tous les cas spéciaux, mais il est plus facile d'utiliser simplement l'attribut 'command'. –

+0

@BryanOakley: en effet; votre suggestion d'utiliser lambdas est beaucoup plus propre. –

Questions connexes