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 :

Probleme fonction bind.


Sujet :

Tkinter Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 10
    Par défaut Probleme fonction bind.
    Bonjour a tous,

    Voici un probleme épineux que je n'arrive pas a résoudre,
    Je définis une fonction contenant une autre fonction comme suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def BigFunction(Param1,Param2):
         def SmallFunction():
              print(Param1)
    Voila donc ma belle fonction,et voici le probleme si j'écris cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def BigFunction(Param1,Param2):
         def SmallFunction():
              print(Param1)
     
         SmallFunction()
     
    BigFunction(45,"yoyo")
    Ca fonctionne et j'ai comme résultat 45.

    Maintenant si je crée une fenetre Tk() en amont, et que je crée un Canvas appelé TheCan, et si j'écris ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def BigFunction(Param1,Param2):
         def SmallFunction(event):
              print(Param1)
     
         TheCan.bind('<Button-1>',SmallFunction)
     
    BigFunction(45,"yoyo")
    Eh beh ce code ne fonctionne pas, voici l'erreur générée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "UnboundLocalError: local variable 'Param1' referenced before assignment"
    Si j'ai bien compris, cela signifie que Param1 n'existe tout simplement pas !
    Mais comment est-ce possible étant donné qu'elle est censée etre globale a toute la fonction BigFunction.Une âme charitable voudrait-elle bien 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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        TheCan.bind('<Button-1>',SmallFunction)
    s'execute dans un scope différent, celui de Tk... enfin, il me semble.

  3. #3
    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
    Bonsoir,

    lambda est une merveille avec tkinter :

    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
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
     
     
    from Tkinter import *
     
    def BigFunction(Param1,Param2):
        def SmallFunction(param1):
            print(Param1)
     
        wiTopLevel = Tk()
        wiTopLevel.title("Test de SmallFonction")
        TheCan = Canvas(wiTopLevel, bg='dark grey',height=640,width=480)
        TheCan.pack(side=LEFT) 
        TheCan.bind('<Button-1>',lambda event: SmallFunction(Param1))
        TheCan.bind('<Button-3>',quit)
        wiTopLevel.mainloop()
     
    BigFunction(45,"yoyo")
    @+

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 10
    Par défaut
    josmiley -> Pas compris .

    Pausekawa -> Mais a ce moment là je n'ai plus acces aux attributs de mon event, comme la position x et y, car si j'ai bien compris, ta solution envoie un argument de type int a SmallFunction.

    En tout cas merci pour vos réponses les gars.

  5. #5
    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
    Citation Envoyé par Noob_saibot Voir le message
    Pausekawa -> Mais a ce moment là je n'ai plus acces aux attributs de mon event, comme la position x et y.
    Pas dit plus haut

    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
    from Tkinter import *
     
    def BigFunction(Param1,Param2):
        def SmallFunction(param1):
            print Param1
            print x
            print Param2
     
        wiTopLevel = Tk()
        wiTopLevel.title("Test de SmallFonction")
        TheCan = Canvas(wiTopLevel, bg='dark grey',height=640,width=480)
        TheCan.pack(side=LEFT) 
        TheCan.bind('<Button-1>',lambda event: SmallFunction(Param1))
        TheCan.bind('<Button-3>',quit)
        wiTopLevel.mainloop()
     
    x = 1
    BigFunction(45, "yoyo")
    Attention aux variables (et a leurs noms) dans ce cas. C'est la porte ouverte à toutes le fenêtres -> comprendre une erreur entre locale, globale, héritée.

    De plus si une variable n'est pas initialisée (ou réinitialisée à chaque passage) elle garde la valeur précédente jusqu'à sa destruction (qui n'arrive qu'à la fin de ton code) ou si une erreur de python survient.

    @+

Discussions similaires

  1. problème fonctions callback
    Par youp_db dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 02/10/2005, 14h47
  2. [wxPython] Problème de 'Bind'
    Par Mr Hyde dans le forum wxPython
    Réponses: 6
    Dernier message: 25/08/2005, 16h53
  3. Problème avec bind
    Par jaabouc dans le forum Réseau
    Réponses: 5
    Dernier message: 12/06/2005, 14h32
  4. probleme fonction gethostbyname
    Par oclone dans le forum Développement
    Réponses: 6
    Dernier message: 14/04/2005, 10h31
  5. probleme fonction syntaxe
    Par gIch dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/02/2005, 09h52

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