2012-10-09 39 views
5

Tôi thực sự xin lỗi vì đã làm phiền bạn với AttributeError, nhưng tôi không thể tìm ra điều gì sai với mã của mình mặc dù tôi đã làm việc thông qua nhiều câu hỏi được giải quyết liên quan đến AttributeErrors.AttributeError trong hàm gọi lại

Đây là mã của tôi:

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() 

Nếu tôi thực hiện nó, tôi nhận được thông báo lỗi sau:

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' 

Vấn đề hài hước - với ý kiến ​​của tôi - được rằng "entry 1" là hoàn toàn tương tự như "entry2" và "entry3" nhưng không gây ra bất kỳ sự cố nào. Bạn có biết tại sao những lỗi này xảy ra không?

Cảm ơn bạn rất nhiều vì đã giúp đỡ!

Trả lời

6

Lý do là các dòng:

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

nào xảy ra trướcentry2 hoặc entry3 được xác định, nhưng sauentry1 được định nghĩa. Điều này làm cho hàm gọi lại self.dir_ch được gọi. Hàm đó sau đó dựa trên entry1, entry2entry3 tất cả hiện có.

Một sửa chữa sẽ được xác định cả ba lĩnh vực, với các dòng:

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

trước khi kết nối hoặc thay đổi bất kỳ trong số họ.

+1

Truy nguyên không phải là đặc biệt hữu ích (nếu tất cả được đăng). Tại một số thời điểm nó sẽ gửi cho bạn đến dòng 'self.entry1.connect (" thay đổi ", self.dir_ch)' ... – mgilson

+0

Bạn đang chết người đúng ... Cảm ơn bạn rất nhiều cho câu trả lời này nhanh David! –