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

使用guizero读取文本文件制作测验GUI的问题求助

测验程序问题分析与修复方案

问题描述

帮助学生实现读取包含题目、选项及答案的文本文件,用guizero制作简易测验,避免为每个题目单独编写检查函数,但现有代码因selected_value未定义无法运行。

错误原因

  1. selected_value参数传递错误:guizero的ButtonGroup组件的command回调函数会自动将当前选中的值作为第一个参数传入,无需手动在args中指定selected_value,直接引用该变量会导致未定义错误。
  2. result组件被覆盖:循环中每次创建的result变量会覆盖之前的实例,导致所有题目共用同一个结果文本,无法正确显示对应题目的判断结果。
  3. 文件处理不规范:手动调用close()存在资源泄漏风险,建议用with语句自动管理文件。
  4. 题目与答案提取逻辑冗余:连续的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:09:46