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 :

class et variable


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 70
    Par défaut class et variable
    Voila déja bonjour a tous , je suis nouveau.
    mais je voudrait surtout savoir comment faire pour utilisé des variable qui sont définie dans une class dans une autre class. merci d'avance a vos réponse

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Tu peux préciser ta question ? Un exemple de code ?

  3. #3
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 70
    Par défaut class et variable
    dsl je suis vraiment pas trés douer lol

    alor voila je vais expliquer clairement ma demande.
    je suis en train de faire un programme asser compliquer qui nécésite de couper ma fenetre principale en trois paneau grace a la fonctiopn PanedWindow
    sa y a pas de problemme et j'ai décider de remplir mes panneau en utilisant une class pour chacun d'eux. mais le probleme c'est que , avec cette méthode, les boutton d'une class ne peuveup pas inter-agir avec des variables d'une autre class (comme pas exemple) :
    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
    from Tkinter import *
     
    class Interface(Frame):
        def __init__(self):
            Frame.__init__(self)
            self.label=Label(self, text="Bonjour", fg='red')
            self.label.pack()
            self.boutton_=boutton()
            self.boutton_.pack()
            self.pack()
     
     
    class boutton(Frame):
        def __init__(self):
            Frame.__init__(self)
            self.boutton=Button(self, text="Bye", command=self.bye)
            self.boutton.pack()
     
        def bye(self):
            self.label.configure(text="Bye", fg='blue')
     
    if __name__=='__main__':
        App=Interface()
        App.mainloop()
    dans ce code je demande au programme de changer le label boujour en bye. Normalement rien de plus simple.

    Merci d'avoir pris la peine d'avoir lut mon post.
    PS : je suis nouveau dans le forum, pas en python

  4. #4
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Une solution dans ton cas serait de garder une référence vers le widget parent. Le mieux est de le passer via le constructeur de bouton. Comme ça tu pourrais accéder au label de l'autre classe.

    Mais ça viole complètement l'orienté objet, aussi peut-être devrais-tu trouver une autre manière de le faire. Tu pourrais ajouter une méthode à ta frame principale pour changer le label du bouton par exemple. Même si c'est encore loin de la meilleure solution.

  5. #5
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 70
    Par défaut
    En fait, j'avais penser a définir ma class plutot de cette façon

    a tout hasard : class boutton(Frame, Interface):

    sa change absolument rien au programme mais se n'empèche pas son lancement.

    par contre je vais juste te demander si tu peut détailler ton premier paragraphe parce que j'ai pas tout compris.

    Et je ne vais pas ajouter de méthode a ma Frame principale parce que justement, le but c'est de faire inter-agir les paneau entre eux . J'ai pas vraiment d'idée de comment faire autrement

  6. #6
    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,

    Il faut pour cela bien comprendre le fonctionnement des class et de leur methodes, ainsi que c'est qu'une instance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #une classe
    class Foo(object):
        attribute1=0
        def __init__(self):
            self.attribute2=0
     
    #et une de ses instances affectées à "instnc"
    instnc=Foo()
    Jusque là, pas de problème. Regardons quels sont sont variables auquelles on peut acceder suivant le contexte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Foo.attribute1
    # retourne 0
    instnc.attribute1
    #retourne 0
     
    Foo.attribute2
    #lève une exception, parceque attibute2 n'est crée que lors de la création d'une instance
    de Foo (__init__ n'étant executé qu'a ce moment):
    instnc.attribute2
    #nous retourne 0, puisque instnc est une instance
    l'argument self de __init__ (et autres méthodes d'une classe ) est nommé self par convention, et à juste titre puique cela désigne l'instance elle-même : sauf indication contraire, une instance passe comme premier argument à toutes ses méthode de façon transparente une reférence à elle-même... on saisi donc mieux le sens de l'instruction "self.attibute2=0" qui signifie en python, plus littéralement : ma variable (la variable de moi-même) attribute2 -si elle n'existe pas, la créer- vaut 0.
    si depuis l'exterieur de l'instance, on voulais affecter la valeur 5 à attribute2 de l'instance "instnc" de Foo, on écrirait "instnc.attribute2=5". Tu remarqueras que la façon d'appeler un attribut d'une instance depuis l'extérieur de cette dernière est là même que celle employée pour appeler un attribut défini au niveau de la classe (ici attribute1).

    Les attribut de classes et ceux des instances possèdes quelque subtilités:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Foo(object):
        x=56
        y=22
     
    test=Foo()
    print test.x #affiche 56
    Foo.x=128
    print test.x #affiche 128
    On peut observer que la définition d'attribut à l'intérieur d'une classe, mais hors d'une de ses méthodes, sont des attributs dont la classe est en quelque sorte le "propriétaire". On peut observer également que test.x nous retourne la valeur de Foo.x ; ça à l'air simple, mais voici un schéma de la classe Foo et de l'instance test (juste après la création de cette dernière) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Foo
     |
     +-x = 56
     |
     +-y = 22
     
    test
     |
     +-[liste de pointeurs vers les attributs hérités de Foo]
    Un pointeur, ici, et en faisant très simple, est comme une redirection, ce qui veut dire concretement qu'ici "test.x" revient à taper "Foo.x", parce que test n'a pas d'attribut x mais il sait que sa classe en possède un, donc il retourne la valeur de ce dernier...
    Ce schéma devrait t'aider à mieux comprendre le comportement suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Foo(object):
        x=56
        y=22
     
    test=Foo()
    test.x=128
    print test.x #affiche 128
    print Foo.x #affiche 56
    Foo.x=273
    print test.x #affiche 128
    print Foo.x #affiche 273
    Eh oui, en faisant "test.x=128" on dit : l'attribut x de test est égale à 128
    on à donc crée l'attribut x car il n'existait pas dans instnc. Il est donc tout à fait normal que Foo.x n'ait pas été modifié.
    Maintenant que test.x à été crée, si l'on veut qu'a nouveau text.x pointe vers Foo.x, il suffit de supprimer l'attribut x de instnc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #depuis l'interieur de l'instance
    delattr(self, 'x') #ou
    del self.x
     
    #ou depuis l'exterieur
    delattr(instnc, 'x') #ou
    del instnc.x
    Tout ceci j'éspère t'aideras à deviner comment accéder à un attribut d'un classe depuis une autre classe (et même plus si je me suis pas expliquer comme un pied...)

    EDIT: arf, trop long à écrire... était-ce bien utile du coup ? Je ne pense pas
    sorry

  7. #7
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 70
    Par défaut
    WAOUUUU !


    Franchement, je suis inscrit aujourd'hui et j'été un peu septique mais la j'évoue avoir une réponse complette en trés peu de temps qui va je suposse énormément m'aider.

    par contre je vais la relire aprés avoir manger par ce que la le cerveau chauffe un peu.
    Merci a toi N.Tox ! tu est mon roi

  8. #8
    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
    [se passe la main dans les cheuveux] Je sais, je sais... [/se passe la main dans les cheuveux]

    Plus sérieusement, quand j'utilise un framework (ici Tkinter), j'ai toujours utilisé la méthode conseillée par Antoine_935 à savoir : garder un référence vers les autres widgets. Ce qui veut dire en gros que je ne sais pas si ce que je t'ai montré fonctionne pour les framework, je suppose que oui, y'a pas de raison...

    Mais le principe qu'Antoine à évoqué (si je l'ai bien compris) peut être illustré de la sorte :
    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
    class One(object):
        def __init__(self,parent=None,child=None):
            self.parent=parent
            self.child=child
            self.x=56
     
    class Two(object):
        def __init__(self,parent=None,child=None):
            self.parent=parent
            self.child=child
            self.y=108
     
    a=One()
    b=Two(a)
    a.child=b
    c=One(b,a)
    b.child=c
    a.parent=c
     
    a.x=145
    print b.parent.x #affiche 145
    print a.child.y #affiche 108
    J'ai toujours procédé avec ce concept quand j'utilise un framework, je ne saurait donc vraiment te conseillée l'une ou l'autre méthode... à comparer donc...

  9. #9
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 70
    Par défaut
    ben ,deja pour commencer je vais esseyer avec ta methode et apres je vais dire si sa marche ou pas. mais je peut rien faire ce soir donc j te dit pour demain. merci encore

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

Discussions similaires

  1. Dll de classe et variable
    Par SkYsO dans le forum Langage
    Réponses: 5
    Dernier message: 10/03/2006, 09h25
  2. Réponses: 3
    Dernier message: 08/12/2005, 14h41
  3. Réponses: 2
    Dernier message: 09/10/2005, 15h35
  4. [Sessions] Classes et variables de sessions
    Par Thanaroth dans le forum Langage
    Réponses: 4
    Dernier message: 06/10/2005, 16h17
  5. Réponses: 6
    Dernier message: 06/10/2004, 12h59

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