如何使按钮更改框架并调用函数(tkinter)

时间:2017-03-17 12:58:05

标签: python tkinter

我有一段在tkinter中使用帧的代码。按下后退按钮时,我希望更改框架,并调用销毁标签的功能。目前我有以下代码:

b2=Button(self, text="Back", command=lambda: controller.show_frame("StartPage"))
b2.pack()

按下按钮时更改框架。

我尝试制作一个新功能,并在按下按钮而不是控制器时调用它:

def moveOn(self):
    controller.show_frame("StartPage")
    self.l6.destroy()

但是我得到了没有定义控制器的错误。

如何解决我的问题,或者有更好的方法来解决这个问题?

如果我需要提供更多代码,请告诉我。

1 个答案:

答案 0 :(得分:0)

使用提议的源代码,如果类中的变量controller具有b2=Button(...)而类中没有moveOn(),则可以重用command=lambda: ...而不是假定的command=self.moveOn

  

变量controller肯定是其中的一个参数   class __init__()构造函数。所以,它是一个局部变量   在函数moveOn()被调用之前不会退出。

解决方案1 ​​ - 使用command=lambda:constroller发送到函数moveOn()

  

首先修改"返回"的command Button

b2=Button(self, text="Back", command=lambda: self.moveOn(controller))
b2.pack()

而不是:

b2=Button(self, text="Back", command=self.moveOn)
b2.pack()
  

然后将controller添加为moveOn()参数。

def moveOn(self,controller):
    controller.show_frame(LoginPage)
    self.l6.destroy()

而不是:

def moveOn(self):
    controller.show_frame("StartPage")
    self.l6.destroy()

解决方案2 - 将参数controller存储为类变量。

  

在具有__init__()

的班级的b2=Button(...)函数中
def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    ...
    self.controller = controller
    ...
  

moveOn()中使用该变量:

def moveOn(self,controller):
    self.controller.show_frame(LoginPage)
    self.l6.destroy()