Probleme TKinter plusieurs fenetres

Résolu
Lastronaute -  
 Spirali -
Bonjour,
je souhaite creer une application avec Tkinter mais il me faut plusieurs pages, mon code créé plusieurs pages grace à des fonctions mais lorsque je veux faire un bouton pour revenir sur la premiere page, une erreur se produit. J'en ai donc déduit qu'il y a une autre solution mais je ne l'ai pas encore trouvé. Si quelqu'un d'entre vous à la solution je suis preneur.
Voici mon code :
from tkinter import *

def Pythagore():

	# destruction de la fenetre principale
	window.destroy()

	# creation de la fenetre
	windowPY = Tk()

	windowPY.title('Pythagore')
	windowPY.geometry('1080x720')
	windowPY.iconbitmap('logo.ico')
	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():

	# destruction de la fenetre principale
	window.destroy()

	# creation de la fenetre
	windowVI = Tk()

	windowVI.title('Verbes irreguliers')
	windowVI.geometry('1080x720')
	windowVI.iconbitmap('logo.ico')
	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():

	# destruction de la fenetre principale
	window.destroy()

	# creation de la fenetre
	windowPENDU = Tk()

	windowPENDU.title('Pendu')
	windowPENDU.geometry('1080x720')
	windowPENDU.iconbitmap('logo.ico')
	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():

	# destruction de la fenetre principale
	window.destroy()

	# creation de la fenetre
	windowGMDP = Tk()
	
	windowGMDP.title('Generateur de mots de passes')
	windowGMDP.geometry('1080x720')
	windowGMDP.iconbitmap('logo.ico')
	windowGMDP.config(background='blue')

	# creaton d'image
	width = 512
	height = 512
	image = PhotoImage(file="password_generateur.png").zoom(7).subsample(10)
	canvas = Canvas(windowGMDP, width=width, height=height, bg='blue', bd=0, highlightthickness=0)
	canvas.create_image(width/2, height/2, image=image)
	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():

	# creation du menu
	window = Tk()
	window.title('Exo-cours')
	window.geometry('1080x720')
	window.iconbitmap('logo.ico')
	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()


Merci d'avance pour votre aide !
Lastronaute

Configuration: Macintosh / Chrome 90.0.4430.212

12 réponses

  1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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)
    1
  2. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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) ?
    # -*- 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()
    
    1
  3. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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

    window.destroy()


    fonctionne partout

    ce qui manque encore, c'est de détruire la fenêtre secondaire quand on revient à la principale
    1
  4. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Tu peux raccourcir ton code :

    global window, windowPY, windowVI, windowPENDU, windowGMDP
    1
    1. Lastronaute
       
      Ok merci Monsieur Phil ;)
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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

    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
    0
  7. Lastronaute
     
    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
    0
  8. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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 ...
    0
  9. Lastronaute
     
    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.
    0
  10. Lastronaute
     
    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()
    0
  11. Lastronaute
     
    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
    0
    1. Lastronaute
       
      Ha ca y est j'ai réussi j'ai juste enlevé le "window.destroy()" au debut de ma fonction
      0
  12. Lastronaute
     
    Heu non...
    Je n'ai pas dans mon code la partie avec le "global"...
    Quest-ce que ce bout de code veut dire ?
    0
  13. Lastronaute
     
    Ha okkk mercii

    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é ;)
    0
    1. Spirali
       
      Tu n'as pas compris à quoi servait l'instruction
      global
      à première vue.

      Dans ton code, tu n'as a utiliser en tout et pour tout que 5 fois l'utilisation de cette instruction.
      0
      1. Lastronaute_59 Messages postés 3 Statut Membre > Spirali
         
        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
        )
        0
      2. Spirali > Lastronaute_59 Messages postés 3 Statut Membre
         
        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
        0