2016-04-30 10 views
0

Ich arbeite an einer Aufgabe für Klasse und ich bekomme immer eine AttributeError. Hier ist mein Code: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() 

Und der Fehler:

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' 

Wenn ich die

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

Linie entfernen, dann bekomme ich immer noch den Fehler mit dem self.expvalue und Selbst .strvalue Linien auch. Ich bin nicht wirklich sicher, was dieses Problem verursacht, also hilft jeder Rat.

Antwort

0

Sie initialisieren diese Attribute nur nach Sie rufen self.buttons(). In umgekehrter Reihenfolge in der __init__ Methode, dann wird es funktionieren:

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

Sie sollten die Methode buttons nach dem Attribut-Deklaration in der __init__ Methode aufrufen.

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

    self.buttons() 
    ...