2017-09-06 14 views
0

Bryan Oakley가 제공 한 답변에서 "tkinter에서 두 프레임 사이를 전환"이라는 질문에 대해 2 페이지에서 버튼의 작동 방식을 변경하려고합니다.함수를 사용하여 tkinter에서 프레임 사이를 전환

페이지에서 하나는 command=lambda: controller.show_frame(“StartPage”)으로, 제대로 작동합니다.

2 페이지에서 뭔가 추가하고 다시 돌아가지만 작동하지 않습니다.

내 콜백이 호출되지 않는 이유는 무엇입니까?

import tkinter as tk    # python 3 
from tkinter import font as tkfont # python 3 

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


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


if __name__ == "__main__": 
    app = SampleApp() 
    app.mainloop() 

답변

0

문제는 Buttoncommand 키워드 인수는 함수를 취한다는 것입니다. tk.Button(self, ..., command=self.go_to())으로 단추를 만들면 명령은 self.go_to()이고이 값은 None입니다.

왜 그렇습니까? 파이썬은 command=self.go_to() 건너 올 때

def go_to(self): 
    # Add something to do 
    self.controller.show_frame("StartPage") 

그래서, 그것은 go_to를 호출하고 command 옵션에 반환 된 값을 전달 다음과 같이 go_to가 정의됩니다. 이 값은 None이며 ( return 문이 없음) 명령은 None이므로 단추는 적용되지 않습니다.

괄호를 제거해야하므로 tk.Button(self, ..., command=self.go_to)이어야합니다.

+0

감사합니다. 그것은 내 눈 앞에 있었고 나는 그것을 볼 수 없었다. 감사합니다 – ogeretal

+0

go_to가 매개 변수를 사용하여 무언가를 수행 한 다음 StartPage로 돌아 가면 단 한번의 질문입니다. 어떻게 구현합니까 (괄호가 필요하기 때문에)? – ogeretal

+0

@ogeretal 인수없이 함수를 감싸거나'command = lambda : self.go_to (x, y)'와 같은 람다를 사용하십시오. 그 람다는 "인수를 취하지 않고 x와 y로 f를 호출하는 함수"를 의미하므로 예상 한 함수입니다. –