j'utilise tkinter et je veux créer une interface avec de nombreux boutons. Chaque bouton ayant pour commande la meme fonction appelée avec un attribut différent (le bouton 1 appelle la fonction verif(1), le bouton 2 la fonction verif
je veux écrire une fonction qui crée ces boutons dans la fenetre (sans command, ça , ça marche) et qui attribue à chaque bouton sa fonction verif1, verif2 ...et
Tout ce que j'ai essayé, attribue la fonction à tous les boutons avec le dernier attribut donné !!!
Y a-t-il une solution, ou doit-je créer les boutons 1 par 1
j'utilise tkinter et je veux créer une interface avec de nombreux boutons. Chaque bouton ayant pour commande la meme fonction appelée avec un attribut différent (le bouton 1 appelle la fonction verif(1), le bouton 2 la fonction verif 2 je veux écrire une fonction qui crée ces boutons dans la fenetre (sans command, ça , ça marche) et qui attribue à chaque bouton sa fonction verif1, verif2 ...etc Tout ce que j'ai essayé, attribue la fonction à tous les boutons avec le dernier attribut donné !!!! Y a-t-il une solution, ou doit-je créer les boutons 1 par 1 ?
merci
Question classique, il aurait fallu mettre la solution dans le guide Tkinter (ou, encore mieux, avoir une syntaxe plus souple permettant de passer des paramètres quand on crée le bouton)
Les boutons sont créés par : Button(root,text="mon texte",command = test)
Quand on clique sur le bouton, la valeur de command est appelée sans argument
L'astuce consiste à affecter à command non pas une fonction, mais une classe qui a comme attribut l'argument propre au bouton. Quand on "appelle" une instance d'une classe on invoque la méthode __call__ de la classe
Ce sera plus clair sur un exemple :
from Tkinter import *
class Callback:
def __init__(self,function,argument): self.function = function self.argument = argument
def __call__(self): self.function(self.argument)
def show(arg): print "Je suis le bouton %s" %arg
root = Tk() for x in range(10): Button(root,text='Bouton %s' %x,commandÊllback(show,x)).pack() root.mainloop()
Je reconnais que ça fait un peu bidouille !
A+ Pierre
j'utilise tkinter et je veux créer une interface avec de nombreux boutons. Chaque bouton ayant pour commande la meme fonction appelée avec un attribut différent (le bouton 1 appelle la fonction verif(1), le bouton 2 la fonction verif 2
je veux écrire une fonction qui crée ces boutons dans la fenetre (sans command, ça , ça marche) et qui attribue à chaque bouton sa fonction verif1, verif2 ...etc
Tout ce que j'ai essayé, attribue la fonction à tous les boutons avec le dernier attribut donné !!!!
Y a-t-il une solution, ou doit-je créer les boutons 1 par 1 ?
merci
Question classique, il aurait fallu mettre la solution dans le guide
Tkinter (ou, encore mieux, avoir une syntaxe plus souple permettant de
passer des paramètres quand on crée le bouton)
Les boutons sont créés par :
Button(root,text="mon texte",command = test)
Quand on clique sur le bouton, la valeur de command est appelée sans
argument
L'astuce consiste à affecter à command non pas une fonction, mais une
classe qui a comme attribut l'argument propre au bouton. Quand on
"appelle" une instance d'une classe on invoque la méthode __call__ de la
classe
Ce sera plus clair sur un exemple :
from Tkinter import *
class Callback:
def __init__(self,function,argument):
self.function = function
self.argument = argument
def __call__(self):
self.function(self.argument)
def show(arg):
print "Je suis le bouton %s" %arg
root = Tk()
for x in range(10):
Button(root,text='Bouton %s' %x,commandÊllback(show,x)).pack()
root.mainloop()
j'utilise tkinter et je veux créer une interface avec de nombreux boutons. Chaque bouton ayant pour commande la meme fonction appelée avec un attribut différent (le bouton 1 appelle la fonction verif(1), le bouton 2 la fonction verif 2 je veux écrire une fonction qui crée ces boutons dans la fenetre (sans command, ça , ça marche) et qui attribue à chaque bouton sa fonction verif1, verif2 ...etc Tout ce que j'ai essayé, attribue la fonction à tous les boutons avec le dernier attribut donné !!!! Y a-t-il une solution, ou doit-je créer les boutons 1 par 1 ?
merci
Question classique, il aurait fallu mettre la solution dans le guide Tkinter (ou, encore mieux, avoir une syntaxe plus souple permettant de passer des paramètres quand on crée le bouton)
Les boutons sont créés par : Button(root,text="mon texte",command = test)
Quand on clique sur le bouton, la valeur de command est appelée sans argument
L'astuce consiste à affecter à command non pas une fonction, mais une classe qui a comme attribut l'argument propre au bouton. Quand on "appelle" une instance d'une classe on invoque la méthode __call__ de la classe
Ce sera plus clair sur un exemple :
from Tkinter import *
class Callback:
def __init__(self,function,argument): self.function = function self.argument = argument
def __call__(self): self.function(self.argument)
def show(arg): print "Je suis le bouton %s" %arg
root = Tk() for x in range(10): Button(root,text='Bouton %s' %x,commandÊllback(show,x)).pack() root.mainloop()
Je reconnais que ça fait un peu bidouille !
A+ Pierre
Christophe Delord
Bonjour,
On Fri, 23 Dec 2005 08:41:20 +0100, Pierre Quentel wrote: