使用guizero读取文本文件制作测验GUI的问题求助
测验程序问题分析与修复方案
问题描述
帮助学生实现读取包含题目、选项及答案的文本文件,用guizero制作简易测验,避免为每个题目单独编写检查函数,但现有代码因selected_value未定义无法运行。
错误原因
selected_value参数传递错误:guizero的ButtonGroup组件的command回调函数会自动将当前选中的值作为第一个参数传入,无需手动在args中指定selected_value,直接引用该变量会导致未定义错误。result组件被覆盖:循环中每次创建的result变量会覆盖之前的实例,导致所有题目共用同一个结果文本,无法正确显示对应题目的判断结果。- 文件处理不规范:手动调用
close()存在资源泄漏风险,建议用with语句自动管理文件。 - 题目与答案提取逻辑冗余:连续的
reverse()和pop()操作易出错,可简化提取逻辑。
修复后的代码
from guizero import App, Text, ButtonGroup app = App(title="Quiz Test", height=800, width=600) def check_answer(selected_value, answer, result_label): """检查选中答案是否正确,更新对应结果标签""" if selected_value == answer: result_label.value = "Correct" else: result_label.value = "Wrong" # 使用with语句自动管理文件,避免手动关闭 with open("quiz_ques.txt", 'r') as data_file: for line in data_file.read().splitlines(): # 分割每行数据,假设格式为:题目, 选项1, 选项2, ..., 正确答案 parts = line.split(", ") if len(parts) < 3: continue # 跳过格式错误的行 question = parts[0] answer = parts[-1] q_options = parts[1:-1] # 提取中间的选项 # 创建题目文本 Text(app, text=question) # 创建当前题目专属的结果标签 result_label = Text(app) # 创建选项按钮组,args传入答案和对应结果标签 ButtonGroup( app, options=q_options, selected=0, # 默认选中第一个选项(索引从0开始) command=check_answer, args=[answer, result_label] ) app.display()
关键修改说明
- 回调函数参数调整:
check_answer新增result_label参数,guizero自动传入的选中值作为第一个参数,确保每个题目对应独立的结果显示。 - 独立结果组件:每个题目创建专属的
result_label,避免结果显示互相覆盖。 - 简化数据提取:假设文本文件每行格式为
题目, 选项1, 选项2, 正确答案,直接通过索引提取内容,逻辑更清晰。 - 规范文件操作:
with语句会在代码块结束后自动关闭文件,避免资源泄漏。
内容的提问来源于stack exchange,提问作者OpenWise Foundation
相关产品推荐
相关产品推荐

