Python 无法在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

我浏览了几篇关于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(),…]
。(你忘了括号了。)多谢。。我真的忘了()