Boutons

Résolu/Fermé
titi - 18 avril 2017 à 13:44
 titi - 19 avril 2017 à 23:45
Bonjour,
j'ai essayé de faire l'exercice 8.7 du livre de Swinnen
"Apprendre à programmer avec python 3"
je ne comprend pas pourquoi les boutons que j'ai créé sur Python 3.6 ne fonctionnent pas correctement : les cercles ne devraient apparaître que lorsque j'appuie sur les boutons, et pas avant. De plus, le fait d’appuyer sur les boutons ne fait rien. J’ai essayé 3 méthode pour faire les boutons, mais rien n’y fait.
Pouvez-vous m’aider ?


#anneaux olympiques
from tkinter import *

# --- définition des fonctions gestionnaires d'événements : ---
def drawcircle(x1,y1,x2,y2,coul):
"Tracé d'un cercle dans le canevas can1"
can1.create_oval(x1,y1,x2,y2,width=19,outline=coul)

# Création du widget principal ("maître") :
fen1 = Tk()

# création des widgets "esclaves" :
can1 = Canvas(fen1,bg='white',height=620,width=1300)
can1.pack(side=TOP)

bou1 = Button(fen1,text='Quitter',command=fen1.quit)
bou1.pack(side=RIGHT)

Button(fen1,text='Premier',command=drawcircle(10,10,410,410,'blue')).pack(side=LEFT)#ce bouton ne marche pas

bou3 = Button(fen1,text='Deuxieme',command=can1.create_oval(230,210,630,610,width=19,outline='yellow'))
bou3.pack(side=LEFT)#ce bouton ne marche pas

bou4 = Button(fen1,text='Troisieme',command=drawcircle(450,10,850,410,'black'))
bou4.pack(side=LEFT)#ce bouton ne marche pas

drawcircle(670,210,1070,610,'green')

drawcircle(890,10,1290,410,'red')


fen1.mainloop() # démarrage du réceptionnaire d’événements

fen1.destroy() # destruction (fermeture) de la fenêtre

1 réponse

Problème basique et récurrent liés aux boutons tkinter.

Il faut soit utiliser lambda, je te suggère de rechercher sur le web pour en comprendre l'utilisation et le fonctionnement.
Soit utiliser des fonctions personnalisées à passer en paramètre de command, car command doit contenir le nom d'une fonction et non son appel.

Avec lambda donc :

Button(fen1,text='Premier',command=lambda d=drawcircle: d(10,10,410,410,'blue')).pack(side=LEFT)#ce bouton ne marche pas

bou3 = Button(fen1,text='Deuxieme',command=lambda can1=can1: can1.create_oval(230,210,630,610,width=19,outline='yellow'))
bou3.pack(side=LEFT)#ce bouton ne marche pas

bou4 = Button(fen1,text='Troisieme',command=lambda d=drawcircle: d(450,10,850,410,'black'))
bou4.pack(side=LEFT)#ce bouton ne marche pas
1
Super, j'ai essayé les deux méthodes et ça marche. Merci beaucoup gudu
0