2017-04-08 17 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ファイルへの接続を作成し、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!") 

これがうまく実行されます。それはコントローラからDBオブジェクトを取得し、それは完全に動作します。 (ちょうどログイン1の下に別のフレーム・クラス内にある)が

これを:

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を(実行)を:

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

このエラーをスロー初期化する。

申し訳ありませんが、私はここでオーバー投稿しました。私は簡潔にしたいと思っていましたが、達成しようとしていることについて詳細が不足したり、混乱を招きたくなかった。

事前に感謝します。

答えて

0

あなたの完全なコードを見ることなく確実に言うことはできませんが、あなたはデータベース接続を行う前に実行される__init__メソッドで "LoadTable"を呼び出すと推測します。

すぐにフレームを作成する前に、self.passwordDB = sqlite3.connect('PDB.db')行をメソッドの先頭に移動します。

+0

完璧に動作します、ありがとうございます! –