2012-10-09 8 views
5

Es tut mir wirklich leid, dass ich Sie mit einem AttributeError behellige, aber ich kann einfach nicht herausfinden, was mit meinem Code falsch ist, obwohl ich viele gelöste Fragen bezüglich AttributeErrors durchgearbeitet habe.AttributError in Callback-Funktion

Dies ist mein Code:

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

Wenn ich es ausführen, bekomme ich die folgende Fehlermeldung:

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' 

Die lustige Ausgabe - meiner Meinung nach - ist, dass "entry1" absolut ähnlich wie "entry2" und "entry3", macht aber keine Probleme. Weißt du, warum diese Fehler auftreten?

Vielen Dank für Ihre Hilfe!

Antwort

6

Der Grund dafür ist die Linien:

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

Welche vorentry2 oder entry3 definiert ist passiert, aber nachentry1 definiert ist. Dadurch wird die Callback-Funktion self.dir_ch aufgerufen. Diese Funktion beruht dann auf entry1, entry2 und entry3 alles vorhanden.

Ein fix wäre, alle drei Felder zu definieren, mit den Zeilen:

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

vor dem Anschließen oder einen von ihnen zu verändern.

+1

Das Traceback ist nicht besonders hilfreich (wenn es alles gepostet wird). Irgendwann sollte es dich an die Zeile "self.entry1.connect (" changed ", self.dir_ch) schicken ..." – mgilson

+0

Du hast todsicher recht ... Vielen Dank für diese schnelle Antwort David! –

Verwandte Themen