Время сохранения глобального имени Tkinter не определено

#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