Python面向对象Tkinter-调用函数错误
我在登录框上有一个登录按钮,如果用户名条目中输入了“valid”,我希望登录按钮只将我带到AdminHome框。我无法使show_frame()函数在validate()函数(位于Login类中)中运行 我得到一个错误: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):
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我不知道控制器实际做什么,介意给我指一个可以用来学习的资源吗?控制器所做的一切都在该文件中定义。控制器是程序的一个实例。