2015-02-08 109 views
0

我已經讀過這個程序的幾個線程,看來常見的解決方案是不正確的縮進。我測試過使用PEP8在線工具我的代碼,並通過行手動去按行,我不跟我的壓痕發現任何問題,所以我懷疑它是什麼錯誤:AttributeError:lpoApp實例沒有屬性'數據庫'

AttributeError: lpoApp instance has no attribute 'database' 

我一直在尋找現在幾個小時,我很難過。任何有識之士將不勝感激。

以下是堆棧跟蹤:

Traceback (most recent call last): 
    File "/CodeClinic/lpoApp.py", line 213, in <module> 
    main() 
    File "/CodeClinic/lpoApp.py", line 209, in main 
    app = lpoApp(root) 
    File "/CodeClinic/lpoApp.py", line 27, in __init__ 
    self._createGUI() 
    File "/CodeClinic/lpoApp.py", line 94, in _createGUI 
    ttk.Button(self.frame_input, text='Submit', command=self._submit_callback()).grid(
    File "/CodeClinic/lpoApp.py", line 166, in _submit_callback 
    data = list(self.database.get_data_for_range(start, end)) 
AttributeError: lpoApp instance has no attribute 'database' 

讓我們制定出的方式,通過它,開始調用的main():

if __name__ == "__main__": 
    main() 

它調用的應用程序:

def main(): 
    root = Tk() 
    app = lpoApp(root) 
    root.mainloop() 

現在,我們在根內創建了lpoApp的一個實例窗口,lpoApp構造函數已被調用。這是我們應當實例lpoDB(其中已導入)作爲self.database

def __init__(self, master): 
     self.master = master 
     self._createGUI() 
     self.database = lpoDB.lpoDB() 
     self.master.protocol("WM_DELETE_WINDOW", self._safe_close) 

而在_createGUI()方法我們綁定self._submit_callback()Submit按鈕命令。所以,讓我們來峯說:

ttk.Button(self.frame_input, text='Submit',   
       command=self._submit_callback()).grid(row=2, column=0, 
       columnspan=9, padx=5) 

現在,我們的Submit按鈕有一個回調lpoApp的_submit_callback()方法:

def _submit_callback(self): 
    # I printed `start` and `end` at this point prior to 
    # passing them in to the next call and they had valid 
    # datetime formats that get_data_for_range is expecting 

    data = list(self.database.get_data_for_range(start, end)) 

用我喜歡的IDE PyCharm,我通過在調試模式下的代碼運行這允許我檢查self的屬性。未列出self.database。因此,解釋器以某種方式傳遞該聲明,而不是實例化我的數據庫連接。

關於爲什麼會發生這種情況的任何想法,或者我可以做些什麼來進一步測試/調試?

+0

我有一個運行理論;我的不同代碼編輯器可能有混合的空格和製表符。我現在正在測試這個理論......只是fyi。 – DroBuddy 2015-02-08 02:21:53

+0

用'python lpoApp.py -t'從CLI運行我的代碼沒有提供任何反饋。我爲我的版本'人python'來驗證它是 - t而不是--tt太:( – DroBuddy 2015-02-08 02:25:01

+0

我剛剛轉換我的項目,所以所有選項卡都轉換爲空格,我仍然收到此錯誤。Darn it。 – DroBuddy 2015-02-08 02:32:38

回答

1

基本上,在實例化名爲self.database的屬性之前,您正在調用self._createGUI()。這就是爲什麼當你關聯按鈕Submit的方法_submit_callback(),並且Python正在解析時,它將不會在任何地方找到self.database

+1

是的,謝謝,Rinzler。 – DroBuddy 2015-02-08 04:38:16

2

這裏的問題是,你的_createGUI方法上lpoApp引用database它被分配前:

Traceback: 
    ... 
    File "/CodeClinic/lpoApp.py", line 27, in __init__ 
    self._createGUI() 
    File "/CodeClinic/lpoApp.py", line 94, in _createGUI 
    ttk.Button(self.frame_input, text='Submit', command=self._submit_callback()).grid(
    File "/CodeClinic/lpoApp.py", line 166, in _submit_callback 
    data = list(self.database.get_data_for_range(start, end)) 
AttributeError: lpoApp instance has no attribute 'database' 

,你清楚的lpoApp實例化過程中調用_createGUI後定義你的數據庫連接:

def __init__(self, master): 
    self.master = master 
    self._createGUI() 
    self.database = lpoDB.lpoDB() 
    self.master.protocol("WM_DELETE_WINDOW", self._safe_close) 

將您的self.database = lpoDB.lpoDB()線路撥到_createGUI之上,如下所示:

def __init__(self, master): 
    self.master = master 
    self.database = lpoDB.lpoDB() 
    self._createGUI() 
    self.master.protocol("WM_DELETE_WINDOW", self._safe_close) 
+0

Rinzler指出,對我而言,好吧,趕上;) 這就是爲什麼要休息,哈哈。謝謝,nelfin。 – DroBuddy 2015-02-08 03:12:34

相關問題