Tkinter奇怪的属性问题

时间:2017-04-08 23:12:41

标签: python python-3.x tkinter

我是新来的!我不时访问过,但现在我以为我会加入社区。

背景信息:我的程序会随机生成一个密码,并能够在sqlite3数据库中为用户保存该密码。然后,用户可以在单独的窗口中查看和调用密码。

这是我的代码,我正在使用框架登录页面,然后是表格页面:

class passwordViewer(tkinter.Tk):

    def __init__(self, *args, **kwargs):
        tkinter.Tk.__init__(self, *args, **kwargs)

        container = tkinter.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 (PVLoginPage, PVTable):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.passwordDB = sqlite3.connect('PDB.db')
        print("Database connected successfully.")

        self.showFrame("PVLoginPage")

    def getDB(self):
        return self.passwordDB

那是我的控制者。它创建了与DB文件的连接,然后有一个返回DB的方法。我有其他一些方法,但它们并不重要。

这是我的登录页面:

class PVLoginPage(tkinter.Frame):

    def userLogin(self, ID, password):
        try:
            passwordDB = self.controller.getDB()
            passwordDBQuery = passwordDB.cursor()
            print("Statement ran successfully.")
            passwordDBQuery.execute('SELECT * FROM USERS WHERE USERNAME="%s" AND PASSWORD="%s"' % (ID, password))
            if passwordDBQuery.fetchone() is not None:
                print("Logged in successfully.")
                self.controller.showFrame("PVTable")
            else:
                print("Authentication failed!")
        except IOError:
                print("Select statement could not execute!")

执行得很好。它从控制器获取数据库对象,它可以很好地工作。

然而(这是在登录之下的另一个框架类中):

    def LoadTable(self):
        try:
            passwordDB = self.controller.getDB()
            passwordDBQuery = passwordDB.cursor()
            #SQL Query Here.
        except IOError:
            print("Query failed!")

引发此错误:

return self.passwordDB
File "C:\Users\Tom\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 2095, in __getattr__
return getattr(self.tk, attr)
AttributeError: '_tkinter.tkapp' object has no attribute 'passwordDB'

PVTable类的构造函数在初始化时运行LoadTable()。

很抱歉,如果我在这里过度发布了。我想简明扼要,但不想缺乏细节或导致我想要实现的目标混淆。

非常感谢提前!

1 个答案:

答案 0 :(得分:0)

在没有看到完整代码的情况下无法肯定地说,但是您猜测是在__init__方法中调用“LoadTable”,该方法在您建立数据库连接之前运行。

快速解决方法是在制作帧之前将self.passwordDB = sqlite3.connect('PDB.db')行移动到方法的顶部。