Evenement key_Press, ajouter un argument dans la fonction liée(avec Tkinter)
Résolu
enzo_8226
Messages postés
10
Statut
Membre
-
enzo_8226 Messages postés 10 Statut Membre -
enzo_8226 Messages postés 10 Statut Membre -
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
- Impossible d'ajouter un ami sur facebook - Guide
- Ajouter agenda outlook dans google agenda - Guide
- Ajouter un compte whatsapp - Guide
- Ajouter un compte facebook - Guide
6 réponses
yg_be
Messages postés
24281
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 585
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)