如何在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
相关产品推荐
相关产品推荐

