如何解决无法在 tkinter 框架之间导航它显示属性错误
我浏览了几篇关于在 tkinter 框架之间导航的帖子,但没有发现这些有用。我正在尝试创建一个应用程序。我有一个登录页面和主页。我想在登录页面中提交按钮的单击事件上在这两个框架之间导航。单击提交按钮时,我使用了两个函数。我也做了数据库连接。
当程序执行时,它显示登录页面。当我点击提交按钮输入详细信息后,它显示属性错误。
以下是我执行的代码。
import tkinter as tk
from tkinter import ttk
import MysqL.connector
from tkinter import messageBox
class App(tk.Tk):
bg_img_path = "images\\bg9.png"
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.geometry("1500x750")
main_frame = tk.Frame(self,width=200,height=50,highlightbackground="black",highlightthickness=1,background="#e6ffe6")
main_frame.pack(side='top',fill='both',expand='True')
main_frame.grid_rowconfigure(0,weight=1)
main_frame.grid_columnconfigure(0,weight=1)
self.bkgr_image = tk.PhotoImage(file=self.bg_img_path)
self.frames = {}
for F in (LoginPage,HomePage):
page_name = F.__name__
frame = F(main_frame,self)
self.frames[page_name] = frame
frame.grid(row=0,column=0,sticky='nsew')
self.show_frame(LoginPage)
def show_frame(self,container):
frame = self.frames[container]
frame.tkraise()
class BasePage(tk.Frame):
def __init__(self,parent,controller):
super().__init__(parent)
label_bkgr = tk.Label(self,image=controller.bkgr_image)
label_bkgr.place(x=0,y=0)
class LoginPage(BasePage,tk.Frame):
def __init__(self,controller):
super().__init__(parent,controller)
login_frame = tk.Frame(self,background="#e6ffe6")
login_frame.grid(row=400,column=20,padx=500,pady=250)
self.label_title = tk.Label(login_frame,text="Log In",font=("Helvetica",40),bg="#e6ffe6")
self.label_title.grid(row=0,padx=10,pady=10)
self.label_username = tk.Label(login_frame,text="Username",20),bg="#e6ffe6")
self.label_username.grid(row=50,pady=10)
self.entry_username = tk.Entry(login_frame,width=15,20))
self.entry_username.grid(row=50,column=30,pady=10)
self.label_password = tk.Label(login_frame,text="Password",bg="#e6ffe6")
self.label_password.grid(row=60,pady=10)
self.entry_password = tk.Entry(login_frame,20))
self.entry_password.grid(row=60,pady=10)
self.login_button = tk.Button(login_frame,command=lambda: [self.submit,App.show_frame(self,HomePage)],bg="#e6ffe6")
self.login_button.grid(row=70,column=25,pady=10)
def submit(self):
self.u_name = self.entry_username.get()
self.p_word = self.entry_password.get()
employee = MysqL.connector.connect(host="localhost",user="root",password="",database="edatabase")
cursor_variable = employee.cursor()
cursor_variable.execute("INSERT INTO login VALUES ('" + self.u_name + "','" + self.p_word + "')")
employee.commit()
employee.close()
messageBox.showinfo("Log In","Succesfull")
class HomePage(BasePage):
def __init__(self,controller)
label1 = ttk.Label(self,text='Home',20))
label1.pack(padx=10,pady=10)
app = App()
app.mainloop()
C:\Users\write\AppData\Local\Programs\Python\python39\python.exe "C:/Users/write/PycharmProjects/OOP trials/login_bg_img_trial2.py"
Traceback (most recent call last):
File "C:\Users\write\PycharmProjects\OOP trials\login_bg_img_trial2.py",line 97,in <module>
app = App()
File "C:\Users\write\PycharmProjects\OOP trials\login_bg_img_trial2.py",line 30,in __init__
self.show_frame(LoginPage)
File "C:\Users\write\PycharmProjects\OOP trials\login_bg_img_trial2.py",line 33,in show_frame
frame = self.frames[container]
KeyError: <class '__main__.LoginPage'>
Process finished with exit code 1
感谢任何帮助。
解决方法
在您的 App.__init__
更改中:
self.show_frame(LoginPage)
到
self.show_frame("LoginPage")
您拥有的字典 (self.frames
) 包含作为键的帧名称和作为值的帧实例。
还将 self.controller = controller
添加到 BasePage.__init__
以便您可以保留对 controller
的引用。
这将允许您更改
self.login_button = tk.Button(...,command=lambda: [...,App.show_frame(self,HomePage)])
进入:
self.login_button = tk.Button(...,self.controller.show_frame("HomePage")])
这应该可以解决所有问题
请注意,正如@Atlas435 所说,您不需要 tk.Frame
中的 class LoginPage(BasePage,tk.Frame)
。同样在 lambda 中使用列表来执行函数是不符合 Python 的。定义一个新函数更容易。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。