Flashcard应用故障求助:卡片无法显示选定问答内容
问题:Flashcard应用卡片无法显示选定内容,仅显示占位符“word”
我正在开发一款Flashcard应用,但遇到了问题:卡片无法显示选定的问题和答案,仅显示占位符“word”。我怀疑可能是代码的顺序或位置有误。之前尝试将flip_card函数放入next_card函数中,但并未解决问题,这么做是因为最初遇到的错误是flip_card函数中selected_answer未定义。
原代码:
def next_card(): global current_card, flip_timer window.after_cancel(flip_timer) current_card = random.choice(selected_flashcards) selected_question, selected_answer = selected_flashcard selected_question = selected_question.strip("()").strip("'\"") selected_answer = selected_answer.strip("()").strip("'\"") canvas.itemconfig(card_title, text="Question", fill="black") canvas.itemconfig(card_word, text=selected_question, fill="black") canvas.itemconfig(card_background, image=card_front_img) flip_timer = window.after(3000, func=flip_card) def flip_card(): canvas.itemconfig(card_title, text = "Answer", fill = "white") canvas.itemconfig(card_word, text=selected_answer, fill = "white") canvas.itemconfig(card_background, image=card_back_img) selected_flashcards.remove(current_card) window = Toplevel() window.title("Quick Revision") window.config(padx=50, pady=50, bg=BACKGROUND_COLOR) flip_timer = window.after(3000, func=flip_card) canvas = Canvas(width=800, height=526) card_front_img = PhotoImage(file="./images/card_front.png") card_back_img = PhotoImage(file="./images/card_back.png") card_background = canvas.create_image(400, 263, image=card_front_img) card_title = canvas.create_text(400, 150, text="Title", font=("Ariel", 40, "italic")) canvas.config(bg=BACKGROUND_COLOR, highlightthickness=0) card_word = canvas.create_text(400, 263, text="Word", font=("Ariel", 60, "bold"), tags="word") canvas.grid(row=0, column=0, columnspan=2) check_image = PhotoImage(file="./images/right.png") flip_button = Button(image=check_image, command=flip_card()) flip_button.grid(row=1, column=1, sticky="E") next_card() window.mainloop()
问题分析与修复方案
错误点:
- 变量名拼写错误:next_card函数中,用
selected_flashcard解构变量,但实际选中的卡片是current_card,直接导致无法获取正确的问题和答案。 - 作用域问题:flip_card函数无法访问next_card内部的
selected_answer变量,需要将其声明为全局变量,或者从current_card中重新获取。 - 按钮绑定错误:
flip_button的command参数写成了flip_card(),会在程序启动时立即执行flip_card,而非点击按钮时执行,应改为command=flip_card。 - 初始定时器错误:程序启动时就创建
flip_timer,但此时还未初始化current_card,会导致flip_card执行出错,需删除这行初始化代码,由next_card函数负责设置定时器。
修正后的代码:
import random from tkinter import Toplevel, Canvas, PhotoImage, Button # 假设BACKGROUND_COLOR和selected_flashcards已定义 BACKGROUND_COLOR = "#B1DDC6" selected_flashcards = [("Question1", "Answer1"), ("Question2", "Answer2")] def next_card(): global current_card, flip_timer, selected_answer # 取消之前的定时器(如果存在) if 'flip_timer' in globals(): window.after_cancel(flip_timer) current_card = random.choice(selected_flashcards) selected_question, selected_answer = current_card # 修正变量名 selected_question = selected_question.strip("()").strip("'\"") selected_answer = selected_answer.strip("()").strip("'\"") canvas.itemconfig(card_title, text="Question", fill="black") canvas.itemconfig(card_word, text=selected_question, fill="black") canvas.itemconfig(card_background, image=card_front_img) flip_timer = window.after(3000, func=flip_card) def flip_card(): global selected_answer, current_card canvas.itemconfig(card_title, text="Answer", fill="white") canvas.itemconfig(card_word, text=selected_answer, fill="white") canvas.itemconfig(card_background, image=card_back_img) if current_card in selected_flashcards: selected_flashcards.remove(current_card) window = Toplevel() window.title("Quick Revision") window.config(padx=50, pady=50, bg=BACKGROUND_COLOR) canvas = Canvas(width=800, height=526) card_front_img = PhotoImage(file="./images/card_front.png") card_back_img = PhotoImage(file="./images/card_back.png") card_background = canvas.create_image(400, 263, image=card_front_img) card_title = canvas.create_text(400, 150, text="Title", font=("Ariel", 40, "italic")) canvas.config(bg=BACKGROUND_COLOR, highlightthickness=0) card_word = canvas.create_text(400, 263, text="Word", font=("Ariel", 60, "bold"), tags="word") canvas.grid(row=0, column=0, columnspan=2) check_image = PhotoImage(file="./images/right.png") flip_button = Button(image=check_image, command=flip_card) # 修正按钮绑定 flip_button.grid(row=1, column=1, sticky="E") next_card() window.mainloop()
内容的提问来源于stack exchange,提问作者Ethan Fuller
相关产品推荐
相关产品推荐

