【发布时间】:2022-11-13 05:01:51
【问题描述】:
我正在使用 Python 和 Tkinter 创建一个带有用户身份验证和注册以及主页框架的 GUI。
提交功能将验证数据库中的凭据,对用户进行身份验证,然后应自动将它们传输到主页框架。
如何在不使用按钮而是在函数内切换帧?
class Application(Tk):
def __init__(self, *args, **kwargs):
Tk.__init__(self, *args, **kwargs)
container = 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 (UserLogin, HomePage, RegisterUser):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky = "nsew")
self.show_frame(UserLogin)
def show_frame(self, controller):
frame = self.frames[controller]
frame.tkraise()
class UserLogin(Frame):
db = mysql.connector.connect(
host="localhost",
port="XXXX",
user="XXXX",
passwd="XXXX",
database="XXXXX"
)
cursorObject = db.cursor()
def __init__(self, parent, controller):
Frame.__init__(self, parent)
controller = self.controller
self.title = Label(self, text="Welcomn!", font=("Arial", 15, 'bold'))
self.title.grid(row=1, column=1)
self.description = Label(self, text="Please login to get started:", font=("Arial", 10))
self.description.grid(row=2, column=1, pady=25, sticky=W)
self.usernametitle = Label(self, text="Username")
self.usernametitle.grid(row=3, column=1, sticky=W)
self.passwordtitle = Label(self, text="Password")
self.passwordtitle.grid(row=4, column=1, sticky=W)
self.username_input = Entry(self, width=30)
self.username_input.grid(row=3, column=1, sticky=E)
self.password_input = Entry(self, show="*", width=30)
self.password_input.grid(row=4, column=1, sticky=E)
self.submit_button = Button(self, text="Submit", command=self.submit)
self.submit_button.grid(row=5, column=1, pady=10, sticky=W)
self.register_button = Button(self, text="New user? Register here", command=lambda: controller.show_frame(RegisterUser))
self.register_button.grid(row=6, column=1, sticky=W)
def submit(self):
username = self.username_input.get()
password = self.password_input.get()
if(username == ""):
MessageBox.showinfo(title="Error", message="Username cannot be blank")
if(password == ""):
MessageBox.showinfo(title="Error", message="Password cannot be blank")
else:
self.loginto(username, password)
**# then switch to homepage frame**
UserLogin.controller.show_frame(Homepage)
def loginto(self, username, password):
query = "SELECT username, password FROM USER WHERE username ='" + username + "' AND password='" + password + "';"
self.cursorObject.execute(query)
myresult = self.cursorObject.fetchall()
if myresult:
print("success login")
return True;
else:
MessageBox.showinfo(title="Error", message="Incorrect username and/or password")
print("Incorrect")
return False;
我曾尝试在该函数中调用show_frame 函数,但它不起作用。
我已经审查了这个:Tkinter Open New Frame Without A Button Press
但这也不起作用,因为它在submit 函数而不是__init__ 内部,因此没有控制器。
更新我添加了传递实例变量并获得以下回溯:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\c\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
return self.func(*args)
File "C:\Users\c\eclipse-workspace\Medix.py", line 88, in submit
controller = UserLogin.self.controller
AttributeError: type object 'UserLogin' has no attribute 'self'
谢谢,
【问题讨论】:
-
需要将传递给实例变量的
controller保存起来,比如self.controller在UserLogin.__init__()里面,然后可以调用self.controller.show_frame(HomePage)来切换帧。 -
谢谢!我试过了,添加了自我。 UserLogin.__init__() 中的控制器,然后尝试在提交函数中调用它,但给了我一个属性错误!
-
什么属性错误?使用更改和完整回溯更新您的问题。
-
您需要创建一个
UserLogin实例。例如,login = UserLogin()/login.controller.show_frame(Homepage)。 -
谢谢蒂姆!这样,我得到以下回溯: TypeError: UserLogin.__init__() missing 2 required positional arguments: 'parent' 和 'controller'.. 如果我尝试将它们添加到参数中,它仍然会失败。