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