2017-10-26 53 views
0

Brian이 "tkinter에서 두 프레임 전환"에 대한 MVC 모델을 수행하고 있습니다. 그는 서로의 위에 프레임을 겹쳐 쌓습니다 (모두 처음부터 만들어졌습니다). 그런 다음 우리는 의지대로 프레임을 보여줍니다.MVC 모델. 프레임 간 전환 : 실행시 새 프레임 추가

실행 중에 다른 프레임을 추가하려고합니다. 나는 그것이 만들어 졌음을 안다. (오류를 만들기 전에 오류가 생기고 오류가 없기 때문에), 나는 그것을 보여줄 수 없다. 내가 뭘 놓치고 있니? 감사

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, PageTwo): 
      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_new(self): 
     ''' Create a new frame on the run ''' 
     self.frames["PageNew"] = PageNew(parent=tk.Frame(self), controller=self) 
     self.frames["PageNew"].grid(row=0, column=0, sticky="nsew")  


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) 

     button1 = tk.Button(self, text="Go to Page One", 
         command=lambda: controller.show_frame("PageOne")) 
     button2 = tk.Button(self, text="Go to Page Two", 
         command=lambda: controller.show_frame("PageTwo")) 
     button3 = tk.Button(self, text="Go to a New Page ", 
         command=lambda: controller.show_frame("PageNew"))   
     button1.pack() 
     button2.pack() 
     button3.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) 
     button = tk.Button(self, text="Create a new page and go to the start page", 
         command=self.on_click) 
     button.pack() 

    def on_click(self): 
     self.controller.add_new() 
     self.controller.show_frame("StartPage")  


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", font=controller.title_font) 
     label.pack(side="top", fill="x", pady=10) 
     button1 = tk.Button(self, text="Go to the start page", 
         command=lambda: controller.show_frame("StartPage")) 
     button2 = tk.Button(self, text="Go to the new page", 
         command=lambda: controller.show_frame("PageNew"))   
     button1.pack() 
     button2.pack() 

class PageNew(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="This is the new page", 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() 

답변

1

귀하의 문제는 PageNew의 부모 :

self.frames["PageNew"] = PageNew(parent=tk.Frame(self), controller=self)

그 부모가 만든 Frame이지만, 당신이 그것을 볼 수 없습니다, 그래서 그것은 GUI 내부 포장되지 않은 , 그 자식도 아니다. PageNew. PageNew이 다른 페이지와 같아 지려면 여기에 container이라는 동일한 상위 페이지를 지정해야합니다. 외부에 container이 필요하므로 SampleApp의 속성으로 지정해야합니다. 즉 container = tk.Frame(self)self.container = tk.Frame(self)으로 바꿔야합니다.

그리고 지금, add_new, 당신은 만들 수 있습니다 PageNew

self.frames["PageNew"] = PageNew(parent=self.container, controller=self)