我是新来的!我不时访问过,但现在我以为我会加入社区。 p>
背景信息:我的程序会随机生成一个密码,并能够在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()。
很抱歉,如果我在这里过度发布了。我想简明扼要,但不想缺乏细节或导致我想要实现的目标混淆。
非常感谢提前!
答案 0 :(得分:0)
在没有看到完整代码的情况下无法肯定地说,但是您猜测是在__init__
方法中调用“LoadTable”,该方法在您建立数据库连接之前运行。
快速解决方法是在制作帧之前将self.passwordDB = sqlite3.connect('PDB.db')
行移动到方法的顶部。