Python面向对象Tkinter-调用函数错误

Python面向对象Tkinter-调用函数错误,python,oop,python-3.x,tkinter,tk,Python,Oop,Python 3.x,Tkinter,Tk,我在登录框上有一个登录按钮,如果用户名条目中输入了“valid”,我希望登录按钮只将我带到AdminHome框。我无法使show_frame()函数在validate()函数(位于Login类中)中运行 我得到一个错误: NameError: global name 'show_frame' is not defined 如何克服此错误并使其运行 import tkinter as tk from tkinter import ttk class Program(tk.Tk):

我在登录框上有一个登录按钮,如果用户名条目中输入了“valid”,我希望登录按钮只将我带到AdminHome框。我无法使show_frame()函数在validate()函数(位于Login类中)中运行

我得到一个错误:

NameError: global name 'show_frame' is not defined
如何克服此错误并使其运行

import tkinter as tk
from tkinter import ttk

class Program(tk.Tk):        
    def __init__(self, *args, **kwargs):   
        tk.Tk.__init__(self, *args, **kwargs)

        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 (Login, AdminHome):

            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row = 0, column = 0, sticky = "nsew")

        self.show_frame(Login)

    def show_frame(self,cont):
        frame = self.frames[cont]
        frame.tkraise()


class Login(tk.Frame):

    def __init__(self, parent, controller):        
        tk.Frame.__init__(self, parent)

        innerFrame = tk.Frame(self)
        innerFrame.place(relx=.5, rely=.5, anchor="c")        

        pagename = tk.Label(innerFrame, text = "iDea Academy Progress Tracker Login")
        pagename.grid(row=0, columnspan=5, sticky="W"+"E")


        username = tk.Label(innerFrame, text="Username: ")
        username.grid(row=1, columnspan=2, sticky="W")

        self.user = ttk.Entry(innerFrame, text ="", width=45)
        self.user.grid(row=1, column=2 ,columnspan=3, sticky="w")


        password = tk.Label(innerFrame, text="Password: ")
        password.grid(row=2, columnspan=2, sticky="W")

        self.passentry = ttk.Entry(innerFrame, text ="", width=45, show="*")
        self.passentry.grid(row=2, column=2 ,columnspan=3, sticky="W")


        login = ttk.Button(innerFrame, text = "Login", command = self.validate)
        login.grid(row=3, columnspan=5, sticky="W"+"E")

    def validate(self):
        if self.user.get()=="valid":
            show_frame(AdminHome)

class AdminHome(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        fetch = ttk.Button(self, text = "Fetch Data", command = lambda: controller.show_frame(AdminHome))
        fetch.grid(row=2, columnspan=6, sticky="W"+"E")



app = Program()
app.state('zoomed')
app.mainloop()

下面是我的方法:我将去掉登录框架中的
validate
方法,分别定义一个验证函数。这看起来像这样:

def validate(user):
    global app
    print(user)
    if user=="valid":
        app.show_frame(AdminHome)

然后,在登录按钮的命令中,只需将其更改为:
lambda:validate(self.user.get())

回到您复制的原始代码,注意它如何调用
show\u frame
@BryanOakley“show\u frame”在我的旧代码中是使用“lambda:controller.show\u frame(AdminHome)”调用的,但在“validate()”函数中使用时不起作用。所以问问自己:
controller
是什么,为什么它有意义?您不应该只是复制代码并希望使其正常工作,您需要先理解代码,然后再尝试更改它。@BryanOakley我不知道控制器实际做什么,介意给我指一个可以用来学习的资源吗?控制器所做的一切都在该文件中定义。控制器是
程序的一个实例。