Беда с таймером потока и ткИнтер - PullRequest
0 голосов
/ 22 февраля 2019

Я делаю свой первый большой проект, который является викториной.Я застрял при попытке ограничить время, которое пользователь должен ответить на вопрос.Я искал так много часов, и единственная опция, которая, кажется, работает - это использование потока таймера.Я совсем не знаком с многопоточностью или каким-либо немного продвинутым tkInter, поэтому я весь в ушах.

def revisionMode (вопрос): inputAnswer = StringVar ()

#-----Creation & placement of buttons and labels
qLabel = Label(screen1, text = question.prompt[0]
qLabel.grid(row = 6, column = 2)

answerBox = Entry(screen1, textvariable = inputAnswer)
answerBox.grid(column = 2, row = 10)

t = Timer(7.0, nextQuestion, args=(False, question.difficulty), kwargs=None)
t.start()

#-----The button that will trigger the validation of the answer
Button(screen1, text = "Submit", command = lambda: checkAnswer(question)).grid(column = 3, row = 9)

Ошибка Iполучить из этого то, что: RuntimeError: основной поток не находится в основном цикле.Из моего понимания и отчаянного поиска в Google tkinter и многопоточность работают не очень хорошо, и я видел решения, использующие очереди.

Любая помощь, советы и советы очень ценятся!: D

1 Ответ

0 голосов
/ 22 февраля 2019

Вам не нужен поток таймера для чего-то такого простого.У виджетов Tkinter есть метод с именем after, который можно использовать для запуска команд в будущем.

Например, чтобы вызвать nextQuestion через 7 секунд, вы должны сделать это:

screen1.after(7000, nextQuestion, False, question.difficulty)

Если вы хотите отменить таймер, сохраните возвращаемое значение и используйте его для вызова after_cancel:

after_id = screen1.after(7000, nextQuestion, False, question.difficulty)
...
screen1.after_cancel(after_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...