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

Signaler
Messages postés
10
Date d'inscription
samedi 24 avril 2021
Statut
Membre
Dernière intervention
26 avril 2021
-
Messages postés
10
Date d'inscription
samedi 24 avril 2021
Statut
Membre
Dernière intervention
26 avril 2021
-
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.

6 réponses

Messages postés
15326
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 avril 2021
840
bonjour,
peux-tu montrer un code complet que nous pouvons tester?
cela nous aidera à comprendre.
Messages postés
10
Date d'inscription
samedi 24 avril 2021
Statut
Membre
Dernière intervention
26 avril 2021

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)
    
Messages postés
15326
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 avril 2021
840
suggestions:
ligne 64:
self.canvas.bind_all('<KeyPress-Left>',self.vers_gauche)

lignes 74 & 75:
    def vers_gauche(self,event): 
        self.x=self.v    
Messages postés
10
Date d'inscription
samedi 24 avril 2021
Statut
Membre
Dernière intervention
26 avril 2021

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.
Messages postés
10
Date d'inscription
samedi 24 avril 2021
Statut
Membre
Dernière intervention
26 avril 2021

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
Messages postés
10
Date d'inscription
samedi 24 avril 2021
Statut
Membre
Dernière intervention
26 avril 2021

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.
Messages postés
10
Date d'inscription
samedi 24 avril 2021
Statut
Membre
Dernière intervention
26 avril 2021

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)