IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

problème de récursivité avec .bind


Sujet :

Tkinter Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Points : 76
    Points
    76
    Par défaut problème de récursivité avec .bind
    j'ai un problème avec mon programme qui est un jeu (le serpent qui doit attrapper des pommes).
    je n'en suis qu'au début, je doit le faire avancer le serpent et le faire changer de direction à chaque événement sur le pavé numérique (touche 4,2,6,8). j'utilise la méthode .bind

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    # -*- coding: cp1252 -*-
    from Tkinter import *
     
    def avance_gauche(event):
        flag =5
        mouvement()
     
    def gauche ():
        global x1, y1, vx, vy, flag, rut
        rut = 0
        can1.coords(oval1, x1, y1, x1+30, y1+30)
        verif.configure(text ='ça marche capitaine!!')
        vx = -10
        vy = 0
        x1= x1 + vx
        y1 = y1 + vy
        if flag == 5:
            fen1.after(100, avance_gauche)
     
    def avance_droit (event):
        flag = 4
        mouvement ()
     
     
    def droit ():
        global x1, y1, vx, vy, flag, rut
        rut = 0
        verif.configure(text ='ça marche capitaine!!')
        can1.coords(oval1, x1, y1, x1+30, y1+30)
        vx = 10
        vy = 0
        x1= x1 + vx
        y1 = y1 + vy
        if flag == 4:
            fen1.after(100, avance_droit)
     
    def avance_haut(event):
        flag = 3
        haut()
     
    def haut ():
        global x1, y1, vx, vy, flag, rut
        rut = 0
        verif.configure(text ='ça marche capitaine!!')
        can1.coords(oval1, x1, y1, x1+30, y1+30)
        vx = 0
        vy = -10
        x1= x1 + vx
        y1 = y1 + vy
        if flag == 3:
            fen1.after(100, avance_haut)
     
     
    def avance_bas(event):
        bas()
     
    def bas():
        global x1, y1, vx, vy, flag, rut
        rut = 0
        flag = 2
        verif.configure(text ='ça marche capitaine!!')
        can1.coords(oval1, x1, y1, x1+30, y1+30)
        vx = 0
        vy = 10
        x1= x1 + vx
        y1 = y1 + vy
        if flag == 2:
            fen1.after(100, avance_bas)
     
    def jouer():
        global x1, y1, vx, vy, rut
        rut = 1
        can1.coords(oval1, x1, y1, x1+30, y1+30)
        vx = 10
        vy = 0
        x1= x1 + vx
        y1 = y1 + vy
        if rut == 1:
            fen1.after(100, jouer)
     
    def mouvement():
        if flag ==2:
            gauche()
        if flag == 3:
            bas()
        if flag ==4:
            droit()
        if flag ==5:
            gauche()
     
     
     
     
    x1 = 20
    y1 = 20
    vx = 10
    vy = 0
    flag = 0
    fen1 = Tk()
    can1 = Canvas (fen1, bg ='white', width = 800, height = 800)
    can1.pack(side = LEFT)
    oval1 = can1.create_oval(x1, y1, x1+30, y1+30, width = 2, fill ='red')
    fen1.bind('4', avance_gauche)
    fen1.bind('6', avance_droit)
    fen1.bind('8', avance_haut)
    fen1.bind('2', avance_bas)
    verif = Label(fen1, text =' ' )
    verif.pack(side = LEFT)
    bout1 = Button(text = 'Quitter', command = fen1.destroy)
    bout1.pack(side = RIGHT)
    bout2 = Button(text = 'Jouer',  command = jouer)
    bout2.pack(side = RIGHT)
     
    fen1.mainloop()
    j'ai comme erreur
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
    return self.func(*args)
    File "C:\Python25\lib\lib-tk\Tkinter.py", line 498, in callit
    func(*args)
    TypeError: avance_bas() takes exactly 1 argument (0 given)

    je ne comprend pas, l'argument est bien appellé puisque event sert d'argument

    merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    l'erreur est dans les fonctions haut, bas, gauche droit et la fonction after qui appelle la fonction avance_... mais il faut rajouter les arguments de la fonction (comme ici event ne nous intéresse pas, il suffit de rajouter None) ou bien directement utiliser la même fonction qui n'a pas d'argument.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        if flag == 2:
            fen1.after(100, avance_bas, None)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        if flag == 2:
            fen1.after(100, bas)
    (par contre, il doit y avoir un problème dans le code, parce qu'ensuite elle avance en diagonale - donc à regarder pourquoi)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Points : 76
    Points
    76
    Par défaut merci
    merci beaucoup, j'avais pas vu ma bourde. La boule avance en diagonal car je n'avais aucun contrôle permettant d'arrêter la fonction jouer.
    encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec bind
    Par _mumu_ dans le forum Administration système
    Réponses: 5
    Dernier message: 03/09/2009, 12h43
  2. Problème avec Bind
    Par Nouss dans le forum Debian
    Réponses: 13
    Dernier message: 09/07/2008, 11h05
  3. Problème récursivité avec gcc -Wall
    Par alcibiade dans le forum Débuter
    Réponses: 14
    Dernier message: 20/05/2008, 22h50
  4. Probléme avec Bind
    Par rach20032 dans le forum Réseau
    Réponses: 2
    Dernier message: 06/07/2007, 11h36
  5. problème d'appel de fonction avec bind (en Tkinter)
    Par piotrr dans le forum Tkinter
    Réponses: 4
    Dernier message: 09/05/2007, 19h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo