2017-04-08 79 views
1

我是新來的!我不時訪問過,但現在我想我會加入社區。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文件的連接,然後有一個方法返回數據庫。我有其他一些方法,但它們並不重要。

這是我的登錄頁面:

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類的構造運行可裝入(),當它初始化。

對不起,如果我在這裏過分張貼。我想簡明扼要,但不想缺乏細節或引起我想要達到的目標。

非常感謝提前!

回答

0

不可能肯定地說沒有看到您的完整代碼,但作爲一種猜測,您在__init__方法中調用「LoadTable」,該方法在進行數據庫連接之前運行。

快速修復方法是在製作幀之前將self.passwordDB = sqlite3.connect('PDB.db')行移動到方法的頂部。

+0

完美的作品,非常感謝你! –