我在登录框上有一个登录按钮,我希望登录按钮只带我到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()
答案 0 :(得分:0)
以下是我的方法:我将在您的登录框架中删除validate
方法,并单独定义一个验证函数。这看起来像这样:
def validate(user):
global app
print(user)
if user=="valid":
app.show_frame(AdminHome)
然后,在登录按钮的命令中,只需将其更改为:lambda: validate(self.user.get())
。