[英]Unable to bind the enter key to button Python Tkinter
我正在創建一個抽認卡應用程序來幫助我學習語言。 該應用程序的基本思想是在我給出答案時隨機循環遍歷單詞列表。 當我回答 flash 卡片時,程序會顯示卡片上單詞、翻譯、例句等的信息。每次新卡片出現時,都會創建一個“question_frame”並為卡片創建一個“answer_frame”,循環繼續,直到所有卡片都被正確回答。 我有一種感覺,當我嘗試將按鈕綁定到主 window 時,此循環以某種方式干擾了綁定或答案框。
我已經嘗試了很多我在這個網站上找到的這類問題的答案,綁定到 function,使用 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()
我正在使用 BooleanVar 來幫助移動循環,也許有更好的方法可以做到這一點,但以我有限的知識和經驗,這是我讓它工作的唯一方法。
所以總而言之,我希望能夠綁定回車鍵以在問題框架上輸入抽認卡答案,然后從答案頁面前進。
所以解決方案結果是我需要通過 study_loop 將焦點設置為正確的小部件,因為我是 go。
我將焦點放在問題框架上的 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())
現在,當我在每一幀上按回車鍵時,循環繼續到下一幀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.