Probleme TKinter plusieurs fenetres
Résolu/Fermé
A voir également:
- Tkinter gérer plusieurs fenêtres
- Gerer les profils netflix - Guide
- Gerer foyer netflix - Accueil - Guide streaming
- Gerer stockage google - Guide
- Gerer les cookies - Guide
- Comment gérer les applications qui se lancent au démarrage - Guide
12 réponses
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
Modifié le 28 mai 2021 à 13:16
Modifié le 28 mai 2021 à 13:16
C'est quoi ton message d'erreur ?
Chez moi, ca marche:
1_ appui sur Pythagore: affichage de la 2eme fenêtre
2_ appui sur Menu: affichage de la principale
3_ appui sur Pendu: affichage de la fenêtre
etc, etc ...
pas d'erreur, a part les fenêtres secondaires qui ne s'effacent pas
(on verra le problème des frames ensuite, chaque chose en son temps)
Chez moi, ca marche:
1_ appui sur Pythagore: affichage de la 2eme fenêtre
2_ appui sur Menu: affichage de la principale
3_ appui sur Pendu: affichage de la fenêtre
etc, etc ...
pas d'erreur, a part les fenêtres secondaires qui ne s'effacent pas
(on verra le problème des frames ensuite, chaque chose en son temps)
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
Modifié le 28 mai 2021 à 13:26
Modifié le 28 mai 2021 à 13:26
Alors tu as changé ton code depuis, on ne doit pas avoir le même sinon, j'aurais la même erreur
Ton code, c'est toujours ceci : (j'ai enlevé les images car je n'ai pas celles que tu as) ?
Ton code, c'est toujours ceci : (j'ai enlevé les images car je n'ai pas celles que tu as) ?
# -*- coding:Latin-1 -*- from tkinter import * def Pythagore(): global window # destruction de la fenetre principale window.destroy() # creation de la fenetre windowPY = Tk() windowPY.title('Pythagore') windowPY.geometry('1080x720') windowPY.config(background='blue') # Bouton de selection bouton_programe1 = Button(windowPY, text="Menu", font=("Helvetica", 20), bg='white', fg='grey', command=fenetreaccueil) bouton_programe1.pack(pady=25, fill=X) windowPY.mainloop() def Verbes_irreguliers(): global window # destruction de la fenetre principale window.destroy() # creation de la fenetre windowVI = Tk() windowVI.title('Verbes irreguliers') windowVI.geometry('1080x720') windowVI.config(background='blue') # Bouton de selection bouton_programe1 = Button(windowVI, text="Menu", font=("Helvetica", 20), bg='white', fg='grey', command=fenetreaccueil) bouton_programe1.pack(pady=25, fill=X) windowVI.mainloop() def Pendu(): global window # destruction de la fenetre principale window.destroy() # creation de la fenetre windowPENDU = Tk() windowPENDU.title('Pendu') windowPENDU.geometry('1080x720') windowPENDU.config(background='blue') # Bouton de selection bouton_programe1 = Button(windowPENDU, text="Menu", font=("Helvetica", 20), bg='white', fg='grey', command=fenetreaccueil) bouton_programe1.pack(pady=25, fill=X) windowPENDU.mainloop() def Generateur_de_mot_de_passe(): global window # destruction de la fenetre principale window.destroy() # creation de la fenetre windowGMDP = Tk() windowGMDP.title('Generateur de mots de passes') windowGMDP.geometry('1080x720') windowGMDP.config(background='blue') # creaton d'image width = 512 height = 512 canvas = Canvas(windowGMDP, width=width, height=height, bg='blue', bd=0, highlightthickness=0) canvas.pack(expand=YES) ## Bouton de selection bouton_programe1 = Button(windowGMDP, text="Menu", font=("Helvetica", 20), bg='white', fg='grey', command=fenetreaccueil) bouton_programe1.pack(expand=YES) windowGMDP.mainloop() def fenetreaccueil(): global window # creation du menu window = Tk() window.title('Exo-cours') window.geometry('1080x720') window.config(background='grey') # creation des boites frame = Frame(window, bg='grey') frame1 = Frame(frame, bg='grey') # creation du titre title = Label(frame, text='Bienvenue sur "Exo-cours" !', font=("Helvetica", 40), bg='grey') title.pack(expand=YES) # creation des consignes consigne = Label(frame, text='Veuillez choisir un sous-programme', font=("Helvetica", 35), bg='grey') consigne.pack(expand=YES) # creation des boutons bouton_programe1 = Button(frame1, text="Pythagore", font=("Helvetica", 20), bg='white', fg='grey', command=Pythagore) bouton_programe1.pack(pady=25, fill=X) bouton_programe2 = Button(frame1, text="Verbes irreguliers", font=("Helvetica", 20), bg='white', fg='grey', command=Verbes_irreguliers) bouton_programe2.pack(pady=25, fill=X) bouton_programe3 = Button(frame1, text="Pendu", font=("Helvetica", 20), bg='white', fg='grey', command=Pendu) bouton_programe3.pack(pady=25, fill=X) bouton_programe4 = Button(frame1, text="Generateur de mots de passe", font=("Helvetica", 20), bg='white', fg='grey', command=Generateur_de_mot_de_passe) bouton_programe4.pack(pady=25, fill=X) frame.pack(expand=YES) frame1.pack(expand=YES) window.mainloop() fenetreaccueil()
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
Modifié le 28 mai 2021 à 16:42
Modifié le 28 mai 2021 à 16:42
Ha, tu n'est pas clair dans tes réponses, à lire celle de 13h08, je pensais que tu avais résolu le problème de visibilité de la variable window dans les différentes fonctions
Justement, en déclarant window comme globale, elle est visible partout et donc l'instruction
fonctionne partout
ce qui manque encore, c'est de détruire la fenêtre secondaire quand on revient à la principale
Justement, en déclarant window comme globale, elle est visible partout et donc l'instruction
window.destroy()
fonctionne partout
ce qui manque encore, c'est de détruire la fenêtre secondaire quand on revient à la principale
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
28 mai 2021 à 16:52
28 mai 2021 à 16:52
Tu peux raccourcir ton code :
global window, windowPY, windowVI, windowPENDU, windowGMDP
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
Modifié le 28 mai 2021 à 11:46
Modifié le 28 mai 2021 à 11:46
Bonjour Lastronaute,
Il faudrait peut-être voir du coté de Toplevel() : création d'une fenêtre secondaire, sans forcément détruire la principale, donc il suffit de fermer la secondaire pour revenir à la principale
A voir si ça te convient ...
De plus, si on clique sur le bouton Pythagore, il y a erreur : window is not defined
Normal: window n'est pas connue dans cette fonction, problème de portée des variables
Une fois résolu ce problème, en cliquant sur Menu, on revient bien sur la principale, mais sans détruire la secondaire
Il faudrait peut-être voir du coté de Toplevel() : création d'une fenêtre secondaire, sans forcément détruire la principale, donc il suffit de fermer la secondaire pour revenir à la principale
A voir si ça te convient ...
De plus, si on clique sur le bouton Pythagore, il y a erreur : window is not defined
Normal: window n'est pas connue dans cette fonction, problème de portée des variables
def Pythagore(): # destruction de la fenetre principale window.destroy()
Une fois résolu ce problème, en cliquant sur Menu, on revient bien sur la principale, mais sans détruire la secondaire
Bonjour,
Tout d'abord merci de votre réponse rapide ! Le truc c'est que quand je fait Toplevel(), je ne sais pas comment faire pour que ma fenetre sois diefférente de la première. J'ai déjà essayer de m'aventurer la dedans mais je n'ai pas réussi à faire une page différente avec ce que je souhaite faire dessus.
J'ai aussi essayer de mettre dans différente Frame comme certains recommandent mais je ne parviens pas a trouver comment afficher et faire disparaitre les différentes frames. (j'aurai besoin de cette méthode pour la suite)
Si tu sais comment s'y prendre pour faire cela je suis preneur !
Merci encore,
Lastronaute
Tout d'abord merci de votre réponse rapide ! Le truc c'est que quand je fait Toplevel(), je ne sais pas comment faire pour que ma fenetre sois diefférente de la première. J'ai déjà essayer de m'aventurer la dedans mais je n'ai pas réussi à faire une page différente avec ce que je souhaite faire dessus.
J'ai aussi essayer de mettre dans différente Frame comme certains recommandent mais je ne parviens pas a trouver comment afficher et faire disparaitre les différentes frames. (j'aurai besoin de cette méthode pour la suite)
Si tu sais comment s'y prendre pour faire cela je suis preneur !
Merci encore,
Lastronaute
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
28 mai 2021 à 11:55
28 mai 2021 à 11:55
OK, oublions Toplevel, mais comme je te le disais plus haut, une fois le problème de portée de la variable window résolu, ton code fonctionne:
On clique sur Pythagore, la 2eme fenêtre s'affiche, et quand on clique Menu sur cette dernière, la fenêtre principale se réaffiche ...
On clique sur Pythagore, la 2eme fenêtre s'affiche, et quand on clique Menu sur cette dernière, la fenêtre principale se réaffiche ...
Certes elle se réaffiche mais lorsque que je veux interagir avec mes boutons sur cette nouvelle fenêtre principale il m’affiche une erreur dans mon Terminal.
Et j'ai trouvé ceci comme code pour afficher les différentes Frame mais cela ne fonctionne tout simplement pas...
root = tk.Tk() frames = [ tk.Frame(root, width=100, height=100, bg=color) for color in ('red', 'green', 'blue')] index = 0 frames[index].grid(row=0) def show_next(): global index frames[index].grid_forget() index = (index + 1) % len(frames) frames[index].grid(row=0) show_next()
Voici mon message d'erreur :
Exception in Tkinter callback
Traceback (most recent call last):
File "/Users/lastronaute/opt/miniconda3/lib/python3.9/tkinter/__init__.py", line 1884, in __call__
return self.func(*args)
File "/Users/lastronaute/Desktop/Python/Projets/Exo-Cours/t.py", line 71, in Generateur_de_mot_de_passe
window.destroy()
File "/Users/lastronaute/opt/miniconda3/lib/python3.9/tkinter/__init__.py", line 2304, in destroy
self.tk.call('destroy', self._w)
_tkinter.TclError: can't invoke "destroy" command: application has been destroyed
et il me met ca peut importe sur quel bouton j'appuie
Exception in Tkinter callback
Traceback (most recent call last):
File "/Users/lastronaute/opt/miniconda3/lib/python3.9/tkinter/__init__.py", line 1884, in __call__
return self.func(*args)
File "/Users/lastronaute/Desktop/Python/Projets/Exo-Cours/t.py", line 71, in Generateur_de_mot_de_passe
window.destroy()
File "/Users/lastronaute/opt/miniconda3/lib/python3.9/tkinter/__init__.py", line 2304, in destroy
self.tk.call('destroy', self._w)
_tkinter.TclError: can't invoke "destroy" command: application has been destroyed
et il me met ca peut importe sur quel bouton j'appuie
Heu non...
Je n'ai pas dans mon code la partie avec le "global"...
Quest-ce que ce bout de code veut dire ?
Je n'ai pas dans mon code la partie avec le "global"...
Quest-ce que ce bout de code veut dire ?
Ha okkk mercii
Du coup mon code ressemble à cela :
Il ne me reste plus qu'à comprendre le fonctionnement des frames pour en cacher certaineset les redimensionner tout le temps à la meme taille que le fenetre
Merci à vous, vous m'avez bien aidé ;)
Du coup mon code ressemble à cela :
from tkinter import * def fenaceuilPY(): global window global windowPY global windowVI global windowPENDU global windowGMDP windowPY.destroy() fenetreaccueil() def fenaceuilVI(): global window global windowPY global windowVI global windowPENDU global windowGMDP windowVI.destroy() fenetreaccueil() def fenaceuilPENDU(): global window global windowPY global windowVI global windowPENDU global windowGMDP windowPENDU.destroy() fenetreaccueil() def fenaceuilGMDP(): global window global windowPY global windowVI global windowPENDU global windowGMDP windowGMDP.destroy() fenetreaccueil() def Pythagore(): global window global windowPY global windowVI global windowPENDU global windowGMDP # destruction de la fenetre principale window.destroy() # creation de la fenetre windowPY = Tk() windowPY.title('Pythagore') windowPY.geometry('1080x720') windowPY.config(background='blue') # Bouton de selection bouton_programe1 = Button(windowPY, text="Menu", font=("Helvetica", 20), bg='white', fg='grey', command=fenaceuilPY) bouton_programe1.pack(pady=25, fill=X) windowPY.mainloop() def Verbes_irreguliers(): global window global windowPY global windowVI global windowPENDU global windowGMDP # destruction de la fenetre principale window.destroy() # creation de la fenetre windowVI = Tk() windowVI.title('Verbes irreguliers') windowVI.geometry('1080x720') windowVI.config(background='blue') # Bouton de selection bouton_programe1 = Button(windowVI, text="Menu", font=("Helvetica", 20), bg='white', fg='grey', command=fenaceuilVI) bouton_programe1.pack(pady=25, fill=X) windowVI.mainloop() def Pendu(): global window global windowPY global windowVI global windowPENDU global windowGMDP # destruction de la fenetre principale window.destroy() # creation de la fenetre windowPENDU = Tk() windowPENDU.title('Pendu') windowPENDU.geometry('1080x720') windowPENDU.config(background='blue') # Bouton de selection bouton_programe1 = Button(windowPENDU, text="Menu", font=("Helvetica", 20), bg='white', fg='grey', command=fenaceuilPENDU) bouton_programe1.pack(pady=25, fill=X) windowPENDU.mainloop() def Generateur_de_mot_de_passe(): global window global windowPY global windowVI global windowPENDU global windowGMDP # destruction de la fenetre principale window.destroy() # creation de la fenetre windowGMDP = Tk() windowGMDP.title('Generateur de mots de passes') windowGMDP.geometry('1080x720') windowGMDP.config(background='blue') # creaton d'image width = 512 height = 512 canvas = Canvas(windowGMDP, width=width, height=height, bg='blue', bd=0, highlightthickness=0) canvas.pack(expand=YES) ## Bouton de selection bouton_programe1 = Button(windowGMDP, text="Menu", font=("Helvetica", 20), bg='white', fg='grey', command=fenaceuilGMDP) bouton_programe1.pack(expand=YES) windowGMDP.mainloop() def fenetreaccueil(): global window global windowPY global windowVI global windowPENDU global windowGMDP # creation du menu window = Tk() window.title('Exo-cours') window.geometry('1080x720') window.config(background='grey') # creation des boites frame = Frame(window, bg='grey') frame1 = Frame(frame, bg='grey') # creation du titre title = Label(frame, text='Bienvenue sur "Exo-cours" !', font=("Helvetica", 40), bg='grey') title.pack(expand=YES) # creation des consignes consigne = Label(frame, text='Veuillez choisir un sous-programme', font=("Helvetica", 35), bg='grey') consigne.pack(expand=YES) # creation des boutons bouton_programe1 = Button(frame1, text="Pythagore", font=("Helvetica", 20), bg='white', fg='grey', command=Pythagore) bouton_programe1.pack(pady=25, fill=X) bouton_programe2 = Button(frame1, text="Verbes irreguliers", font=("Helvetica", 20), bg='white', fg='grey', command=Verbes_irreguliers) bouton_programe2.pack(pady=25, fill=X) bouton_programe3 = Button(frame1, text="Pendu", font=("Helvetica", 20), bg='white', fg='grey', command=Pendu) bouton_programe3.pack(pady=25, fill=X) bouton_programe4 = Button(frame1, text="Generateur de mots de passe", font=("Helvetica", 20), bg='white', fg='grey', command=Generateur_de_mot_de_passe) bouton_programe4.pack(pady=25, fill=X) frame.pack(expand=YES) frame1.pack(expand=YES) window.mainloop() fenetreaccueil()
Il ne me reste plus qu'à comprendre le fonctionnement des frames pour en cacher certaineset les redimensionner tout le temps à la meme taille que le fenetre
Merci à vous, vous m'avez bien aidé ;)
Lastronaute_59
Messages postés
1
Date d'inscription
vendredi 28 mai 2021
Statut
Membre
Dernière intervention
28 mai 2021
>
Spirali
Modifié le 28 mai 2021 à 23:31
Modifié le 28 mai 2021 à 23:31
Et bien Mr Spirali, je ne vois pas ce que je pourrais y mettre d’autre qui me serais utile. Que voulez vous que je mettes d’autre dans
global? (Mon code ressemble maintenant à ça (que le
global)
global window, windowPY, windowVI, windowPENDU, windowGMDP)
Spirali
>
Lastronaute_59
Messages postés
1
Date d'inscription
vendredi 28 mai 2021
Statut
Membre
Dernière intervention
28 mai 2021
29 mai 2021 à 13:31
29 mai 2021 à 13:31
Ce que je voulais te faire comprendre l'ch'ti Lastronaute ;), c'est qu'il n'y a besoin de mettre global que sur les variables externes sur lesquelles tu agis dans tes fonctions, en réalité, il n'en faut qu'un par fonction, les autres ne servent à rien, tu ne travaillent pas avec ces autres variables.
def Pythagore(): global windowPY # Reste du code def Verbes_irreguliers(): global windowVI # Reste du code def Pendu(): global windowPENDU # Reste du code def Generateur_de_mot_de_passe(): global windowGMDP # Reste du code def fenetreaccueil(): global window # Reste du code