2012-10-09 28 views
5

Naprawdę przykro mi zawracać ci głowę atakiem AttributeError, ale nie mogę pojąć, co jest nie tak z moim kodem, chociaż pracowałem przy wielu rozwiązanych kwestiach dotyczących AttributeErrors.AttributeError w funkcji wywołania zwrotnego

To jest mój kod:

class Base: 

    def __init__(self): 
     self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.window.set_position(gtk.WIN_POS_CENTER) 
     self.window.set_size_request(500,500*9/16) 
     self.window.set_title("pattern_executer") 

     self.button1 = gtk.Button(" E x i t ") 
     self.button1.connect("clicked",self.close) 

     self.button2 = gtk.Button("Plot") 
     self.button2.connect("clicked",self.plot) 

     self.button3 = gtk.Button("Search") 
     self.button3.connect("clicked",self.search) 

     self.entry1 = gtk.Entry() 
     self.entry1.connect("changed",self.dir_ch) 
     self.entry1.set_text("dir1") 

     self.entry2 = gtk.Entry() 
     self.entry2.connect("changed",self.dir_ch) 
     self.entry2.set_text("name") 

     self.entry3 = gtk.Entry() 
     self.entry3.connect("changed",self.dir_ch) 
     self.entry3.set_text("dir2") 

     #self.label1 = gtk.Label("FUNCTIONS") 

     fixed1 = gtk.Fixed() 
     fixed1.put(self.button1,10,250) 
     fixed1.put(self.button2,10,60) 
     fixed1.put(self.button3,10,30) 
     fixed1.put(self.entry1,90,30) 
     fixed1.put(self.entry2,90,60) 
     fixed1.put(self.entry3,90,90) 


     self.window.add(fixed1) 
     self.window.show_all() 
     self.window.connect("destroy",self.close) 

    def run(self,widget): 

     print "Run ... " 


    def search(self,widget): 
     box = (settings[1] - settings[3]/2,settings[2] - settings[4]/2,settings[1] + settings[3]/2,settings[2] + settings[4]/2) 
     cut1 = im.crop(box) 
     cut1.show() 

    def cut(self): 
     box = (settings[1] - settings[3]/2,settings[2] - settings[4]/2,settings[1] + settings[3]/2,settings[2] + settings[4]/2) 
     cut1 = im.crop(box) 
     return cut1 

    def gpv(self): #get pixel value 
     data = self.cut() 
     data = list(data.getdata()) 
     data = np.array(data) 
     data = data.reshape(settings[4],settings[3]) 
     data = np.flipud(data) 
     return data 

    def plot(self,widget):   
     xlist = np.linspace(0,1.0,settings[3]) 
     ylist = np.linspace(0,1.0,settings[4]) 
     X,Y = np.meshgrid(xlist, ylist) 

     fig = plt.figure()   
     fig = plt.contour(X, Y, self.gpv(),settings[0],colors = "k") 
     fig = plt.contourf(X, Y, self.gpv(),settings[0]) 

     plt.show(fig) 

    def dir_ch(self,widget): 
     directories[0] = self.entry1.get_text() 
     directories[1] = self.entry2.get_text() 
     directories[2] = self.entry3.get_text() 



    def close(self,widget,data=None): 
     print "Closed" 
     gtk.main_quit() 


    def main(self): 
     gtk.main() 

if __name__ == "__main__": 
    base = Base() 
    base.main() 

Gdybym go wykonać, pojawia się następujący komunikat o błędzie:

Traceback (most recent call last): 
    File "E:\cutter\cutter.py", line 113, in dir_ch 
    directories[1] = self.entry2.get_text() 
AttributeError: Base instance has no attribute 'entry2' 
Traceback (most recent call last): 
    File "E:\cutter\cutter.py", line 114, in dir_ch 
    directories[2] = self.entry3.get_text() 
AttributeError: Base instance has no attribute 'entry3' 

Zabawne problem - moim zdaniem - jest to, że "entry1" jest absolutnie podobne do "entry2" i "entry3", ale nie sprawia żadnych problemów. Czy wiesz, dlaczego te błędy występują?

Dziękuję bardzo za pomoc!

Odpowiedz

6

Powodem jest to, że linie:

self.entry1.connect("changed",self.dir_ch) 
self.entry1.set_text("dir1") 

co zdarza przedentry2 lub entry3 jest zdefiniowana, ale poentry1 jest zdefiniowana. Powoduje to wywołanie funkcji zwrotnej self.dir_ch. Ta funkcja opiera się na wszystkich istniejących już entry1, entry2 i entry3.

Jedna poprawka byłoby zdefiniowanie wszystkich trzech polach, z liniami:

self.entry1 = gtk.Entry() 
    self.entry2 = gtk.Entry() 
    self.entry3 = gtk.Entry() 

przed podłączeniem lub zmianą któregokolwiek z nich.

+1

Funkcja traceback nie jest szczególnie pomocna (jeśli została opublikowana). W pewnym momencie powinien wysłać cię do linii 'self.entry1.connect (" zmieniony ", self.dir_ch)' ... – mgilson

+0

Masz śmiertelną rację ... Bardzo dziękuję za szybką odpowiedź, Dawidzie! –

Powiązane problemy