Невозможно привязать клавишу ввода к кнопке Python Tkinter - PullRequest
0 голосов
/ 16 октября 2019

Я создаю приложение-карточку для изучения языка. Основная идея приложения заключается в том, чтобы циклически перебирать список слов, пока я даю ответы. Когда я отвечаю на флэш-карты, программа выводит информацию для слова на карточке, перевода, примеров предложений и т. Д. Каждый раз, когда приходит новая карточка, создается «вопрос_фрейм» и создается «ответ_фрейм» для карточки, циклпродолжайте до тех пор, пока на все карточки не будет дан правильный ответ. У меня такое ощущение, что этот цикл каким-то образом мешает привязке, так как при попытке привязать кнопку к главному окну я получаю сообщение об ошибке в командном окне, в то время как в командном окне ничего не происходит, если я пытаюсь выполнить привязку к вопросуили рамка ответа.

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

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, чтобы помочь продвинуть цикл, возможно, есть лучший способ сделать это, но с моими ограниченными знаниями и опытом, это единственный способ, которым я мог бы заставить его работать.

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

1 Ответ

0 голосов
/ 18 октября 2019

Таким образом, решение оказалось в том, что мне нужно установить фокус на правильный виджет при прохождении study_loop.

Я установил фокус на виджет Entry в рамке вопроса, а затем привязал кнопкутакже вызовите этот виджет.

question_entry.focus_set()
question_entry.bind('<Return>', lambda event: check_button.invoke())

и для рамки ответа я установил фокус и привязку клавиш к самой рамке.

answer_frame.focus_set()
answer_frame.bind('<Return>', lambda event: check_button.invoke())

Теперь, когда я нажимаю клавишу ввода накаждый кадр цикла продолжается до следующего кадра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...