twoshoes
twoshoes

Reputation: 11

Learning python, stuck in gui program that won't run

I've been following a tutorial, and wrote this program. Could someone help me figure out why I'm getting the error message. "Application instance has no attribute 'text'"

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

The thing is I already have a textfield defined as 'texts', and if it can get password from the attributes, i see no reason it would not get the texts.

Edit: was asked for the error:

   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'

Upvotes: 0

Views: 182

Answers (1)

Tom Myddeltyn
Tom Myddeltyn

Reputation: 1375

Change line:

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

to

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

When you are passing it self.reveal() it is calling self.reveal() at that point, before self.texts is defined.

You want to pass it the function to call not the result of the function called.

Upvotes: 1

Related Questions