无法将enter键绑定到按钮Python Tkinter

无法将enter键绑定到按钮Python Tkinter,python,tkinter,Python,Tkinter,我正在创建一个抽认卡应用程序来帮助我学习语言。该应用程序的基本思想是在我给出答案的同时,随机循环浏览单词列表。当我回答闪存卡时,程序会显示卡片上的单词、翻译、例句等信息。每次新卡片出现时,都会创建一个“问题框”,并为该卡片创建一个“答案框”,循环将继续,直到所有卡片都正确回答为止。我感觉这个循环在某种程度上干扰了绑定,因为当我尝试将按钮绑定到主窗口时,我在命令窗口中得到错误响应,而如果我尝试绑定到问题或答案框架,则命令窗口中不会发生任何事情 我在这个网站上找到了很多解决这类问题的方法,比如绑定到

我正在创建一个抽认卡应用程序来帮助我学习语言。该应用程序的基本思想是在我给出答案的同时,随机循环浏览单词列表。当我回答闪存卡时,程序会显示卡片上的单词、翻译、例句等信息。每次新卡片出现时,都会创建一个“问题框”,并为该卡片创建一个“答案框”,循环将继续,直到所有卡片都正确回答为止。我感觉这个循环在某种程度上干扰了绑定,因为当我尝试将按钮绑定到主窗口时,我在命令窗口中得到错误响应,而如果我尝试绑定到问题或答案框架,则命令窗口中不会发生任何事情

我在这个网站上找到了很多解决这类问题的方法,比如绑定到函数,使用lambda表达式等等,但都没有成功

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()
将tkinter作为tk导入
随机输入
def get_random_deck():
新甲板=待研究
r=random.SystemRandom()
r、 洗牌(学习)
返回新甲板
def问题页面(甲板):
问题(窗框,宽600,高600)
问题\u frame.grid(行=0,列=0,粘性='news')
问题标签=tk.label(问题框架,文本=deck[0][0])
问题标签网格(行=1,列=1,列span=2)
问题条目=传统条目(问题框架)
问题\条目网格(行=2,列=1,列span=2)
var=tk.BooleanVar(False)
检查按钮=tk.按钮(问题框架,文本='检查答案',命令=设置值(变量))
检查按钮网格(行=3,列=1,列span=2)
问题\u frame.bind(“”,(lambda事件:检查\u按钮.invoke()))
检查按钮。等待变量(var)
答案=问题\条目。获取()
回覆
def应答页面(卡片组,颜色):
回答:框架=tk.框架(窗户,宽度=600,高度=600)
答案\u frame.grid(行=0,列=0,粘性='news')
var=tk.BooleanVar(False)
下一个按钮=tk.button(答案框,文本='next',命令=设置值(var))
next_button.grid(行=3,列=1,粘性=n)
answer_frame.bind(“”,(lambda事件:next_button.invoke())
下一步按钮。等待变量(var)
def设定值(var):
值=λ:变量集(真)
返回值
def研究_循环():
deck=get_random_deck()
当len(甲板)>0时:
r=random.SystemRandom()
r、 洗牌(牌组)
答案=问题\第页(甲板)
如果在组[0][1]中回答:
答题页面(甲板,“图表2”)
要学习=['Big','small',['small','Big']]
window=tk.tk()
窗口几何图形('600x600')
研究(u loop)
window.mainloop()
我正在使用BooleanVar来帮助循环前进,也许有更好的方法可以做到这一点,但以我有限的知识和经验,这是我唯一能让它工作的方法


总之,我希望能够绑定enter键,在问题框中输入抽认卡答案,然后从答案页面前进。

因此解决方案是,在我完成学习循环时,我需要将焦点设置到正确的小部件上

我将焦点设置在问题框架上的条目小部件上,然后将按钮调用也绑定到该小部件

question_entry.focus_set()
question_entry.bind('<Return>', lambda event: check_button.invoke())
question\u entry.focus\u set()
问题\条目.bind(“”,lambda事件:检查\按钮.invoke())
对于答案框,我将焦点和关键点绑定到框本身

answer_frame.focus_set()
answer_frame.bind('<Return>', lambda event: check_button.invoke())
answer\u frame.focus\u set()
answer_frame.bind(“”,lambda事件:check_button.invoke())

现在,当我在每一帧上按enter键时,循环将继续到下一帧

阅读请尝试将此代码缩减为一个。有很多代码与所问问题没有直接关系。好的,我添加了一个可复制的示例,我想我已经删除了所有不必要的代码。我还将查看“为什么按钮参数“command”在声明时执行?”回答页面。我已经尝试了很多方法,但无论我做什么,我似乎都无法使用绑定键调用按钮或更改var。一定有一种方法可以做到这一点,但我没有看到。