无法在 tkinter 框架之间导航它显示属性错误

如何解决无法在 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?