Je suis le MVC model que Brian a fait sur la réponse à "Basculer entre deux images dans tkinter". Il empile les cadres les uns sur les autres (tous sont faits au tout début) et ensuite nous les montrons à notre volonté.Modèle MVC tkinter. Basculer entre les cadres, ajouter un nouveau
Est-il possible d'ajouter une autre image une fois que le programme a commencé à s'exécuter ou seulement avec ce modèle, vous pouvez voir les images qui sont faites au début? (Merci aux réponses données j'ai été capable de comprendre comment le faire)
Mais il y a toujours un problème avec la page deux, car il n'est pas 100% indépendant. Chaque fois qu'il appelle le cadre, il ne démarre pas à partir de strach.
Voici les modifications que j'ai apportées au code.
import tkinter as tk # python 3
from tkinter import font as tkfont # python 3
#import Tkinter as tk # python 2
#import tkFont as tkfont # python 2
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")
# the container is where we'll stack a bunch of frames
# on top of each other, then the one we want visible
# will be raised above the others
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
# put all of the pages in the same location;
# the one on the top of the stacking order
# will be the one that is visible.
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame("StartPage")
def show_frame(self, page_name):
'''Show a frame for the given page name'''
frame = self.frames[page_name]
frame.tkraise()
def add_PageTwo (self):
self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
#container.grid_rowconfigure(0, weight=1)
#container.grid_columnconfigure(0, weight=1)
self.frames["PageTwo"] = PageTwo(parent=container, controller=self)
self.frames["PageTwo"].grid(row=0, column=0, sticky="nsew")
self.show_frame("PageTwo")
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text="This is the start page", font=controller.title_font)
label.pack(side="top", fill="x", pady=10)
button2 = tk.Button(self, text="Go to Page One",
command=lambda: controller.show_frame("PageOne"))
button2.pack()
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text="This is page 1", font=controller.title_font)
label.pack(side="top", fill="x", pady=10)
button1 = tk.Button(self, text="Go to the page 2",
command=lambda: controller.add_PageTwo())
button1.pack()
button2 = tk.Button(self, text="Go to the start page",
command=lambda: controller.show_frame("StartPage"))
button2.pack()
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text="This is page 2. GREAT", font=controller.title_font)
label.pack(side="top", fill="x", pady=10)
button = tk.Button(self, text="Go to the start page",
command=lambda: controller.show_frame("StartPage"))
button.pack()
if __name__ == "__main__":
app = SampleApp()
app.mainloop()
Ce n'est pas un problème pour faire de nouveaux cadres. Si les autres cadres sont soit un attribut de classe, soit quelque chose comme une liste ou un dict qui est un attribut, vous pouvez ajouter ce nouveau cadre à un cadre existant. –
@SierraMountainTech Merci. J'ai (presque) résolu ce problème comme vous pouvez le voir dans ma réponse. – ogeretal