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
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
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) :
dans ce code je demande au programme de changer le label boujour en bye. Normalement rien de plus simple.
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()
Merci d'avoir pris la peine d'avoir lut mon post.
PS : je suis nouveau dans le forum, pas en python![]()
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.
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
Salut,
Il faut pour cela bien comprendre le fonctionnement des class et de leur methodes, ainsi que c'est qu'une instance :
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 #une classe class Foo(object): attribute1=0 def __init__(self): self.attribute2=0 #et une de ses instances affectées à "instnc" instnc=Foo()
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.
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
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:
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 class Foo(object): x=56 y=22 test=Foo() print test.x #affiche 56 Foo.x=128 print test.x #affiche 128
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...
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]
Ce schéma devrait t'aider à mieux comprendre le comportement suivant :
Eh oui, en faisant "test.x=128" on dit : l'attribut x de test est égale à 128
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
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 :
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...)
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
EDIT: arf, trop long à écrire... était-ce bien utile du coup ? Je ne pense pas
sorry
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![]()
[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 :
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...
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
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
Partager