Python 无法在tkinter帧之间导航。它显示属性错误
我浏览了几篇关于tkinter框架之间导航的帖子,但没有发现这些有用的东西。我正在尝试创建一个应用程序。我有一个登录页面和主页。我想在登录页面中提交按钮的点击事件上在这两个框架之间导航。我在点击提交按钮时使用了两个功能。我也做了数据库连接 当程序执行时,它显示登录页面。当我点击提交按钮输入详细信息后,它显示属性错误 下面是我执行的代码Python 无法在tkinter帧之间导航。它显示属性错误,python,object,oop,tkinter,attributeerror,Python,Object,Oop,Tkinter,Attributeerror,我浏览了几篇关于tkinter框架之间导航的帖子,但没有发现这些有用的东西。我正在尝试创建一个应用程序。我有一个登录页面和主页。我想在登录页面中提交按钮的点击事件上在这两个框架之间导航。我在点击提交按钮时使用了两个功能。我也做了数据库连接 当程序执行时,它显示登录页面。当我点击提交按钮输入详细信息后,它显示属性错误 下面是我执行的代码 import tkinter as tk from tkinter import ttk import mysql.connector from 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, parent, controller):
super().__init__(parent, controller)
login_frame = tk.Frame(self, width=200, height=50, highlightbackground="black", highlightthickness=1,
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, column=20, padx=10, pady=10)
self.label_username = tk.Label(login_frame, text="Username", font=("Helvetica", 20), bg="#e6ffe6")
self.label_username.grid(row=50, column=20, padx=10, pady=10)
self.entry_username = tk.Entry(login_frame, width=15, font=("Helvetica", 20))
self.entry_username.grid(row=50, column=30, padx=10, pady=10)
self.label_password = tk.Label(login_frame, text="Password", font=("Helvetica", 20), bg="#e6ffe6")
self.label_password.grid(row=60, column=20, padx=10, pady=10)
self.entry_password = tk.Entry(login_frame, width=15, font=("Helvetica", 20))
self.entry_password.grid(row=60, column=30, padx=10, pady=10)
self.login_button = tk.Button(login_frame, text="Log In", command=lambda: [self.submit,App.show_frame(self,HomePage)], font=("Helvetica", 20),
bg="#e6ffe6")
self.login_button.grid(row=70, column=25, padx=10, 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, parent, controller):
super().__init__(parent, controller)
label1 = ttk.Label(self, text='Home', font=("Helvetica", 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
C:\Users\write\AppData\Local\Programs\Python\Python39\Python.exe“C:/Users/write/PycharmProjects/OOP trials/login\u bg\u img\u trial2.py”
回溯(最近一次呼叫最后一次):
文件“C:\Users\write\PycharmProjects\OOP trials\login\u bg\u img\u trial2.py”,第97行,在
app=app()
文件“C:\Users\write\PycharmProjects\OOP trials\login\u bg\u img\u trial2.py”,第30行,在初始化中__
self.show_框架(登录页面)
文件“C:\Users\write\PycharmProjects\OOP trials\login\u bg\u img\u trial2.py”,第33行,在show\u框架中
frame=self.frames[container]
关键错误:
进程已完成,退出代码为1
非常感谢您的帮助。在您的
应用程序中。\uuuu init\uuuu
更改:
self.show\u框架(登录页面)
到
self.show\u框架(“登录页面”)
您拥有的字典(self.frames
)包含帧名称作为键,帧实例作为值
还可以将
self.controller=controller
添加到BasePage.\uuu init\uuu
以便保留对控制器的引用
这将允许您更改
self.login\u button=tk.button(…,command=lambda:[…,App.show\u frame(self,HomePage)])
进入:
self.login\u button=tk.button(…,command=lambda:[…,self.controller.show\u frame(“主页”))
这将解决所有问题
请注意,正如@Atlas435所说,您不需要类登录页面(BasePage,tk.Frame)
中的tk.Frame
。在lambda中使用一个列表来执行函数也是不实用的。只定义一个新函数更容易。类登录页(BasePage,tk.Frame):
变成类登录页(BasePage):
@Atlas435这不是一个好主意将self.show\u Frame(LoginPage)
更改为self.show\u Frame(“登录页”)
@TheLizzard保存它的意义在哪里?@TheLizzard我尝试了你的建议,它显示了相同的错误,谢谢错误解决了。现在可以在帧之间导航了。但登录时输入的值不会记录在数据库中。现在没有错误。有什么建议吗?@ArchanaJalajaSurendran将command=lambda:[self.submit,…]
更改为command=lambda:[self.submit(),…]
。(你忘了括号了。)多谢。。我真的忘了()