#1 Le 27/06/2016, à 09:05
- totola
Python: fonction, argument et attribute error
Bonjour,
j'ai un petit problème dans l'écriture d'une petite fonction plutôt simple, enfin plutôt dans la réécriture, je m'explique, le code suivant fonctionne très bien:
def Ecouter():
if ve[1].get() == 1:
self.caskp1=self.canvas_image[1].create_image(2,2, image=cask, anchor='nw')
else:
self.canvas_image[1].delete(self.caskp1)
buttonE1 = Tkinter.Checkbutton(self.canvasp[1],image=self.caskN, variable = ve[1],command=Ecouter(),indicatoron=0)
Lorsque je coche le bouton l'image s'affiche bien dans le canvas et s'efface bien lorsque je décoche le bouton.
Maintenant je veux réécrire cette fonction en passant un argument (qui correspond au numéro d'un canvas différent):
def Ecouter(num_poste):
if ve[num_poste].get() == 1:
self.caskp1=self.canvas_image[num_poste].create_image(2,2, image=cask, anchor='nw')
else:
self.canvas_image[num_poste].delete(self.caskp1)
buttonE1 = Tkinter.Checkbutton(self.canvasp[1],image=self.caskN, variable = ve[1],command=Ecouter(1),indicatoron=0)
mais j'obtiens l'erreur suivante si je lance Ecouter(1) en cliquant sur le bouton:
line 1110, in Ecouter
self.canvas_image[num_poste].delete(self.caskp1)
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1902, in __getattr__
return getattr(self.tk, attr)
AttributeError: caskp1
pourtant je ne vois pas la différence avec avant, pour moi il n'y a pas de différence, mais comme ça ne marche pas je soupçonne qu'il y a un truc que je n'ai pas compris :s
Merci de m'éclairer
Dernière modification par totola (Le 27/06/2016, à 09:07)
Hors ligne
#2 Le 27/06/2016, à 09:34
- pingouinux
Re : Python: fonction, argument et attribute error
Bonjour,
Je pense que l'appel correct dans le premier cas est :
buttonE1 = Tkinter.Checkbutton(self.canvasp[1],image=self.caskN, variable = ve[1],command=Ecouter,indicatoron=0)
Pour le second, tu peux essayer ceci :
buttonE1 = Tkinter.Checkbutton(self.canvasp[1],image=self.caskN, variable = ve[1],command=lambda:Ecouter(1),indicatoron=0)
Hors ligne
#3 Le 27/06/2016, à 09:37
- totola
Re : Python: fonction, argument et attribute error
Ah oui merci pingouinux ça marche bien comme ça!
En deux mots tu saurais me dire pourquoi?
Merci encore
Dernière modification par totola (Le 27/06/2016, à 09:37)
Hors ligne
#4 Le 27/06/2016, à 09:41
- pingouinux
Re : Python: fonction, argument et attribute error
Il faut transmettre une fonction au paramètre command, et non le résultat d'une fonction.
lambda:Ecouter(1) est une fonction sans argument qui retourne le résultat de Ecouter(1).
Hors ligne
#5 Le 27/06/2016, à 09:54
- totola
Re : Python: fonction, argument et attribute error
Ah ok, merci je comprends en effet.
Par contre autre petit problème, j'essaie d'automatiser les créations des boutons, j'en ai une vingtaine à faire, je sais c'est pas la mort à faire à la main mais bon j'aimerais y arriver avec une boucle:
buttonE=[None]
i=1
while(i<3):
buttonE.append(Tkinter.Checkbutton(self.canvasp[i],image=self.caskN, variable = ve[i],command=lambda:Ecouter(i),indicatoron=0))
buttonE[i].place(x=0,y=2)
i=i+1
Pour l'instant j'en crée deux ils se placent bien au bon endroit dans leur canvas respectif mais la commande ne marche pas.. Aucun message d'erreur le bouton s'enfonce mais ne produit rien?
Alors que le code fonctionne bien en écrivant le bouton comme ceci:
buttonE1 = Tkinter.Checkbutton(self.canvasp[1],image=self.caskN, variable = ve[1],command=lambda:Ecouter(1),indicatoron=0)
buttonE1.place(x=0,y=2)
C'est moi qui n'ai pas les yeux en face des trous ou il y a encore quelque chose que je n'ai pas compris??
Merci
Dernière modification par totola (Le 27/06/2016, à 09:55)
Hors ligne
#6 Le 27/06/2016, à 11:19
- pingouinux
Re : Python: fonction, argument et attribute error
Ce qui me paraît bizarre (j'aurais dû le voir avant), c'est que tu appelles la fonction Ecouter avec un argument, alors qu'il n'y en a pas dans la définition de cette fonction (en #1).
Hors ligne
#7 Le 27/06/2016, à 11:43
- totola
Re : Python: fonction, argument et attribute error
Ce qui me paraît bizarre (j'aurais dû le voir avant), c'est que tu appelles la fonction Ecouter avec un argument, alors qu'il n'y en a pas dans la définition de cette fonction (en #1).
Hum.. Je ne vois pas ce que tu veux dire?
Dans le #1 je me suis trompé j'ai mis Ecouter() au lieu de Ecouter comme tu l'as remarqué dans le #2 sinon je ne vois pas..
Il me semble avoir défini la fonction Ecouter(num_poste)
Dernière modification par totola (Le 27/06/2016, à 11:44)
Hors ligne
#8 Le 27/06/2016, à 11:53
- totola
Re : Python: fonction, argument et attribute error
Je remets tout mon code qui ne fonctionne pas:
def Ecouter(num_poste):
if ve[num_poste].get() == 1:
self.caskp1=self.canvas_image[num_poste].create_image(2,2, image=cask, anchor='nw')
else:
self.canvas_image[num_poste].delete(self.caskp1)
buttonE=[None]
i=1
while(i<3):
buttonE.append(Tkinter.Checkbutton(self.canvasp[i],image=self.caskN, variable = ve[i],command=lambda:Ecouter(i),indicatoron=0))
buttonE[i].place(x=0,y=2)
i=i+1
Hors ligne
#9 Le 27/06/2016, à 12:06
- totola
Re : Python: fonction, argument et attribute error
Hum.. il y a quelque chose que je ne comprends pas: si je remplace command=lambda:Ecouter(i) par n'importe quoi ça fait la même chose..
La commande ne semble pas prise en compte?
buttonE=[None]
i=1
while(i<3):
buttonE.append(Tkinter.Checkbutton(self.canvasp[i],image=self.caskN, variable = ve[i], command=lambda:NIMPORTEQUOI ,indicatoron=0))
buttonE[i].place(x=0,y=2)
i=i+1
Pourtant les boutons sont bien créés avec les bonnes images au bon endroit dans leur canvas respectif..
Dernière modification par totola (Le 27/06/2016, à 12:07)
Hors ligne
#10 Le 27/06/2016, à 12:10
- pingouinux
Re : Python: fonction, argument et attribute error
Je me suis planté, je regardais la première définition de Ecouter en #1.
Est-ce volontairement que tu donnes les mêmes coordonnées pour tous les boutons ?
buttonE[i].place(x=0,y=2)
Hors ligne
#11 Le 27/06/2016, à 12:10
- totola
Re : Python: fonction, argument et attribute error
ah ok.
Oui oui, ils ne sont pas dans les mêmes canvas c'est pour ça
Hors ligne
#12 Le 27/06/2016, à 13:58
- totola
Re : Python: fonction, argument et attribute error
Hum le problème vient de la variable i
si je mets while(i<3)
Ecouter(i)
Il me lance Ecouter(3) quelque soit la situation
Hors ligne
#13 Le 27/06/2016, à 18:01
- pingouinux
Re : Python: fonction, argument et attribute error
Il faudrait montrer un script permettant de faire des tests.
Hors ligne
#14 Le 27/06/2016, à 18:54
- totola
Re : Python: fonction, argument et attribute error
Humm.. Il n'y aurait pas ma solution ici:
http://stackoverflow.com/questions/1622 … -in-python
Mais je ne suis pas assez bon en anglais et en programmation pour bien comprendre
Hors ligne
#15 Le 27/06/2016, à 22:18
- totola
Re : Python: fonction, argument et attribute error
Mouarf... Je ne suis pas très doué en anglais mais quand même il suffisait de faire un petit effort et de bien lire, la solution est de rajouter:
command= lambda i=i:maCommande(i)
ça marche nickel
Dernière modification par totola (Le 27/06/2016, à 22:41)
Hors ligne
#16 Le 27/06/2016, à 22:40
- totola
Re : Python: fonction, argument et attribute error
Et si je veux réécrire ça sous forme d'une boucle..?? Là je coince de nouveau
def popup1(event):
menu[1].post(event.x_root, event.y_root)
def popup2(event):
menu[2].post(event.x_root, event.y_root)
def popup3(event):
menu[3].post(event.x_root, event.y_root)
def popup4(event):
menu[4].post(event.x_root, event.y_root)
self.canvas_image[1].bind("<Button-3>", popup1)
self.canvas_image[2].bind("<Button-3>", popup2)
self.canvas_image[3].bind("<Button-3>", popup3)
self.canvas_image[4].bind("<Button-3>", popup4)
...etc jusqu'à 20
Dernière modification par totola (Le 27/06/2016, à 22:54)
Hors ligne
#17 Le 28/06/2016, à 07:15
- pingouinux
Re : Python: fonction, argument et attribute error
À tester :
popup={}
for i in range(1,21):
def popu(event,i=i): menu[i].post(event.x_root, event.y_root)
popup[i]=popu
self.canvas_image[i].bind("<Button-3>", popup[i])
À la place de la boucle, tu pourrais créer une classe monBouton.
Hors ligne
#18 Le 28/06/2016, à 08:51
- totola
Re : Python: fonction, argument et attribute error
Merci!
Oui ça fonctionne.
Dernière modification par totola (Le 28/06/2016, à 09:01)
Hors ligne