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 d'appel de fonction avec bind (en Tkinter) [Fait]


Sujet :

Tkinter Python

  1. #1
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    726
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Points : 266
    Points
    266
    Par défaut problème d'appel de fonction avec bind (en Tkinter)
    Voici mon message d'erreur:

    Exception in Tkinter callback
    Traceback (most recent call last):
    File "lib-tk/Tkinter.py", line 1348, in __call__
    return self.func(*args)
    TypeError: evaluer() takes no arguments (1 given)
    voici ma fonction evaluer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def evaluer(): #évènment associé à la touche enter sur la zone de texte 
    	texteSigne = Label(affSigne)
    	texteSigne.pack()
    voici mon main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fen=Tk()
     
    texte=Label(text="Entrez un entier")	
    texte.pack()
    entree = Entry(fen)	#zone où  on peut entrer du texte
    entree.bind("<Return>", evaluer)		
    entree.pack()
    Voilà je cherche à appelé la fonction quand j'ai tapé sur enter après avoir entrer un entier.
    mais j'ai le message d'erreur relaté là haut.

    Pourtant, comme vous pouvez le voir, je ne mets pas d'arguments quand j'appelle la fonction evaluer() ni quand je la définie.

    Alors pourquoi ce message d'erreur?

    merci

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def evaluer(event): #évènment associé à la touche enter sur la zone de texte 
    	texteSigne = Label(affSigne)
    	texteSigne.pack()
    http://python.developpez.com/faq/?page=TkKeyEvent#TkKey

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonsoir,

    J'ai aussi un problème avec l'appel de fonction en Tkinter.
    Voici les parties de mon code qui nous interesse ici (j'ai quatres autres boutons identiquement apelés garder1,...) :
    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
     
    from Tkinter import *
     
    ...........
     
    def gardcarte(rg):
        global t
        present = False
        for i in range (len(t)):
            if rg == t[i]:
                del t[i]
                present = True
        if present == False :
            t.append(rg)
        return t
     
    mw = Tk()
    t = [] 
    garder0 = Button(mw, width = 10, bd = 2, text = "garder")
    garder0.place(x = 40, y = 280)
    garder0.bind("<Button-1>", gardcarte(0))
    il me renvoi une erreur quand je clique sur le bouton garder0 (ou garder1,...) qui es la suivante :
    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)
    TypeError: 'list' object is not callable
    Quelqu'un peut-il m'en expliquer la raison?
    Merci d'avance

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    En fait, j'ai résolu le problème, mais il me reste une petite question : Quand on veut associer à un évenement une fonction qui demande un argument (en plus de event) comment faire?
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def gardcarte(event ????) #Que mettre ici?
    ....
     
     
     
     
    garder.bind("<Button-1>", gardcarte(rg)) #avec un argument pour la fonction gardcarte

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    On ne peut pas : une fonction indiquée dans une méthode bind, ou encore associée à un paramètre command, n'est pas un "vrai" appel de fonction (c'est d'ailleurs pour ça qu'on ne met jamais de parenthèses après le nom de la fonction).

    Mais on peut contourner cette limitation grâce aux expressions lambda :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def gardcarte(rg)
        ....
     
    garder.bind("<Button-1>", lambda event : gardcarte(rg))

    Si tu as besoin de récupérer le paramètre event dans ta fonction gardcarte(), tu peux aussi l'ajouter :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def gardcarte(rg, event)
        ....
     
    garder.bind("<Button-1>", lambda event : gardcarte(rg, event))

    Tu peux aussi affecter une valeur à un paramètre d'une expression lambda :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def gardcarte(rg)
        ....
        # rg vaut 42
     
    garder.bind("<Button-1>", lambda event, var = 42 : gardcarte(var))
    (Bon évidemment dans cet exemple l'intérêt est limité, il aurait été plus rapide de mettre gardcarte(42) après l'expression lambda)

    => FAQ: http://python.developpez.com/faq/?pa...onCommandParam
    <3 Debian
    [ C | C++ | PHP | Python ]

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/09/2005, 16h49
  2. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  3. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 14h54
  4. Réponses: 4
    Dernier message: 19/04/2004, 13h41
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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