2016-04-30 28 views
0

我正在爲類的賦值工作,我不斷收到一個AttributeError。這裏是我的代碼:Python:tkinter AttributeError

from tkinter import * 

class Lab12(): 
    def __init__(self, master): 
     self.frm = Frame(master) 
     self.frm.grid() 
     self.buttons() 
     self.basevalue = IntVar() 
     self.expvalue = IntVar() 
     self.strvalue = StringVar() 

    def buttons(self): 
     self.base = Scale (self.frm) 
     self.base['orient'] = 'horizontal' 
     self.base['length'] = 10 
     self.base['from'] = 1 
     self.base['to'] = 10 
     self.base['variable'] = self.basevalue 

     self.exp = Scale (self.frm) 
     self.exp['orient'] = 'horizontal' 
     self.exp['length'] = 25 
     self.exp['from'] = 1 
     self.exp['to'] = 25 
     self.exp['variable'] = self.expvalue 

     self.lbl = Label (self.frm) 
     self.lbl['textvariable'] = self.strvalue 

     self.result = Button (self.frm) 
     self.result['text'] = "Click to get result" 
     self.result['command'] = self.do_res 

     self.base.grid(row = 0, column = 0) 
     self.exp.grid(row = 1, column = 0) 
     self.lbl.grid(row = 2, column = 1) 
     self.result.grid(row = 2, column = 1) 

    def do_res(self): 
     x = self.basevalue.get() 
     y = self.expvalue.get() 
     self.strvalue.set(str(x) + ' raised to ' + str(y) + ' is ' + str(x  ** y)) 

def py_lab(): 
    lab = Tk() 
    lab.title("lab12") 
    lab.geometry("400x400") 
    labclass = Lab12(lab) 
    lab.mainloop() 
py_lab() 

和錯誤:

Traceback (most recent call last): 
    File "E:\CS 232\Lab 12\Lab12.py", line 53, in <module> 
    py_lab() 
    File "E:\CS 232\Lab 12\Lab12.py", line 51, in py_lab 
    labclass = Lab12(lab) 
    File "E:\CS 232\Lab 12\Lab12.py", line 10, in __init__ 
    self.buttons() 
    File "E:\CS 232\Lab 12\Lab12.py", line 21, in buttons 
    self.base['variable'] = self.basevalue 
AttributeError: 'Lab12' object has no attribute 'basevalue' 

如果我刪除

self.base['variable'] = self.basevalue 

線,然後我仍然得到與self.expvalue和自身的錯誤.strvalue行也是如此。我不確定是什麼原因造成這個問題,所以任何建議都有幫助。

回答

0

您只在之後初始化這些屬性您致電self.buttons()。扭轉在__init__方法的順序,那麼它會工作:

def __init__(self, master): 
    self.frm = Frame(master) 
    self.frm.grid() 
    self.basevalue = IntVar() 
    self.expvalue = IntVar() 
    self.strvalue = StringVar() 
    self.buttons() # call buttons after initializing above attributes 
1

你應該在__init__方法的屬性聲明後調用該方法buttons

... 
    self.basevalue = IntVar() 
    self.expvalue = IntVar() 
    self.strvalue = StringVar() 

    self.buttons() 
    ...