Passer d'un fenêtre à une autre

Fermé
Gabibarre - 20 mars 2016 à 17:06
 Gabibarre - 1 avril 2016 à 10:08
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

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
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
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
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
Merci, grace a cette méthode je peux l'appliquer a tout mon programme ce qui fqit plus net.

Merci de ton aide :)
0