You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Tkinter的Python答题游戏:点击事件与计分功能异常排查

修复你的Tkinter答题游戏问题

我帮你排查了代码里的几个核心问题,直接给你修复好的版本,同时拆解下哪里出了问题:

问题拆解

  1. Lambda参数传递错误:你原来的lambda answer = i: check_answer(i)会导致所有按钮都传递循环最后一个选项的值,正确的写法应该把参数绑定到lambda内部,确保每个按钮传自己的文本。
  2. 重复生成分数标签:每次点击都新建Label,导致屏幕上堆了一堆分数。应该一开始就创建一个固定的分数标签,之后只更新它的文本内容。
  3. 缺少题目刷新逻辑:答对后没有切换到新题目,也没有重新生成选项,所以题目和选项一直不变。
  4. 冗余的答案判断:你写的answer == answers[s][0] or answer == answers[s][1]可以简化成大小写不敏感的判断,不用重复写两个条件。

修复后的完整代码

import tkinter
import random
from random import shuffle

score = 0
option_buttons = []  # 用来存储选项按钮,方便后续销毁刷新

def check_answer(selected_answer):
    global score, s
    # 大小写不敏感判断答案是否正确
    if selected_answer.lower() == answers[s][0].lower():
        score += 1
        score_label.config(text=f"分数: {score}")
    # 不管对错,都刷新题目
    new_question()

def new_question():
    global s, option_buttons
    # 销毁之前的选项按钮
    for btn in option_buttons:
        btn.destroy()
    option_buttons.clear()
    
    # 随机选新题目
    s = random.randrange(0, len(questions))
    # 更新题目标签文本
    question.config(text=questions[s])
    
    # 准备并打乱选项
    output = answers[s][1:]  # 取除了正确答案外的选项
    shuffle(output)
    
    # 生成新的选项按钮
    for ans in output:
        btn = tkinter.Button(window, text=ans, command=lambda a=ans: check_answer(a))
        btn.pack()
        option_buttons.append(btn)

def start_game():
    # 隐藏欢迎和开始按钮,显示题目、分数和选项
    welcome.pack_forget()
    begin.pack_forget()
    score_label.pack()
    question.pack()
    new_question()

# 创建窗口
window = tkinter.Tk()
window.title("The Hunt!")
window.configure(background="#1C3F95")

# 初始化UI元素
welcome = tkinter.Label(window, text="Welcome to the Hunt!", bg="#1C3F95", fg="white")
begin = tkinter.Button(window, text="Click here to begin", bg="#1C7C95", command=start_game)
question = tkinter.Label(window, bg="#1C3F95", fg="white", font=("Arial", 12))
score_label = tkinter.Label(window, text=f"分数: {score}", bg="#1C3F95", fg="white", font=("Arial", 10))

# 题目和答案数据
questions = [
    "What species of bird is also a nickname for New Zealand?",
    "Which Twins can you play as in Assassin's Creed Syndicate?",
    "Which year was 'Killing In The Name' Christmas Number one?"
]
answers = [
    ["kiwi", "Falcon", "Sparrow", "Crow"],
    ["frye", "Bank", "Green", "Bundy"],
    ["2009", "1999", "1993", "2004"]
]

# 初始显示欢迎和开始按钮
welcome.pack(pady=20)
begin.pack(pady=10)

window.mainloop()

关键改动说明

  • 新增了option_buttons列表,用来保存所有选项按钮,每次刷新题目时先销毁旧按钮,避免界面混乱。
  • 把分数显示改成了固定的score_label,每次只更新config(text=...),不会重复生成标签。
  • 新增new_question()函数,专门负责生成新题目、打乱选项、创建新按钮,让逻辑更清晰。
  • 修复了lambda参数传递的问题,确保每个按钮传递自己的选项文本。
  • 加入了start_game()函数,让游戏有“开始”的流程,初始只显示欢迎界面,点击开始才进入答题环节。
  • 简化了答案判断逻辑,用lower()实现大小写不敏感匹配,同时去掉了答案列表里重复的正确答案(比如原来的["kiwi", "Kiwi", ...]改成只保留一个"kiwi")。

内容的提问来源于stack exchange,提问作者Paul Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:40:45