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 :

récupérer une valeur de scale


Sujet :

Tkinter Python

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

    Informations forums :
    Inscription : Août 2007
    Messages : 44
    Par défaut récupérer une valeur de scale
    Bonjour à toute la troupe !

    J'ai essayé de compiler un peu toutes les réponses trouvées sur le sujet, et de les adapter, mais impossible de faire fonctionner ma soluce .

    Voici le contexte.

    Je suis en train de créer une classe ApplicationDes pour faire un lancer de dés dans une fenêtre. Un curseur permet de choisir le nombre de dés à lancer, et un bouton doit faire le lancer en question. Cette appli est encapsulée dans une classe, donc.

    Je bute sur le pb suivant : comment récupérer la valeur du curseur pour qu'elle s'affiche dans le libellé du bouton ?

    Je pense que mon code a la bonne structure, et qu'il s'agit d'un bête pb de syntaxe !

    Voici la classe en question :

    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
     
    #_*_ coding: iso-8859-1 _*_
    from Tkinter import* 
     
    class ApplicationDes(Tk) :
     
        #constructeur
        def __init__(self,parent):
            Tk.__init__(self,parent)
            self.parent=parent
            self.initialize()
     
        #fonction qui modifie le texte de bouton en fonction de la valeur du curseur
        def affiche(txt):
            valeur=curseur.get()
            bouton.config(text ="Lancez "+str(valeur)+" dés !")   
     
        #initialisation des widgets
        def initialize(self) :
            self.grid()
            #le curseur pour le nombre de dés
            self.curseur=Scale(self, length=500, from_=1, to=20, orient=HORIZONTAL, label ='Nombre de dés à lancer',troughcolor ='dark grey',
                        sliderlength =20, tickinterval =1,command=affiche)
            self.curseur.grid(column=0,row=0,sticky='EW')
     
            #le bouton pour lancer les dés
            bouton=Button(self,text="Lancez les dés !")
            bouton.grid(column=0,row=1)
            #auto redimensionnement de la fenêtre
            self.resizable(True,True)
     
    #création d'une application
    if __name__=="__main__":
        app = ApplicationDes(None)
        app.title("Les dés sont jetés !")
        app.mainloop()
    Et voici le message d'erreur obtenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Traceback (most recent call last):
      File "C:\Python24\Scripts\des\applicationDes.py", line 41, in -toplevel-
        app = ApplicationDes(None)
      File "C:\Python24\Scripts\des\applicationDes.py", line 14, in __init__
        self.initialize()
      File "C:\Python24\Scripts\des\applicationDes.py", line 26, in initialize
        sliderlength =20, tickinterval =1,command=affiche)
    NameError: global name 'affiche' is not defined
    Visiblement, il ne veut pas reconnaître affiche, mais alors là, pourquoi donc ?

    Merci d'avance pour votre aide, et toutes mes excuses si c'est marqué noir sur blanc quelque part !

    Gram'

  2. #2
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    salut, en fait, affiche est une methode de ta classe Application, et dans self.curseur, tu met command=affiche, il te suffit juste de mettre command=self.affiche pour signifier que c'est une methode de la classe parente et non un fonction... @+++

  3. #3
    Membre chevronné
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Par défaut
    Bonjour,
    De plus, il te manque des 'self' un peu partout (self.bouton, self.curseur...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        def affiche(self,valeur):
            self.bouton.config(text ="Lancez "+str(valeur)+" dés !")

  4. #4
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Tiens oui c'est vrai, j'avais pas fait gaffe... donc petite explication...
    dans une méthode (les puriste ne vont pas aimé ma definition je crois... une méthode est une fonction implémenté dans une classe), si on définit une variable sans la préfixer de self., python va la définir comme locale... une variable locale n'est accessible que le temps de l'éxécution de la méthode, et ne sera donc pas gardée en mémoire une fois la méthode terminée... alors qu'une varible définie à l'aide du préfixe self. permet de dire que c'est une variable appartenant à la classe parente, cette variable sera donc accessible à toute la classe (et donc aux méthodes de cette dernière...) et sera également gardée en mémoire... et on y accède de la même manière : en préfixant de self. tant qu'on se trouve à l'intérieur de la class.

    ex:
    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
    class ExempleClass:
       def __init__(self):
          self.var1=0 #voici une variable qui sera gardée en mémoire
          var2=0 #celle-ci par contre sera vidée de la mémoire une fois la méthode __init__ finie, c'est une variable locale
          self.methodeVar1() #on appelle une methode
          self.methodeVar2() #on appelle une methode
     
       def methodeVar1(self):
          if self.var1==0: # ici la verification de l'état de self.var1 peut s'effectuée
             self.var1=1
     
          if self.var2==0: # ici, il y aura une erreur, self.var2 n'existe pas dans la mémoire
             self.var2=1
     
          if var1==0: # il y aura aussi une erreur, var1 n'étant pas une varible globale, python regarde si var 1 à été déclarée dans la méthode... ce qui n'est pas le cas
             var1=1
     
          if var2==0: #idem
             var2=1
       def methodeVar2():
          var1=0
          var2=1
          if var1==0: #ici la vérification se fera car une variable locale var1 à été définie dans la méthode
             var1=1
     
          if var2==0: #idem
             var2=1
     
    #Maintenant on est plus dans la class
    a=ExempleClass()
    print a.var1 #nous retournera la valeur de var1 (self.var1)
    print a.var2 #nous retournera une erreur, car il ne trouvera pas la variable var2 en mémoire

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 44
    Par défaut
    Vous êtes TROP FORTS !

    Je vais méditer à tête reposée la réponse de N.Tox sur les self, classes, et tout ça.

    Le fait est que c'est un peu ma rentrée scolaire (ma rentrée en classe, donc ) et j'ai piétiné quelques règles...

    Bravo à tous les deux et merci pour tout !

    Gram'

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

Discussions similaires

  1. [XSL]récupérer une valeur de plusieurs fichiers XML
    Par snoop dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 05/02/2006, 00h32
  2. Réponses: 5
    Dernier message: 09/09/2005, 17h51
  3. problème pour récupérer une valeur dans ma bd (débutante)
    Par auryn111 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/08/2005, 17h49
  4. Réponses: 2
    Dernier message: 17/06/2005, 13h38
  5. Réponses: 2
    Dernier message: 11/12/2004, 21h20

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