2017-09-06 69 views
0

从Bryan Oakley给出的问题“在tkinter中的两帧之间切换”的问题中,我改变了第二页中按钮的工作方式。使用函数在tkinter中的帧之间切换

在第一页,command=lambda: controller.show_frame(“StartPage”),它的工作原理应该如此。

在第二页上,我想添加一些内容然后回去,但它不起作用。

为什么我的回调没有被调用?

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

这是为什么? go_to定义如下:

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

所以当Python中遇到command=self.go_to(),它调用go_to,并将返回值的command选项。 这个值是None(暗示没有return声明),所以你的命令是None,你的按钮没有任何作用。

您需要删除括号,因此必须有tk.Button(self, ..., command=self.go_to)

+0

谢谢。它在我眼前,我看不见它。谢谢 – ogeretal

+0

只有一个moe的问题,如果go_to使用一个参数来做某件事,然后又回到StartPage,那么你如何实现它(因为现在需要括号)? – ogeretal

+0

@ogeretal将它包装在一个无参数函数中,或者使用一个lambda,比如'command = lambda:self.go_to(x,y)'。这个lambda表示“那个不带参数的函数,它用x和y调用f”,所以它是一个按预期的函数。 –