2015-02-08 112 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

相关问题