2016-05-05 3 views
0

Ich habe ein Tutorial gefolgt, und schrieb dieses Programm. Könnte mir jemand helfen, herauszufinden, warum ich die Fehlermeldung erhalte? „Anwendungsinstanz hat kein Attribut‚Text‘“Lernen Python, stecken in GUI-Programm, das nicht ausgeführt wird

from Tkinter import * 

class Application(Frame): 
    """ A GUI application with three buttons.""" 

    def __init__(self,master): 
     """ This initialized the Frame""" 
     Frame.__init__(self, master) 
     self.grid() 
     self.create_widgets() 
     self.buttonclicks = 0 

    def create_widgets(self): 
     """Create a button that measures clicks.""" 
     #create first button 
     self.button1 = Button(self, text = "Total Clicks: 0") 
     self.button1.grid() 

     self.instruction = Label(self, text= "Enters the password") 
     self.instruction.grid(row=0, column=0, columnspan=2, sticky=W) 

     self.password = Entry(self) 
     self.password.grid(row=1,column=1, sticky=W) 

     self.button1["command"] = self.update_count 
     self.button1.grid(row=2,column=0,sticky=W) 

     self.submit_button = Button(self, text="Submit", command=self.reveal()) 

     self.texts = Text(self, width=35, height=5,wrap=WORD) 
     self.texts.grid(row=4,column=1,columnspan=2,sticky=W) 

    def update_count(self): 
     """Increase this click count and display the new total""" 
     self.buttonclicks += 1 
     self.button1["text"] = "Total Clicks: " + str(self.buttonclicks) 

    def reveal(self): 
     """Reveal the password""" 
     content = self.password.get() 

     messsage="" 

     if content == "password": 
      message = "You have access to the data." 
     else: 
      message = "Access denied." 

     self.texts.insert(0.0,message) 



root = Tk() 

root.title("GUI test") 
root.geometry("250x185") 

app = Application(root) 

root.mainloop() 

Die Sache ist, ich habe bereits ein Textfeld als ‚Texte‘ definiert, und wenn es das Kennwort aus den Attributen bekommen kann, sehe ich keinen Grund, es nicht bekommen würde Texte.

Edit: wurde für den Fehler gefragt:

Traceback (most recent call last): 
    File "clickcounter.py", line 58, in <module> 
    app = Application(root) 
    File "clickcounter.py", line 10, in __init__ 
    self.create_widgets() 
    File "clickcounter.py", line 28, in create_widgets 
    self.submit_button = Button(self, text="Submit", command=self.reveal()) 
    File "clickcounter.py", line 49, in reveal 
    self.texts.insert(0.0,message) 
    AttributeError: Application instance has no attribute 'texts' 
+1

Können Sie die Stack-Trace, die Ihnen diese Fehlermeldung gibt? Es erleichtert das Durchsehen Ihres Codes. –

+1

Als generelle Regel, um ein Nitpick zu sein, versuchen Sie '*' glob Importe in Python zu vermeiden. Es ist viel klarer und einfacher, Code zu debuggen, wenn Sie jedes Ding explizit importieren (d. H. Von "Tkinter importieren Text, Entry, Button, Label") oder einfach "Tkinter importieren" und alles explizit aufrufen, dh. 'Tkinter.Text (...)' –

+0

Guter Tipp. Ich habe die Fehlermeldung zum ursprünglichen Beitrag hinzugefügt. – twoshoes

Antwort

1

Zeile ändern:

self.submit_button = Button(self, text="Submit", command=self.reveal()) 

zu

self.submit_button = Button(self, text="Submit", command=self.reveal) 

Wenn Sie es self.reveal() sind vorbei ist es self.reveal() an diesem Punkt fordern , bevor self.texts definiert ist.

Sie möchten die Funktion übergeben, um nicht das Ergebnis der aufgerufenen Funktion aufzurufen.

+0

Ja, das hat es behoben, vielen Dank, ich wusste nicht, dass Sie eine Funktion übergeben können, ohne sie zu verwenden, indem Sie keine Klammern verwenden. Froh, dass ich das gelernt habe! – twoshoes

+1

Ja, bei Python kann fast alles so eingestellt werden. So könnte man zum Beispiel 'foo = self.reveal' sagen und später' foo (...) 'nennen. –

+1

@twoshoes In Python ist im Prinzip * everything * ein [Objekt erster Klasse] (http: // python-history .blogspot.nl/2009/02/First-Class-Everything.html). Und in Python sind die Variablen, die wir nennen, eher wie "Etiketten", die an Objekten hängen. Der Code "x = 4" hängt das Label "x" an das ganzzahlige Objekt "4". –