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

如何在Python Tkinter答题程序第5题替换为Submit按钮并添加Previous按钮?

解决方案

针对你的Tkinter答题系统需求,以下是具体的代码修改方案:

1. 添加Previous(上一题)按钮

首先在界面初始化时创建Previous按钮,并控制其状态(第1题时禁用):

import tkinter as tk
import json

# 加载题目数据
with open("data.json", "r") as f:
    data = json.load(f)

current_question = 0
user_answers = []  # 存储用户答案

root = tk.Tk()
root.title("答题系统")

# 题目标签
question_label = tk.Label(root, text="", wraplength=400, font=("Arial", 12))
question_label.pack(pady=20)

# 选项框架(单选按钮容器)
options_frame = tk.Frame(root)
options_frame.pack(pady=10)
selected_option = tk.StringVar()

# 创建Previous按钮
prev_btn = tk.Button(root, text="Previous", command=go_previous, state=tk.DISABLED)
prev_btn.pack(side=tk.LEFT, padx=20, pady=20)

# 创建NEXT/SUBMIT按钮
next_btn = tk.Button(root, text="NEXT", command=go_next)
next_btn.pack(side=tk.RIGHT, padx=20, pady=20)

实现go_previous函数处理上一题逻辑:

def go_previous():
    global current_question
    current_question -= 1
    load_question()
    # 回到第1题时禁用Previous按钮
    if current_question == 0:
        prev_btn.config(state=tk.DISABLED)
    # 非最后一题时恢复NEXT按钮的文本和功能
    if current_question != len(data)-1:
        next_btn.config(text="NEXT", command=go_next)

2. 第5题替换NEXT为SUBMIT按钮

修改加载题目的load_question函数,根据当前题目序号切换按钮文本和点击事件:

def load_question():
    global current_question, selected_option
    # 清除上一题的选项
    for widget in options_frame.winfo_children():
        widget.destroy()
    
    # 加载当前题目数据
    q_data = data[current_question]
    question_label.config(text=q_data["question"])
    selected_option.set(None)
    
    # 生成当前题目的选项单选按钮
    for option in q_data["options"]:
        tk.Radiobutton(options_frame, text=option, variable=selected_option, value=option).pack(anchor=tk.W, pady=5)
    
    # 更新Previous按钮状态
    if current_question == 0:
        prev_btn.config(state=tk.DISABLED)
    else:
        prev_btn.config(state=tk.NORMAL)
    
    # 判断是否为第5题(题目索引从0开始时,第5题对应索引4;若从1计数则改为current_question ==5)
    if current_question == 4:
        next_btn.config(text="SUBMIT", command=submit_quiz)
    else:
        next_btn.config(text="NEXT", command=go_next)

实现go_next(下一题)和submit_quiz(提交)函数:

def go_next():
    global current_question
    # 保存当前题目的答案
    user_answers.append(selected_option.get())
    current_question +=1
    load_question()

def submit_quiz():
    # 保存最后一题答案
    user_answers.append(selected_option.get())
    # 计算得分
    score = 0
    for i in range(len(data)):
        if user_answers[i] == data[i]["correct_answer"]:
            score +=1
    # 显示最终结果
    question_label.config(text=f"答题完成!你的得分:{score}/{len(data)}")
    # 提交后禁用所有按钮
    prev_btn.config(state=tk.DISABLED)
    next_btn.config(state=tk.DISABLED)
    # 清空选项区域
    for widget in options_frame.winfo_children():
        widget.destroy()

注意事项

  • 题目索引适配:如果你的代码中题目序号从1开始计数,将current_question ==4改为current_question ==5即可。
  • data.json结构要求:确保数据是包含question、options、correct_answer字段的列表,示例结构:
[
    {"question": "第一题?", "options": ["A", "B", "C"], "correct_answer": "A"},
    {"question": "第五题?", "options": ["X", "Y", "Z"], "correct_answer": "Y"}
]
  • 面向对象适配:如果你的代码采用面向对象写法(如继承tk.Frame),将全局变量改为实例属性(如self.current_question)即可,核心逻辑保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:35:18