Vous n'êtes pas identifié(e).
bien, là, on voit que
-1 je n'utilise pas de classe pr définir ma FP (Fenetre Principale, celle qui contient le mainloop())
ça va changer
-2 je crée 1 instance d'une seconde fenetre grâce à la méthode et à l'importation de mon second fichier
le second fichier, celui qui crée ma seconde fenêtre
bien, là on voit que
-1 j'utilise 1 classe pr construire ma fenetre ms qu'elle n' herite de rien
-2 derniere L: je crée 1 instance d'un bouton grâce au fichier que j'importe ET que ce bouton est crée DANS le Frame de la fenetre
le 3° fichier, celui qui crée un bouton personnalisé
bien là on voit que
-1 je crée 1 classe qui crée 1 bouton personnalisé (personnalisable) ms qui encore 1x n' hérite de rien
-2 lorsque je clic sur le bouton, celui-ci détruit le Frame qui le contient (Frame du second fichier et donc de la seconde fenetre)
hors je ne veux pas détruire le Frame de la seconde fenetre, je veux détruire la seconde fenetre.
Comment je fais cela?
Avec ce que j'ai écrit, je ne px pas cibler cette seconde fenetre
je vois 2 manières de faire.
- ecrire la fonction qui detruit la fenetre directement ds son propre fichier (le second dc) et voir si mon bouton personnalisé peut appeller cette méthode
- faire appel a qque chose que je ne connais pas encore et que je n'arrive pas a traduire en langage humain et dc que je n'utilise pas
vu ici
docs.python.org/fr/3.8/library/tkinter.html
Ds ce dernier morceau de code
je vois bien que la classe Application hérite de la classe Frame
je vois bien qu'il y a 2 constructeurs, celui de la classe Application, celui de la classe .........super()? mère? la classe Frame?
qu'est ce que le master?
leur code est un fichier applicat° (avec le mainloop)
ma structure fait appel a différents fichiers, comment je dois l'adapter?
dc... si vs avez des pistes et/des explications
En vs remerciant
tartare
ce n'est pas à la machine de dire à l'homme ce qu'il peut faire, c'est a l'homme de dire a la machine ce qu'elle doit faire
Hors ligne
structure du programme
Tu peux organiser ton code ainsi:
super()
Oui, la fonction super permet de faire appel à la classe héritée, et par conséquent de l'initialiser via sa méthode __init__().
Il faut employer cette ligne à chaque fois qu'on hérite d'une classe, je pense pas que ce soit utile de creuser son fonctionnement pour l'instant.
Qu'est ce que master?
Tu as tronqué l'exemple, master est le paramètre passé à l'initialisation de Application
Il est ensuite passé comme paramètre à l'initialisation de tk.Frame,
soit super().__init__(master) l'équivalent de tk.Frame(master)
Donc le paramètre master doit être un objet tkinter susceptible d'êrte parent d'un autre widget, si il n'est pas spécifié la fenêtre est indépendante, sinon, elle est la fille de master
ps : si tu souhaites, il y a des forums plus spécifiques à python, je traîne parfois par là : https://www.developpez.net/forums/f96/a … es/python/. Essaie de suivre un max les conseils que je te donne en début de post, le forum y est plus rigoureux
Dernière modification par David5647 (01-02-2022 22:35:04)
Hors ligne
le fichier du bouton personnalisé importé c'est a dire
fichier_Btn_Retour_Personnalise_copie.py
importé ds le fichier
fichier_F01R_copie.py
dc, pr en revenir au sujet de ce post,
ds le 1° fichier, j'instancie la classe definie de mon second fichier
c'est a dire
je crée un bouton personnalisé (dt le libellé est: "detruire fr bleu")
ce bouton détruit bien le frame bleu,
hors ce que je souhaite et n'arrive pas a faire c'est détruire la fenetre et faire apparaitre la fenetre principale (celle qui a le mainloop())
j'ai dc 3 niveaux
le fichier de la fenetre principale (mainloop())
---> le fichier de la fenetre secondaire (avec le fr bleu et a l'interieur de ce fr bleu mon bouton_personnalisé)
-------> le fichier de mon bouton personnalisé
voilà,
sinon pr tes remarques:
- forums specifiques: j'y suis aussi ms je me suis fait rembarré (sans doute est-ce ma faute ms comme j'avais pris le temps d'ecrire un code clair et commenté, je l'ai mal pris, j'y retrounerai sans aucun doute car je me rends bien compte qu'ici le sujet du site n'est ni python, ni la prog.
D'ailleurs apres ce post, je pense arreter de poster de tels sujets ici
- tu as remarqué que j'avais pris le temps de détailler, ça fait plaisir (deja dit ms mes efforts st passés inaperçus ou insuffisants ailleurs)
- variables globales, j'essayais justement de ne pas en utiliser, faut que je revoie ma copie sur le sujet(?!)
voili, voilou,
Merci bien pr le temps que tu passes à me lire et surtt a me filer un coup de main.
a+ et bonne journée
tartare
ce n'est pas à la machine de dire à l'homme ce qu'il peut faire, c'est a l'homme de dire a la machine ce qu'elle doit faire
Hors ligne
ce n'est pas à la machine de dire à l'homme ce qu'il peut faire, c'est a l'homme de dire a la machine ce qu'elle doit faire
Hors ligne
ce bouton détruit bien le frame bleu,
hors ce que je souhaite et n'arrive pas a faire c'est détruire la fenetre et faire apparaitre la fenetre principale (celle qui a le mainloop())
j'ai dc 3 niveaux
le fichier de la fenetre principale (mainloop())
---> le fichier de la fenetre secondaire (avec le fr bleu et a l'interieur de ce fr bleu mon bouton_personnalisé)
-------> le fichier de mon bouton personnalisé
Il me semble que le code fourni (une fois les fichiers correctement nommés) réalise cette tâche, à moins que je n'ai pas compris la demande...
variables globales, j'essayais justement de ne pas en utiliser, faut que je revoie ma copie sur le sujet(?!)
Il y en avait dans le premier code fournis (#1), là c'est bon de ce coté là, c'était surtout pour dire qu'il n'y avait pas de différence spécifique entre plusieurs fichier avec des import et un seul fichier
Dernière modification par David5647 (16-02-2022 19:45:15)
Hors ligne
David5647:
des écritures peu compréhensibles (self.fr01.cnv01.fr01.btn01= tk.Button(self.fr01.cnv01.fr01,...)
ben c'est du ciblage
self= fenetre
fr01= Frame ds la fenetre
cnv01= Canvas ds le Frame
fr01= Frame ds le Canvas
btn01= Button ds le Frame
ca fait beaucoup de niveaux c'est vrai, ms a part tout poser sur la fenetre... je vois pas comment faire.
Tu fais comment toi?
David5647:
des écritures confuses (self.btn01_retour est un bouton, self.btn02_retour n'est pas un bouton)
si tu fais ref a la derniere L du 2° fichier ben... si c'est un bouton, c'est le bouton personnalisé, celui defini ds le 3° fichier
le bouton fait bien ce que je lui demande, detruire le Frame bleu (c'est pr cela qu'il est encore en vie celui-là), ms je vx lui dire de fermer la fenetre, pas de détruire le Frame bleu
Tt laisser ds 1 seul fichier? ben si tu trouves que c'est brouillon avec 3 fichiers, imagine le tt ds 1 seul... et puis là c'est un truc simple
bref je souhaite garder mes 3 fichiers
je te donne raison sur tt le reste (meme si on ne fait pas la compet). Y avait effectivement bcp de bling bling restant ds ce que j'avais écrit et bcp de commentaires (j'ai souvenir que les femmes adorent ms je me rends compte que je suis dvt mon ecran, dc effectivement ca ne sert pas a grd chose)
bon là je ferai pas mx.
si tu ne px pas c'est pas bien grave, je resoudrai bien tôt ou tard.
a+ et bonne soirée.
tartare
ce n'est pas à la machine de dire à l'homme ce qu'il peut faire, c'est a l'homme de dire a la machine ce qu'elle doit faire
Hors ligne
ben c'est du ciblage
self= fenetre
fr01= Frame ds la fenetre
cnv01= Canvas ds le Frame
fr01= Frame ds le Canvas
btn01= Button ds le Frame
ca fait beaucoup de niveaux c'est vrai, ms a part tout poser sur la fenetre... je vois pas comment faire.
Tu fais comment toi?
Qu'on s'entende bien, faire:
c'est simplement créer une variable dans l'espace de nom de mon_objet. C'est juste une organisation du code.
Il y a plusieurs réponses possibles:
1) A quoi sert une variable?
Une variable sert à stocker un objet pour une utilisation ultérieure.
Il faut créer une variable seulement si tu l'utilise ensuite, là ce n'était pas le cas.
As tu besoin de toutes ces variables? Est-ce important pour ton programme de conserver tout l'arbre?
Si tu veux acceder à un canvas, as tu besoin d'avoir une référence explicite à la frame qui le contient?
Quand tu écris
as tu besoins de toutes les variables intermédiaires ou as tu besoins uniquement de la référence au bouton?
2) Ciblage (structure du code)
En soit, faire refléter la hiérarchie des objets comme cela, c'est plutôt une bonne idée, pourquoi pas.
Je trouve quand même que les écritures comme
Plutôt lourdes, donc à utiliser avec parcimonie.
Si tu veux créer la même structure avec un code (que j'estime) plus lisible, je peux te proposer ça:
---
si tu fais ref a la derniere L du 2° fichier ben... si c'est un bouton, c'est le bouton personnalisé, celui defini ds le 3° fichier
Ce n'est pas un bouton, tu peux vérifier avec la fonction type().
La variable contient une classe qui a pour attribut un bouton tkinter,
self.btn01_retour et self.btn02_retour ne pourront pas être utilisés de la même façon puisqu'ils ne représentent pas des objets du même type.
C'est un peu du chipotage, ça ne change rien à l’exécution du code, mais ça rajoute qd même un peu de confusion.
---
Tt laisser ds 1 seul fichier? ben si tu trouves que c'est brouillon avec 3 fichiers, imagine le tt ds 1 seul... et puis là c'est un truc simple
bref je souhaite garder mes 3 fichiers
Je dis juste que ça ne change fondamentalement pas grand chose à condition qu'il n'y ai pas de variables globales, c'est tout.
Et donc, je sous-entends que c'est juste une histoire d'organisation de code (si tes variables sont bien confinées à tes classes).
Bref, ma remarque portait sur les variables globales pas directement sur les fichiers.
Et donc, si 3 fichiers c'est plus lisible, partons sur 3 fichiers, ce n'est pas ce que je questionnais.
---
le bouton fait bien ce que je lui demande, detruire le Frame bleu (c'est pr cela qu'il est encore en vie celui-là), ms je vx lui dire de fermer la fenetre, pas de détruire le Frame bleu
Je n'ai toujours pas compris la demande, quelle fenêtre? la popup c'est bien ça? Fermer = détruire?
Si tu détruis la fenêtre popup qui contient ta frame (ce que le premier bouton fait), où veut tu que ta frame aille? Je comprends pas
J'ai reformulé un peu ton code:
Tu as pour seuls objets:
- la fenêtre principale : MyMainWindow, désignée par self.parent
- la popup : MyPopup, désignée par self, enfant de window
- la frame de la popup, tk.Frame, désignée par popup_frame, enfant de la popup
- les boutons : BtnKill, désignés par les variables kill_<nom>_Btn, enfants de popup_frame
(les nom de variables soulignés correspondent à l'espace de nom de la fonction Popup.creer_Widgets)
Lequel/lesquels veut tu détruire (sachant que détruire le parent détruit l'enfant)?
Hors ligne