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 :

scope des sous fonction et TkInter


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut scope des sous fonction et TkInter
    Bonjour,

    je suis confronté à un problème métaphysique de portée de variable...
    Voici un petit test qui illustre mon propos :
    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
    def ti_test ():
     
        import Tkinter
     
        dialog = Tkinter.Tk()
        dialog.grid()
        button = Tkinter.Button( dialog,text='OK', command=dialog.quit )
        button.grid()
     
        i = 123 # 'i' est bien défini au même niveau que 'button'
     
        def spam ():
            print 'spam'
            button['text'] = button['text'].swapcase()
     
        def eggs ():
            print 'eggs ',i
            i += 1
     
        dialog.bind('a',lambda e : spam())
        dialog.bind('z',lambda e : eggs())
        dialog.mainloop()
        dialog.destroy()
     
    ti_test()
    Quand j'appuie sur 'a' je vois bien mon 'OK' devenir 'ok' et vice versa. Donc, la variable 'button' est visible depuis 'spam'.
    Mais quand j'appuis sur 'z', j'ai un exception qui me dit que 'i' n'est pas défini dans le contexte de 'eggs' !

    Alors, pourquoi ces 2 poids et 2 mesures ?

    Pendant que j'y suis : comment on "bind" la barre d'espace ?

  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
    i est une variable locale à ti_test().
    button est une instance.

    de même que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    i = 3
     
    def toto():
         print i ===> erreur
     
    print i ==> 3

  3. #3
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut

    En effet !
    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
    class ham:
        def __init__(self):
            self.x = 456
     
    def ti_test ():
     
        import Tkinter
     
        dialog = Tkinter.Tk()
        button = Tkinter.Button( dialog,text='OK', command=dialog.quit )
        button.grid()
     
        i = 123
        h = ham()
     
        def spam ():
            print 'spam ',h.x
            h.x += 1
     
        def eggs ():
            print 'eggs ',i
            i += 1
     
        dialog.bind('a',lambda e : spam())
        dialog.bind('z',lambda e : eggs())
        dialog.mainloop()
        dialog.destroy()
     
    ti_test()
    spam fonctionne alors que eggs lève une exception !
    Mais c'est ultra moche !!!
    Ça veut dire que que i n'est pas un objet ? Je croyais qu'en python tout était objet...
    Déçu déçu déçu !

    En tous cas, merci du tuyau.

    Et heu... le bind de la barre d'espace ?

  4. #4
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Voici une version minimale qui met en évidence le phénomène :
    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
    class ham:
        pass
     
    def spam ():
     
        h = ham()
        h.x = 456
        i   = 123
     
        def eggs ():
            print 'h.x : ',h.x
            h.x += 1
            try:
                print 'i : ',i
                i += 1
            except Exception,e:
                print '---->',e
     
        eggs()
        eggs()
        eggs()
    donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    h.x :  456
    i :  ----> local variable 'i' referenced before assignment
    h.x :  457
    i :  ----> local variable 'i' referenced before assignment
    h.x :  458
    i :  ----> local variable 'i' referenced before assignment

Discussions similaires

  1. Empecher "l'ouverture" des sous fonctions d'un fichier-m
    Par lapinoufly dans le forum MATLAB
    Réponses: 1
    Dernier message: 01/07/2009, 10h07
  2. affectation de fonction dans des sous-menus
    Par chossette9 dans le forum Interfaces Graphiques
    Réponses: 33
    Dernier message: 27/05/2009, 11h29
  3. Recherche des sous-fonctions
    Par Laugeek dans le forum Développement
    Réponses: 3
    Dernier message: 16/04/2009, 12h15
  4. Appel de fonction dans des sous dossiers
    Par milach dans le forum MATLAB
    Réponses: 1
    Dernier message: 03/01/2008, 14h24
  5. Propriétés des sous-fonctions
    Par rodb7 dans le forum C
    Réponses: 21
    Dernier message: 06/03/2006, 09h34

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