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

Python Discussion :

Erreur sur argument de fonction [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 509
    Par défaut Erreur sur argument de fonction
    Bonjour a tous,

    J'ai une erreur sur le code d'un jeu de pong avec Tkinter au niveau de ma détection d'évènement, mon code me semble correct au vu de ce que je vois dans certaine documentation et tuto.
    J'ai fait également quelques essais pour corriger le problème, mais je ne trouve pas. Le code fonction, mais cette erreur est généré dans la console.

    L'erreur qui apparait dans la console, quand je déplace ma souris au dessus du canvas est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\treza\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
        return self.func(*args)
      File "C:\Users\treza\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 839, in callit
        func(*args)
    TypeError: survol() missing 1 required positional argument: 'event'
    Et mon code est le suivant:

    Code Python : 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
    from tkinter import *
    from random import randrange
     
     
    SIDE = 600
    niv = 0
    dx = 4
    dy = 5
    dx2 = 5
    dy2 = 0
     
    root = Tk()
    cnv = Canvas(root, width=SIDE, height=SIDE)
    cnv.pack()
     
     
    def deplacement():
        global dx, dy, dx2, dy2, SIDE, plafond, niv
    # changement de direction eau bord du canvas
        if cnv.coords(balle)[3] > SIDE:
            dy = -dy
        elif cnv.coords(balle)[1] < 10:
            dy = abs(dy)
        if cnv.coords(balle)[0] > SIDE-20:
            dx = -dx
        elif cnv.coords(balle)[2] < 30:
            dx = abs(dx)
    # détection de la raquette
        if len(cnv.find_overlapping(cnv.coords(raquette)[0], cnv.coords(raquette)[1], cnv.coords(raquette)[2], cnv.coords(raquette)[3])) > 1:
            dy = -dy
    # Arret du script en fonction de la hauteur du plafond
        if niv >= 500:
            cnv.move(balle, 0, 0)
        else:
            cnv.move(balle, dx, dy)
    # gestion de la vitesse de déplacement
        cnv.after(5, deplacement)
    # descente du plafond si on loupe la balle
        if cnv.coords(balle)[3] == SIDE+5:
            # print(cnv.coords(balle)[3])
            niv += 100
            cnv.delete(plafond)
            plafond = cnv.create_rectangle(
                0, niv-5, SIDE, niv, outline="black", fill="red")
    # detection colision plafond
        if len(cnv.find_overlapping(cnv.coords(plafond)[0], cnv.coords(plafond)[1], cnv.coords(plafond)[2], cnv.coords(plafond)[3])) > 1:
            dy = abs(dy)
    # mouvement raquette en fonction de souris
     
     
    def survol(event):
        global X, dy2, raquette
        X = event.x
        Y = event.y
        if X < 25:
            X = 25
        elif X > SIDE-25:
            X = SIDE-25
        # on dessine la raquette avec un deplacement gauche droite uniquement
        cnv.move(raquette, X, dy2)
        cnv.delete(raquette)
        raquette = cnv.create_rectangle(
            X-25, SIDE-25, X+25, SIDE-30, outline="black", fill="green")
        cnv.after(20, survol)
     
     
    # On dessine le plafond
    plafond = cnv.create_rectangle(
        0, 0, SIDE, 5, outline="black", fill="red")
     
     
    balle = cnv.create_oval(SIDE/2-30, SIDE/2-10, SIDE /
                            2-10, SIDE/2+10, fill="orange")
    raquette = cnv.create_rectangle(
        SIDE/2-25, SIDE-25, SIDE/2+25, SIDE-30, fill="black")
    # Detection de la souris au survol du canvas
    cnv.bind("<Motion>", survol)
    # Appel de la fonction deplacement
    deplacement()
     
    root.update()
     
    root.mainloop()

    Cela doit ne doit certainement pas être compliqué mais je ne trouve pas !!
    Pauvre est mon savoir.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par zoumzoum59 Voir le message
    L'erreur qui apparait dans la console, quand je déplace ma souris au dessus du canvas est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\treza\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
        return self.func(*args)
      File "C:\Users\treza\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 839, in callit
        func(*args)
    TypeError: survol() missing 1 required positional argument: 'event'
    Ben c'est clair: la fonction survol() attend un truc qu'elle ne reçoit pas.

    Donc d'après le peu que je vois, la fonction "survol" est une callback (elle sera appelée par tkinter sans que tu maitrises cet appel). Donc si tkinter l'appelle sans lui passer de paramètre, alors elle ne doit pas en attendre.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut !

    Le bug vient d'ici : cnv.after(20, survol), je pense qu'il y a un problème de logique dans ton code.
    Avec cnv.bind("<Motion>", survol) dès que tu bouges la souris tu vas appeler la fonction survol, la fonction bind renvoie un argument event correspondant ici à la souris.
    A la fin de ta fonction def survol(event) tu demandes à Tkinter d'attendre 20msec et d'appeler à nouveau la fonction survol mais cette fois-ci tu ne lui transmets pas d'argument...
    Il va y avoir des conflits avec cette fonction, d'un côté tu lui dis de faire ... dès que tu bouges la souris et de l'autre tu lui dis d'attendre 20 msec.


    Une façon d'obtenir les coordonnées de la souris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = root.winfo_pointerx()
    y = root.winfo_pointery()
    Dernière modification par f-leb ; 29/06/2022 à 22h13. Motif: code mis à jour dans le 1er post

  4. #4
    Membre éclairé
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 509
    Par défaut
    Bonjour Sve@r et LeNarvalo,

    Désolé pour le code, la couleur j'avais vu, mais je ne savais pas comment faire et pour l'indentation, je ne m'étais pas apercu que tout avait été ecrasé depuis mon copier coller de VS Code.

    Je m'étais bien aperçu que le message d'erreur que la fonction attendait l'argument event, mais je ne trouvait pas ça logique avec ce que j'avais vu ailleurs.

    Sinon comme LeNarvalo l'a dit le bug était bien au niveau de
    cnv.after(20, survol)
    J'ai supprimé cette ligne et le problème est résolu, je pense également du coup que j'ai bien mieux compris le fonctionnement de l'appel d'évènement

    Encore merci à vous deux, j'aurais encore cherché bien longtemps avant de trouver mon erreur.

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

Discussions similaires

  1. [MySQL] Erreur sur paramètre de fonction mysqli_fetch_array
    Par Bimbaks dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/02/2016, 20h31
  2. [Débutant] Erreur sur une private fonction
    Par naucala dans le forum VB.NET
    Réponses: 3
    Dernier message: 05/01/2016, 14h09
  3. Réponses: 3
    Dernier message: 08/11/2006, 17h56
  4. [Pl/pgSQL] Erreur sur l'execution d'une fonction.
    Par Floréal dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 25/09/2005, 00h48
  5. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00

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