2017-09-11 6 views
1

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() 
+0

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. –

+0

@SierraMountainTech Merci. J'ai (presque) résolu ce problème comme vous pouvez le voir dans ma réponse. – ogeretal

Répondre

1

L'erreur est à la définition de la classe PageNew:

class PageNew(tk.Frame, parent, controller): 
    ... 

Les noms entre parenthèses sont les classes dont PageNew héritera, alors que vous vouliez probablement dire de les transmettre en tant que paramètres de votre méthode __init__ .

À ce stade du script, parent fait référence à une variable de niveau module nommée parent. Cependant, une telle variable n'existe pas, entraînant NameError.

Vous devez supprimer ces éléments et conserver uniquement tk.Frame. En ce qui concerne votre question, oui, il est possible de créer des cadres lors de l'exécution, puis de les montrer. Ils n'ont pas besoin d'être tous créés lors de l'initialisation.

+0

Merci pour votre réponse. Je l'ai utilisé et poster ma nouvelle solution dans la question. Presque là ... – ogeretal