Evenement key_Press, ajouter un argument dans la fonction liée(avec Tkinter)
Résolu
enzo_8226
Messages postés
10
Date d'inscription
Statut
Membre
Dernière intervention
-
enzo_8226 Messages postés 10 Date d'inscription Statut Membre Dernière intervention -
enzo_8226 Messages postés 10 Date d'inscription Statut Membre Dernière intervention -
Bonjour, dans mon programme je souhaite lier une fonction une touche du clavier et ajouter le paramètre v a cette fonction. Comme ceci:
Ma fonction, une fois appelée prend les paramètre suivant,
J'ai vus qu'il faut mettre l'argument event dans la définition de la fonction pour que ca fonctionne.
lorsque j'essaye la fonction sans la variable v, avec pour seul argument "event" elle fonctionne d’ailleurs.
Le problème c'est que quand on rajoute la variable v a la fonction et qu'on appelle la fonction avec cette variable, il dit qu'il manque un argument positionnel 'event', et je ne sais pas ce qu'il faut mettre dedans.
self.canvas.bind_all('<KeyPress-Left>',self.vers_gauche(v=self.v))
Ma fonction, une fois appelée prend les paramètre suivant,
def vers_gauche(self,event,v)
J'ai vus qu'il faut mettre l'argument event dans la définition de la fonction pour que ca fonctionne.
lorsque j'essaye la fonction sans la variable v, avec pour seul argument "event" elle fonctionne d’ailleurs.
Le problème c'est que quand on rajoute la variable v a la fonction et qu'on appelle la fonction avec cette variable, il dit qu'il manque un argument positionnel 'event', et je ne sais pas ce qu'il faut mettre dedans.
A voir également:
- Evenement key_Press, ajouter un argument dans la fonction liée(avec Tkinter)
- Fonction si et - Guide
- Ajouter agenda outlook dans google agenda - Guide
- Impossible d'ajouter un ami sur facebook - Guide
- Ajouter un compte whatsapp - Guide
- Ajouter un compte facebook - Guide
6 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
peux-tu montrer un code complet que nous pouvons tester?
cela nous aidera à comprendre.
peux-tu montrer un code complet que nous pouvons tester?
cela nous aidera à comprendre.
Ok mais je vous prévient il affiche une erreur au démarrage a cause de la variable vitesse (v). Pour le tester sans l'erreur, elever le v la ou je vous le dit.
from tkinter import * import random import time print('test') #balle________________ class Balle: def __init__(self, canvas,raquette, couleur): self.touche_bas=False self.raquette=raquette self.canvas = canvas self.id = canvas.create_oval(10,10,25,25, fill=couleur) self.canvas.move(self.id, 245, 100) departs = [-3, -2, -1, 1, 2, 3] random.shuffle(departs) self.x = departs[0] self.y = -1 self.hauteur_canevas = self.canvas.winfo_height() self.largeur_canevas = self.canvas.winfo_width() def position(self,canvas,x,y): balle.canvas.move( self.id, x, y) def bouge(self,canvas,x,y): self.canvas.move(self.id, x, y) def heurter_raquette(self,pos): pos_raquette=self.canvas.coords(self.raquette.id) global heurter if pos[2] >= pos_raquette[0] and pos[0] <= pos_raquette[2]: if pos[3] >= pos_raquette[1] and pos[3] <= pos_raquette[3]: heurter=1 return True heurter=0 return False def dessiner(self): self.canvas.move(self.id, self.x, self.y) pos = self.canvas.coords(self.id) trajectoire_X=[-1,0,1,2,3] random.shuffle(trajectoire_X) if pos [1] <= 0: self.y=abs(self.y) if pos[3] >= self.hauteur_canevas: self.touche_bas=True if self.heurter_raquette(pos)==True: self.y=-self.y-1 if pos[0] <= 0: self.x=abs(self.x+trajectoire_X[0]) if pos[2] >= self.largeur_canevas: self.x = -abs(self.x+trajectoire_X[0]) #Raquette___________________________________ class Raquette: def __init__(self, canvas, couleur, heurter): self.canvas = canvas self.id = canvas.create_rectangle(0,0,100,10, fill=couleur) self.canvas.move(self.id,200,300) self.x = 0 self.v=-2 self.largeur_canevas = self.canvas.winfo_width() self.canvas.bind_all('<KeyPress-Left>',self.vers_gauche(self.v)) #<enlever le v ici self.canvas.bind_all('<KeyPress-Right>',self.vers_droite(self.v)) def vittesse(heurter,v): if heurter==1: v=v+1 print(v) return v def vers_gauche(self,event,v): #<enlever le v la aussi self.x=-2 # je compte remplacer le -2 par la vittesse v qui augmente, pareil pour (vers_droite) print(event) pos=self.canvas.coords(self.id) if pos[0] <= 0: self.x = 0 def vers_droite(self,event,v): #<enlever le v la aussi self.x=2 pos=self.canvas.coords(self.id) if pos[2] >= self.largeur_canevas: self.x = 0 def dessiner(self,heurter): self.canvas.move(self.id, self.x, 0) pos=self.canvas.coords(self.id) if pos[0] <= 0: self.x = 0 elif pos[2] >= self.largeur_canevas: self.x = 0 #teste_________ class Texte: def __init__(self,canvas,x,y, font,texte): self.canvas=canvas self.id=canvas.create_text(x, y, text= texte, font=(font)) canvas.itemconfig(self.id,state='hidden') def montrer(self,canvas): canvas.itemconfig(self.id,state='normal') def cacher(self,canvas): canvas.itemconfig(self.id,state='hidden') class Comencer(Texte): def init(self,canvas): self.canvas.bind_all('<KeyPress-Return>',self.debut_de_partie) def debut_de_partie(self,event): global deb deb=1 print(' deb = ', deb) #------------------------------------------------------------------- tk=Tk() tk.title('balle rouge') tk.resizable(0, 0) tk.wm_attributes("-topmost", 1) canvas=Canvas(tk, width=500, height=400, bd=0, highlightthickness=0) canvas.pack() tk.update() heurter=0 cacher=True continuer=True raquette = Raquette(canvas,'blue',heurter) balle = Balle(canvas,raquette, 'red') game_over=Texte(canvas,150,225,('Helvetica',25),'GAME OVER') comencer=Comencer(canvas,150,225,('Helvetica',12),'Apuyer sur entrée pour comencer') recomencer=Texte(canvas,200,225,('Helvetica',15),'appuyer sur entrer pour recomencer') deb=0 #------------------------------------------------------------------- while 1: comencer.montrer(canvas) comencer.init(canvas) print(deb) if deb==1: break tk.update_idletasks() tk.update() time.sleep(0.01) while 1: if balle.touche_bas==False: comencer.cacher(canvas) balle.dessiner() raquette.dessiner(heurter) raquette.v = raquette.vittesse(heurter) else: game_over.montrer(canvas) tk.update_idletasks() tk.update() time.sleep(0.01)
le probleme avec cette methode,
c'est que dans cette fonction, self.v = none, (je l'ai print pour vérifier et c'est ce que j'ai constaté), alors que pourtant je lui ai bien donné une valeur.
def vers_gauche(self,event): self.x=self.v
c'est que dans cette fonction, self.v = none, (je l'ai print pour vérifier et c'est ce que j'ai constaté), alors que pourtant je lui ai bien donné une valeur.
En fait, même à la ligne 168:
raquette.v = raquette.vittesse(heurter)
Si on le print ça nous donne
raquette.v = none
Donc la fonction vitesse renvoie none alors qu'elle est censé renvoyer la variable v
raquette.v = raquette.vittesse(heurter)
Si on le print ça nous donne
raquette.v = none
Donc la fonction vitesse renvoie none alors qu'elle est censé renvoyer la variable v
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
J'ai essayé aussi cette méthode (dans ma boucle while l167-168)
mais Il me disent que j'ai donné 3 argument positionnels pour vitesse :
"vittesse() takes 2 positional arguments but 3 were given".
Mais pourtant il n'y en a que 2.
print(raquette.v) v=raquette.v print(v) v = raquette.vittesse(heurter,v)
mais Il me disent que j'ai donné 3 argument positionnels pour vitesse :
"vittesse() takes 2 positional arguments but 3 were given".
Mais pourtant il n'y en a que 2.
merci Yg_be, grace a ta méthode j'ai réussit, le code qui fonctionne:
from tkinter import * import random import time print('test') #balle________________ class Balle: def __init__(self, canvas,raquette, couleur): self.touche_bas=False self.raquette=raquette self.canvas = canvas self.id = canvas.create_oval(10,10,25,25, fill=couleur) self.canvas.move(self.id, 245, 100) departs = [-3, -2, -1, 1, 2, 3] random.shuffle(departs) self.x = departs[0] self.y = -1 self.hauteur_canevas = self.canvas.winfo_height() self.largeur_canevas = self.canvas.winfo_width() def position(self,canvas,x,y): balle.canvas.move( self.id, x, y) def bouge(self,canvas,x,y): self.canvas.move(self.id, x, y) def heurter_raquette(self,pos): pos_raquette=self.canvas.coords(self.raquette.id) global heurter if pos[2] >= pos_raquette[0] and pos[0] <= pos_raquette[2]: if pos[3] >= pos_raquette[1] and pos[3] <= pos_raquette[3]: heurter=1 return True heurter=0 return False def dessiner(self): self.canvas.move(self.id, self.x, self.y) pos = self.canvas.coords(self.id) trajectoire_X=[-1,0,1,2,3] random.shuffle(trajectoire_X) if pos [1] <= 0: self.y=abs(self.y) if pos[3] >= self.hauteur_canevas: self.touche_bas=True if self.heurter_raquette(pos)==True: self.y=-self.y-1 if pos[0] <= 0: self.x=abs(self.x+trajectoire_X[0]) if pos[2] >= self.largeur_canevas: self.x = -abs(self.x+trajectoire_X[0]) #Raquette___________________________________ class Raquette: def __init__(self, canvas, couleur, heurter): self.canvas = canvas self.id = canvas.create_rectangle(0,0,100,10, fill=couleur) self.canvas.move(self.id,200,300) self.x = 0 self.v=2 self.largeur_canevas = self.canvas.winfo_width() self.canvas.bind_all('<KeyPress-Left>',self.vers_gauche) #<enlever le v ici self.canvas.bind_all('<KeyPress-Right>',self.vers_droite) def vittesse(self,heurter,v): if heurter==1: v=v+1 print(v) return v return v def vers_gauche(self,event): self.x=-self.v print(self.v) pos=self.canvas.coords(self.id) if pos[0] <= 0: self.x = 0 def vers_droite(self,event): #<enlever le v la aussi self.x=self.v pos=self.canvas.coords(self.id) if pos[2] >= self.largeur_canevas: self.x = 0 def dessiner(self,heurter): self.canvas.move(self.id, self.x, 0) pos=self.canvas.coords(self.id) if pos[0] <= 0: self.x = -self.x self.x=0 elif pos[2] >= self.largeur_canevas: self.x = -self.x self.x=0 #teste_________ class Texte: def __init__(self,canvas,x,y, font,texte): self.canvas=canvas self.id=canvas.create_text(x, y, text= texte, font=(font)) canvas.itemconfig(self.id,state='hidden') def montrer(self,canvas): canvas.itemconfig(self.id,state='normal') def cacher(self,canvas): canvas.itemconfig(self.id,state='hidden') class Comencer(Texte): def init(self,canvas): self.canvas.bind_all('<KeyPress-Return>',self.debut_de_partie) def debut_de_partie(self,event): global deb deb=1 print(' deb = ', deb) #------------------------------------------------------------------- tk=Tk() tk.title('balle rouge') tk.resizable(0, 0) tk.wm_attributes("-topmost", 1) canvas=Canvas(tk, width=500, height=400, bd=0, highlightthickness=0) canvas.pack() tk.update() heurter=0 cacher=True continuer=True raquette = Raquette(canvas,'blue',heurter) balle = Balle(canvas,raquette, 'red') game_over=Texte(canvas,150,225,('Helvetica',25),'GAME OVER') comencer=Comencer(canvas,150,225,('Helvetica',12),'Apuyer sur entrée pour comencer') recomencer=Texte(canvas,200,225,('Helvetica',15),'appuyer sur entrer pour recomencer') deb=0 v=raquette.v #------------------------------------------------------------------- while 1: comencer.montrer(canvas) comencer.init(canvas) if deb==1: break tk.update_idletasks() tk.update() time.sleep(0.01) while 1: if balle.touche_bas==False: comencer.cacher(canvas) balle.dessiner() raquette.dessiner(heurter) v = raquette.vittesse(heurter,v) raquette.v=v else: game_over.montrer(canvas) tk.update_idletasks() tk.update() time.sleep(0.01)