Evenement key_Press, ajouter un argument dans la fonction liée(avec Tkinter)

Résolu/Fermé
enzo_8226 Messages postés 10 Date d'inscription samedi 24 avril 2021 Statut Membre Dernière intervention 26 avril 2021 - Modifié le 25 avril 2021 à 17:06
enzo_8226 Messages postés 10 Date d'inscription samedi 24 avril 2021 Statut Membre Dernière intervention 26 avril 2021 - 26 avril 2021 à 11:58
Bonjour, dans mon programme je souhaite lier une fonction une touche du clavier et ajouter le paramètre v a cette fonction. Comme ceci:

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:

6 réponses

yg_be Messages postés 22781 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 13 mai 2024 1 481
25 avril 2021 à 19:55
bonjour,
peux-tu montrer un code complet que nous pouvons tester?
cela nous aidera à comprendre.
0
enzo_8226 Messages postés 10 Date d'inscription samedi 24 avril 2021 Statut Membre Dernière intervention 26 avril 2021
25 avril 2021 à 21:18
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)
    
0
yg_be Messages postés 22781 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 13 mai 2024 1 481
26 avril 2021 à 10:17
suggestions:
ligne 64:
self.canvas.bind_all('<KeyPress-Left>',self.vers_gauche)

lignes 74 & 75:
    def vers_gauche(self,event): 
        self.x=self.v    
0
enzo_8226 Messages postés 10 Date d'inscription samedi 24 avril 2021 Statut Membre Dernière intervention 26 avril 2021
26 avril 2021 à 11:17
le probleme avec cette methode,
 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.
0
enzo_8226 Messages postés 10 Date d'inscription samedi 24 avril 2021 Statut Membre Dernière intervention 26 avril 2021
Modifié le 26 avril 2021 à 11:23
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
enzo_8226 Messages postés 10 Date d'inscription samedi 24 avril 2021 Statut Membre Dernière intervention 26 avril 2021
26 avril 2021 à 11:38
J'ai essayé aussi cette méthode (dans ma boucle while l167-168)
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.
0
enzo_8226 Messages postés 10 Date d'inscription samedi 24 avril 2021 Statut Membre Dernière intervention 26 avril 2021
26 avril 2021 à 11:58
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)
    
    
0