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

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    peux-tu montrer un code complet que nous pouvons tester?
    cela nous aidera à comprendre.
    0
  2. enzo_8226 Messages postés 10 Statut Membre
     
    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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  3. enzo_8226 Messages postés 10 Statut Membre
     
    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
  4. enzo_8226 Messages postés 10 Statut Membre
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. enzo_8226 Messages postés 10 Statut Membre
     
    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
  7. enzo_8226 Messages postés 10 Statut Membre
     
    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