Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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 wink

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

pingouinux a écrit :

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 wink

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 hmm

		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.

smile

Dernière modification par totola (Le 28/06/2016, à 09:01)

Hors ligne