Bonjour à tous,

Je m'excuse par avance si ma question vous semble trivial, mais je me considère comme étant un (grand) débutant en Python.
J'ai effectué des recherches pour résoudre mon problème, autant ici que sur Stack Overflow, ainsi que mon moteur de recherche préféré. Sans résultat concluant !

Contexte : Je souhaite créer une application sur la base de différents formulaires, en passant de l'un à l'autre par le biais d'un menu. A chaque nouvelle "ouverture", le formulaire doit se réinitialiser.
J'ai trouvé plusieurs approches pour créer une application multiforme, mais une seule permettant cette réinitialisation. Je m'en suis donc inspiré.
Cette approche utilise la méthode .pack() pour placer les différents widgets. Compte tenu de mes besoins, je souhaitais passer par la méthode .place()

Suite à mes remplacements, je me rend compte que l'outil ne fonctionne plus : rien ne s'affiche dans ma fenêtre.
En farfouillant, j'en suis venu à remplacer "self" par "master" ou "master._frame" lors de la création de l'objet. Mais alors, un autre problème apparaît : les widgets ne sont plus effacés lors du passage d'un formulaire à l'autre.

Avez-vous une idée de comment remédier à l'un de ces inconvénients ? Une lecture accessible me permettant de comprendre le pourquoi du comment ? (En français ou anglais, pas de problèmes !)

Ci-dessous un exemple apuré du code initial, avec commentaires :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
 
import tkinter as tk
 
 
class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(StartPage)
 
    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()
 
 
# Toutes les pages seront dans d'autres modules/fichiers que le SampleApp
# Je regroupe ça ici pour simplifier !
class StartPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
 
        # avec la méthode .pack() tout fonctionne correctement, mais ça va être compliqué pour organiser les GUI
        # si je remplace par .place(), rien de s'affiche, sauf si je change aussi
        # le "self" en "master", par ex pour le label :
 
        # tk.Label(master, text="This is the start page").place(relx=0.1, rely=0.1)
 
        # par contre en faisant comme ça, la méthode "switch_frame" de SampleApp n'efface plus les widgets
        # quand je passe d'une page à l'autre
 
        # En gros mon objectif : avoir le même fonctionnement, mais en utilisant .place()
 
        tk.Label(self, text="This is the start page").pack(side="top", fill="x", pady=10)
        tk.Button(self, text="Open page one",
                  command=lambda: master.switch_frame(PageOne)).pack()
        tk.Button(self, text="Open page two",
                  command=lambda: master.switch_frame(PageTwo)).pack()
 
 
class PageOne(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
 
        # Problème identique à Startpage
 
        tk.Label(self, text="This is page one").pack(side="top", fill="x", pady=10)
        tk.Button(self, text="Return to start page",
                  command=lambda: master.switch_frame(StartPage)).pack()
        tk.Button(self, text="Open page two",
                  command=lambda: master.switch_frame(PageTwo)).pack()
 
 
class PageTwo(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
 
        # Problème identique à Startpage
 
        tk.Label(self, text="This is page two").pack(side="top", fill="x", pady=10)
        tk.Button(self, text="Return to start page",
                  command=lambda: master.switch_frame(StartPage)).pack()
 
 
if __name__ == "__main__":
    app = SampleApp()
    app.geometry("300x300")
    app.mainloop()
En vous remerciant par avance pour vos lumières,

Jacques