Я создаю приложение-карточку для изучения языка. Основная идея приложения заключается в том, чтобы циклически перебирать список слов, пока я даю ответы. Когда я отвечаю на флэш-карты, программа выводит информацию для слова на карточке, перевода, примеров предложений и т. Д. Каждый раз, когда приходит новая карточка, создается «вопрос_фрейм» и создается «ответ_фрейм» для карточки, циклпродолжайте до тех пор, пока на все карточки не будет дан правильный ответ. У меня такое ощущение, что этот цикл каким-то образом мешает привязке, так как при попытке привязать кнопку к главному окну я получаю сообщение об ошибке в командном окне, в то время как в командном окне ничего не происходит, если я пытаюсь выполнить привязку к вопросуили рамка ответа.
Я пробовал многие ответы на проблемы такого рода, которые я нашел на этом веб-сайте: привязка к функции, использование лямбда-выражения и т. д. Но ничего не получилось.
import tkinter as tk
import random
def get_random_deck():
new_deck = to_study
r = random.SystemRandom()
r.shuffle(to_study)
return new_deck
def question_page(deck):
question_frame = tk.Frame(window, width = 600, height = 600)
question_frame.grid(row = 0, column = 0, sticky = 'news')
question_label = tk.Label(question_frame, text = deck[0][0])
question_label.grid(row = 1, column = 1, columnspan = 2)
question_entry = tk.Entry(question_frame)
question_entry.grid(row = 2, column = 1, columnspan = 2)
var = tk.BooleanVar(False)
check_button = tk.Button(question_frame, text = 'Check Answer', command = set_value(var))
check_button.grid(row = 3, column = 1, columnspan = 2)
question_frame.bind('<Return>', (lambda event: check_button.invoke()))
check_button.wait_variable(var)
answer = question_entry.get()
return answer
def answer_page(deck,color):
answer_frame = tk.Frame(window, width = 600, height = 600)
answer_frame.grid(row = 0, column = 0, sticky = 'news')
var = tk.BooleanVar(False)
next_button = tk.Button(answer_frame, text = 'Next', command = set_value(var))
next_button.grid(row = 3, column = 1, sticky = 'n')
answer_frame.bind('<Return>', (lambda event: next_button.invoke()))
next_button.wait_variable(var)
def set_value(var):
value = lambda: var.set(True)
return value
def study_loop():
deck = get_random_deck()
while len(deck) > 0:
r = random.SystemRandom()
r.shuffle(deck)
answer = question_page(deck)
if answer in deck[0][1]:
answer_page(deck, 'chartreuse2')
to_study = [['Big', 'small'], ['small', 'big']]
window = tk.Tk()
window.geometry('600x600')
study_loop()
window.mainloop()
Я использую BooleanVar, чтобы помочь продвинуть цикл, возможно, есть лучший способ сделать это, но с моими ограниченными знаниями и опытом, это единственный способ, которым я мог бы заставить его работать.
Итак, в заключение, я хотел бы иметь возможность связать клавишу ввода, чтобы ввести ответ с помощью карточки в рамке вопроса, а затем перейти со страницы ответов.