OVH Cloud OVH Cloud

une fonction pour creer des fonction ???

2 réponses
Avatar
oliv
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

merc

--
oliv

-----------------------------------------------------------------------
Voir theme: http://www.frbox.net/viewtopic-518350.htm

Envoyé de http://www.frbox.ne

2 réponses

Avatar
Pierre Quentel
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

Avatar
Christophe Delord
Bonjour,

On Fri, 23 Dec 2005 08:41:20 +0100, Pierre Quentel wrote:


Button(root,text='Bouton %s' %x,commandÊllback(show,x)).pack

Je reconnais que ça fait un peu bidouille !


L'utilisation de fonctions anonymes simplifie les choses :

for x in range(10):
Button(root,text='Bouton %s' %x,command=lambda x=x:show(x)).pack

Le paramètre command est bien une fonction sans argument qui appelle
show(x).

Le paramètre x=x permet simplement d'utiliser un objet x local au lieu
d'un même objet x global qui serait commun à plusieurs boutons.