Python Tkinter attribute error entry in random letter typing test Python Tkinter attribute error entry in random letter typing test tkinter tkinter

Python Tkinter attribute error entry in random letter typing test


command= expect only function name - without () and parameters.

Using command=self.usertypetest(0) you run self.usertypetest(0)
and its result is assigned to command=.

But self.usertypetest(0) use self.entry which wasn't defined yet.

self.entry is defined after Tkinter.Button(...command=self.usertypetest(0)...)

If you need to assing function with parameters then use lambda

command=lambda:self.usertypetest(0)

And now it works.


EDIT:

Full working version:

(I changed some variable names)

import Tkinterimport randomclass simpleapp_tk(Tkinter.Tk):    def __init__(self,parent):        Tkinter.Tk.__init__(self,parent)        self.parent = parent        self.initialize()        self.started = False # True when timer is running    def initialize(self):        self.grid()        self.infoVariable = Tkinter.StringVar()        self.labelInfo = Tkinter.Label(self, textvariable=self.infoVariable, anchor="w", fg="blue", bg="gold")        self.labelInfo.grid(column=0, row=0, sticky='EW')        self.infoVariable.set(u"Press button to begin!")        self.buttonStart = Tkinter.Button(self, text=u"Start", command=self.on_buttonStart, fg="black", bg="green")        self.buttonStart.grid(column=2, row=0)        self.timeVariable = Tkinter.StringVar()        self.labelTime = Tkinter.Label(self, textvariable=self.timeVariable, anchor="w", fg="blue", bg="gold")        self.labelTime.grid(column=1, row=0, sticky='EW')        self.timeVariable.set(u'Time')        self.entryVariable = Tkinter.StringVar()        self.entry = Tkinter.Entry(self, textvariable=self.entryVariable, fg="black", bg="white")        self.entry.grid(column=0, row=1, columnspan=2, sticky='EW')        self.entryVariable.set(u"")        self.entry.bind('<Key>', self.on_key) # event        self.grid_columnconfigure(0,weight=1)        self.grid_rowconfigure(0,weight=1)        self.resizable(True,True)    def on_buttonStart(self):        if not self.started:            # reset values            self.started = True            self.number_of_letters = 20            self.score = 0            self.time = 0.0            # select first letter            self.randletter = random.choice('qwer')            # show first letter and score            self.infoVariable.set('Score:' + str(self.score)+' | Press ' + self.randletter)            # start timer            self.after(100, self.timer)    def on_key(self, event):        if not self.started:            self.entryVariable.set('')        else:            if event.char == self.randletter:                print 'Correct', event.char                self.score += 5            else:                print 'Incorrect', event.char                self.score -= 2            self.number_of_letters -= 1            if self.number_of_letters == 0:                self.started = False                self.entryVariable.set('')                self.infoVariable.set('Score:' + str(self.score))            else:                self.randletter = random.choice('qwer')                self.infoVariable.set('Score:' + str(self.score)+' | Press ' + self.randletter)    def timer(self):        if self.started:            self.time += .1            self.timeVariable.set('Time: ' + str(round(self.time,1)) )            self.after(100, self.timer)if __name__ == "__main__":    app = simpleapp_tk(None)    app.title('LoL Practice')    app.geometry("700x50")    app.configure(background='black')    app.mainloop()