#python #tkinter #label #global #nameerror
#python #tkinter #метка #глобальный #ошибка имени
Вопрос:
import Tkinter
import random
from time import sleep
class simpleapp_tk(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.initialize()
def initialize(self):
self.grid()
self.labelVariable = Tkinter.StringVar()
label = Tkinter.Label(self,textvariable=self.labelVariable,anchor="w",fg="blue",bg="gold")
label.grid(column=0,row=0,sticky='EW')
self.labelVariable.set(u"Press button to begin!")
self.button = Tkinter.Button(self,text=u"Start",
command=self.usertypetest(0),fg="black",bg="green")
self.button.grid(column=2,row=0)
self.labelVariable2 = Tkinter.StringVar()
label2 = Tkinter.Label(self,textvariable=self.labelVariable2,anchor="w",fg="blue",bg="gold")
label2.grid(column=1,row=0,sticky='EW')
self.labelVariable2.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.grid_columnconfigure(0,weight=1)
self.grid_rowconfigure(0,weight=1)
self.resizable(True,True)
def keeptime(num1):
self.entry.selection_range(0, Tkinter.END)
timer = num1
t = 0
while timer < 1:
self.labelVariable2.set(t)
sleep(.01)
t = .01
def usertype(self):
randletter = random.choice('qwer')
self.labelVariable.set("Press " randletter)
userinput = self.entryVariable.get
while userinput == '':
pass
if userinput == randletter:
return 'Correct'
else:
return 'Incorrect'
def usertypetest(self,num1):
keeptime(num1)
for x in range(20):
result = usertype()
print result
if result == 'Correct':
y = y 5
else:
y = y-2
timer = 1
self.labelVariable.set(str(y) ' is your score')
if __name__ == "__main__":
app = simpleapp_tk(None)
app.title('LoL Practice')
app.geometry("700x50")
app.configure(background='black')
app.mainloop()
Это моя программа. Цель этой программы состоит в том, что когда пользователь нажимает кнопку «Пуск», запускается таймер, печатающий на этикетке, и им будут показаны буквы, выбранные случайным образом (Q, W, E, R), которые они должны ввести как можно быстрее. Программа засечет их и выставит им оценку на основе их ошибок в конце, а также остановит таймер. Проблема, с которой я сталкиваюсь, заключается в том, что в нем говорится:
Traceback (most recent call last):
File "C:/Users/Brett/Documents/shellrunpractice", line 83, in <module>
app = simpleapp_tk(None)
File "C:/Users/Brett/Documents/shellrunpractice", line 9, in __init__
self.initialize()
File "C:/Users/Brett/Documents/shellrunpractice", line 22, in initialize
command=self.usertypetest(0),fg="black",bg="green")
File "C:/Users/Brett/Documents/shellrunpractice", line 66, in usertypetest
keeptime(num1)
NameError: global name 'keeptime' is not defined
Это было исправлено!
Кроме того, до того, как я внес некоторые изменения, код не выдавал ошибок, но когда я нажал кнопку, программа просто зависла. Мне интересно, могли ли вы, ребята, найти какие-либо другие ошибки в моем коде, которые могли быть причиной этого, и если да, то как это сделать. Я понимаю, что мой код очень плох, я только начинаю в Tkinter, и я еще не совсем уверен, как все работает.
Ответ №1:
На самом деле вы должны использовать self.keeptime(num1)
вместо keeptime(num1)
для доступа к методам класса, и вы должны использовать self
в качестве первого аргумента keeptime
метода
def keeptime(self,num1):
self.entry.selection_range(0, Tkinter.END)
timer = num1
t = 0
while timer < 1:
self.labelVariable2.set(t)
sleep(.01)
t = .01