Passer d'un fenêtre à une autre

Gabibarre -  
 Gabibarre -
Salut à tous,
alors mon problème c'est que j'aimerai, avec tkinter, avoir une fenêtre sur laquelle il y a un bouton qui m'ouvre une autre fenêtre et qui ferme en mémé temps la première.

Ou alors il me faudrait une technique me permettant de totalement changer totalement ce qu'il y a dans la fenêtre quand je clique sur un bouton.


from tkinter import *

def test():
acceuil()
sys.exit()

def fenetre():
fenetre = Tk()
champ_label = Label(fenetre, text="Salut !")
champ_label.pack()
bouton = Button(fenetre,text="Acceuil", command=test)
bouton.pack()
fenetre.mainloop()

def acceuil():
fenetre = Tk()
champ_label = Label(fenetre, text="ACCEUIL")
champ_label.pack()
fenetre.mainloop()

if __name__ == '__main__':
fenetre()


Pour l'instant je suis parti sur la première solution et j'en suis là.

1 réponse

  1. dragoflyy
     
    2 techniques, l'une plus claire que l'autre.
    version brute:
    from tkinter import *
    global fenetre1, fenetre2
    
    def test():
        global fenetre1, fenetre2
        fenetre1.destroy()
        acceuil()
    
    def fenetre():
        global fenetre1
        fenetre1 = Tk()
        champ_label = Label(fenetre1, text="Salut !")
        champ_label.pack()
        bouton = Button(fenetre1,text="Acceuil", command=test)
        bouton.pack()
        fenetre1.mainloop()
    
    def acceuil():
        global fenetre2
        fenetre2 = Tk()
        champ_label = Label(fenetre2, text="ACCEUIL")
        champ_label.pack()
        fenetre2.mainloop()
    
    
    if __name__ == '__main__':
        fenetre()
    


    ou la version propre:
    class fenetres():
        def __init__(self):
            self.f = Tk()
            champ_label = Label(self.f, text="Salut !")
            champ_label.pack()
            bouton = Button(self.f,text="Acceuil", command=self.test)
            bouton.pack()
            self.f.mainloop()
        def acceuil(self):
            self.f2 = Tk()
            c_l = Label(self.f2, text="ACCEUILL")
            c_l.pack()
            self.f2.mainloop()
        def test(self):
            self.f.destroy()
            self.acceuil()
    
    sart = fenetres()
    


    espérant être assez clair et avoir répondu a ta question. :)
    3
    1. Gabibarre
       
      j'utilise plus particulièrement ta première solution qui marche très bien merci. Peux tu m'expliquer ton raisonnement que je puisse adapter ce code de manière à ce que la fonction marche pour un grand nombre de fenetres ?
      merci de ton aide
      0
    2. Gabibarre
       
      voila un brouillon de ce que j'essaye de faire :
      from tkinter import *
      global fenetre1, fenetre2

      def test(a, b): #a= fenetre a fermer, b=fenetre a ouvrir
      global fenetre1, fenetre2 #je sais pas a quoi ca sert
      a.destroy()
      b()

      def fenetre():
      global fenetre1
      fenetre1 = Tk()
      champ_label = Label(fenetre1, text="Salut !")
      champ_label.pack()
      bouton = Button(fenetre1,text="Acceuil", command=test(fenetre1, acceuil)) #boutton 1
      bouton.pack()
      bouton1 = Button(fenetre1,text="Acceuil", command=test(fenetre1, page)) #boutton 2
      bouton1.pack()
      fenetre1.mainloop()

      def acceuil():
      global fenetre2
      fenetre2 = Tk()
      champ_label = Label(fenetre2, text="ACCEUIL")
      champ_label.pack()
      fenetre2.mainloop()

      def page(): #deuxième fenetre a ouvrir
      global fenetre3
      fenetre3 = Tk()
      champ_label = Label(fenetre3, text="page")
      champ_label.pack()
      fenetre3.mainloop()


      if __name__ == '__main__':
      fenetre()


      sauf que la fenêtre "acceuil" s'ouvre directement sans passer par la fenetre des boutons.
      Précisément, j'ai cette erreur :
      Traceback (most recent call last):
      File "<module1>", line 37, in <module>
      File "<module1>", line 15, in fenetre
      File "C:\Program Files (x86)\EduPython\App\lib\tkinter\__init__.py", line 2087, in __init__
      Widget.__init__(self, master, 'button', cnf, kw)
      File "C:\Program Files (x86)\EduPython\App\lib\tkinter\__init__.py", line 2017, in __init__
      (widgetName, self._w) + extra + self._options(cnf))
      _tkinter.TclError: can't invoke "button" command: application has been destroyed


      J'espère que tu pourra m'aider.
      1
    3. dragoflyy
       
      ok. il n'y a pas vraiment de raisonnement, c'est juste que pour fermer et ouvrir une fenêtre, tu ne peux pas tout faire en une commande à ma connaissance, donc tu dois passer par une fonction ( ici "test()" ) puis la fonction test appelle la fonction accueil qui ouvre la deuxième fenêtre.

      en fait, ton problème, est que lorsque tu créer le bouton pour quitter le première fenêtre, tu appelle la fonction pour quitter la fenêtre en même temps. python comprend que tu veux quitter la fenêtre alors qu'elle n'est pas encore ouverte, donc il crash.

      par ailleurs, tu ne peux pas lancer une fonction a partir d'une variable en string (des lettres) reste quand même bien compliquer. soit je te propose de créer soit une fonction test() pour chacun de tes boutons qui ouvrent une fenêtre, soit comme ceci:

      from tkinter import *
      # tous les global ne servent plus a rien, ils permettaient de transmettre les variables d'une fonction a une autre.
      
      def test(a, b):
          a.destroy()
          if b == 0:
              accueil()
           elif b == 1:
              page()
          elif b == 2:
              fenetre()
      
      def fenetre():
          fenetre1 = Tk()
          label = Label(fenetre1, text="Salut !")
          label.pack()
          bouton = Button(fenetre1, text="accueil", command= lambda x=0:test(fenetre1, x)) 
          # me demande pas pourquoi, python c'est chelou, seul technique qui marche ^^
          bouton.pack()
          bouton1 = Button(fenetre1, text="page", command= lambda x=1:test(fenetre1, x))
          bouton1.pack()
          fenetre1.mainloop()
      
      def accueil():
          fenetre2 = Tk()
          l = Label(fenetre2, text="Page d'accueil")
          l.pack()
          # à rajouter si tu veux, enfin tu vois le genre quoi.
          #bouton = Button(fenetre2, text="fenetre", command= lambda x=2:test(fenetre2, x))
          #bouton.pack()
          #bouton1 = Button(fenetre2, text="page", command= lambda x=0:test(fenetre2, x))
          #bouton1.pack()
          fenetre2.mainloop()
      
      def page():
          fenetre3 = Tk()
          l = Label(fenetre3, text="seconde page")
          l.pack()
          fenetre3.mainloop()
      
      if __name()__ == '__main__':
          fenetre()
      
      
      
      0
    4. Gabibarre
       
      Merci, grace a cette méthode je peux l'appliquer a tout mon programme ce qui fqit plus net.

      Merci de ton aide :)
      0