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 :

TypeError: evaluer() takes exactly 1 argument (0 given)


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Par défaut TypeError: evaluer() takes exactly 1 argument (0 given)
    Bonjour, je poste ici parce-que un problème commence à me prendre pas mal la tête...
    Alors voila, j'ai fait un script avec python afin de calculer un score sur une cible selon des valeurs renvoyé par des capteurs de forces et j'ai décidé de faire un petit interface graphique avec Tkinter oû l'on rentrerait les 4 valeurs et que le score se calcule lorsqu'on appui sur un bouton.
    J'en suis donc arrivé ici :

    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
     
    from Tkinter import *
    from math import *
     
    def evaluer(event):
        b1,b2,b3,b4=bal1.get(),bal2.get(),bal3.get(),bal4.get()
        b=[float(b1),float(b2),float(b3),float(b3)]                  ## Les valeurs renvoie par les balances/capteurs
        b.sort()                           ## Tri la liste par ordre croissant
        b.reverse()                        ## Inverse la liste (ordre decroissant)
     
        cotecible=70.                      ## Reglage des dimensions de la cible
        demidiag=sqrt(cotecible**2/2)      ## Calcul de la longueur de la demi-diagonale de la cible 
     
     
        d1=(demidiag/10)*((120-b[0])/8)    ##Distance de l'impact de la balance renvoyant la plus  grande valeur
        d2=(demidiag/10)*((120-b[1])/8)    ##Distance de l'impact de la balance renvoyant la deuxieme plus grande valeur
        cosalpha=-((d1**2-d2**2-cotecible**2)/(2*d2*cotecible))  ##Cosinus de l'angle inconu
     
     
     
        alpha=degrees(acos(cosalpha))                            ##Valeur de l'angle inconu
     
        distancecentre = sqrt((2*(cotecible/2)**2)+d2**2-2*sqrt(2*(cotecible/2)**2)*d2*cos(radians(45-alpha)))
     
        ##Calcule de la distance entre le centre de la cible et le point d'impact
     
        score = int(((demidiag-distancecentre)/(demidiag/10))+1)
        tex2.configure(text=score)
     
    fen1=Tk()
     
    tex1=Label(fen1, text="Calcul du score effectue lors d'un tir ", fg='red')
    tex1.pack()
     
    bal1= Entry(fen1).pack()
     
    bal2= Entry(fen1).pack()
     
    bal3 = Entry(fen1).pack()
     
    bal4 = Entry(fen1).pack()
     
     
    tex2=Label(fen1).pack()
     
    calculscore=Button(fen1, text="Calculer", command=evaluer).pack()
     
     
     
     
    fen1.mainloop()

    Le problème est que quand je click sur le bouton Calculer, le terminal m'affiche un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
        return self.func(*args)
    TypeError: evaluer() takes exactly 1 argument (0 given)
    Voilà, en espérant que quelqu'un puisse m'aider.
    Merci d'avance.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    je ne connais pas tkinter, mais ke crois comprendre que l'appui sur le bouton execute evaluer() qui attend un argument que ne lui envoie pas le bouton.
    Butto(n) ne prend pas un argument genre "arg" ?

    edit: il semble que "event" ne soit pas utile ...

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Par défaut
    J'ai essayé de retirer le event, cependant une autre erreur apparaît alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Traceback (most recent call last):
      File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
        return self.func(*args)
      File "scorecible.py", line 5, in evaluer
        b1,b2,b3,b4=bal1.get(),bal2.get(),bal3.get(),bal4.get()
    AttributeError: 'NoneType' object has no attribute 'get'

    Je ne comprend pas pourquoi le event pose problème en fait...

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    comme je te l'ai dit, je ne connais pas tkinter mais je ferai ça:

    à la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bal1= Entry(fen1).pack()
    mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bal1= Entry(fen1)
    bal1.pack()

    pareil pour la suite

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Par défaut
    Merci josmilley, erreur résolu!
    Il resté une petite erreur après :
    la même que précédemment mais avec configure à la place, j'ai donc du faire pareil pour le tex2 que pour les bal.

    L'application marche enfin, merci.

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Petite explication de texte pour ce qui est de la partie du wrapper Tkinter.

    La méthode command du widget stocke n'importe quel callable* Python. Celui ci n'est pas un événement géré par le gestionnaire d'événement du mainloop() mais par l'interpréteur tcl.
    Un objet event géré par mainloop() retourne les informations sur l'event, tcl non.
    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
    from Tkinter import *
     
    def e1():
        tex2.configure(text='1')
     
    def e2(event):
        #The widget which generated this event. This is a valid Tkinter widget instance, not a name. This attribute is set for all events.
        widget = event.widget
        #The current mouse position, in pixels.
        x, y = event.x, event.y
        #The current mouse position relative to the upper left corner of the screen, in pixels.
        x_root, y_root = event.x_root, event.y_root
        #The character code (keyboard events only), as a string.
        char = event.char
        #The key symbol (keyboard events only).
        keysym = event.keysym
        #The key code (keyboard events only).
        keycode = event.keycode
        #The button number (mouse button events only).
        num = event.num
        #The new size of the widget, in pixels (Configure events only).
        width, height = event.width, event.height
        #The event type.
        type = event.type
        aff = widget._name, str(x), str(y), x_root, y_root, char, keysym, keycode, num, str(width), str(height), type
        tex2.configure(text=aff)
     
    fen1 = Tk()
     
    Button(fen1, text="Afficher 1", command=e1).pack()
     
    b1 = Button(fen1, text="Afficher 2")
    b1.pack()
    b1.bind("<Button-1>", e2) # <--- event géré par mainloop()
     
    tex2=Label(fen1)
    tex2.pack()
     
    fen1.mainloop()
    Les gestionnaires de géométrie (pack, grid, place) ne sont là que pour positionner les Widgets. Ils retournent donc toujours None (Ou une erreur )
    bal1 = Entry(fen1).pack()
    bal1 = None
    Petit bonus.
    Vous remarquerais que dans le premier code vous avez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Button(fen1, text="Afficher 1", command=e1).pack()
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    b1 = Button(fen1, text="Afficher 2")
    b1.pack()
    b1.bind("<Button-1>", e2)
    Dans le premier cas je n'ai pas besoin de connaitre sous Python le nom du Widget car j'ai stocké dans sa méthode command la fonction a exécuter (command=e1). Le Widget est quand même créé par la classe Button.
    Pour ce qui est de b1 par contre j'ai besoin de nommer sous Python le Widget pour pouvoir faire le bind.
    Je parle bien de nom d'objet pour Python car pour tcl celui-ci en a un autre (widget._name).

    @+

    * Pour aller plus loin pensez que si votre code comporte un command=evaluer(x) celui ci est exécuté à la création du Widget. D'où l'utilité de lambda. Mais bon... C'est une autre histoire.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 17/08/2010, 00h21
  2. TypeError: this constructor takes no arguments
    Par mfaty dans le forum Général Python
    Réponses: 5
    Dernier message: 26/08/2009, 23h17
  3. Réponses: 2
    Dernier message: 21/05/2009, 10h03
  4. Réponses: 6
    Dernier message: 03/04/2009, 23h30
  5. No function matches the given name and argument types.
    Par Davboc dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/05/2007, 11h25

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