# quizapp **Repository Path**: wangdl23/quizapp ## Basic Information - **Project Name**: quizapp - **Description**: 安管人员题库刷题助手——把《20260316 全省安管人员考试题库》4327 道题做成 Windows 单文件 exe,无需安装 Python。支持顺序/随机练习、错题本(连对 2 次自动移除)、收藏、模拟考试、关键词检索,以及「遗忘曲线模式」:设截止日期后按艾宾浩斯间隔排每日任务,每天单选、多选、判断都有。Tkinter 深色界面,进度自动保存,61 项测试全绿。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-11-04 - **Last Updated**: 2026-11-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 安管人员题库刷题助手 v1.11.3 把《20260316 全省安管人员考试题库(2026年3月16日修订版)》做成 Windows 桌面刷题程序,单文件 exe,双击即用,不需要装 Python。 ## 交付物 | 文件 | 说明 | | --- | --- | | `release/安管人员题库刷题助手.exe` | 单文件程序,12.6 MB,Win10/11 64 位 | SHA256:`B85B76F29231C76271F2FB10FE54F1003338DCB6E5DDB72C6C4086A91621232E`(v1.11.3) ## 题库 从原始 xlsx 的「单选题 / 多选题 / 判断题」三张表抽取值,4327 题(去掉了 3 道题干+选项+答案完全重复的题): - 单选 1077、多选 623、判断 2627 - 分类:法律法规 389、安全管理 1806、土建综合安全技术 1045、机械设备安全技术 1087 - 每题带「考点」解析(法规条文出处),全部保留 数据源里的两处脏数据已在抽取阶段处理并有断言兜底: 1. 两行选项字母先乱序写(A、B、D、C、E),用「严格解析 → 答案约束校验 → 乱序重排兜底」修好; 2. 4 处选项写在同行("A.… B.…"),解析器按 `A-E` 顺序标记切分,支持同行与换行两种排版。 ## 功能 ### 题库首页与分类导航(v1.6.0 起,v1.7.0 增强) - **首页**:4 个分类卡片(法律法规 / 安全管理 / 土建综合安全技术 / 机械设备安全技术),每张显示单选/多选/判断题量与完成率;下方「常用入口」保留错题本、收藏、顺序、随机、模拟考试、遗忘曲线 - **分类页**:列出该分类下所有分项(各自题量与完成率),顶部「开始刷题(整个分类)」 - **分项刷题**:点分项进入顺序刷题,进度按分项独立保存 - **答题界面**:底部右侧常驻「下一分项 →」「← 回到上一分项」(无历史时置灰),以及「只刷未做」开关;首页/分类页显示**掌握率**(最近一次答对的题数) - **滚动**:题目区滚轮在任意位置可用;滚动范围严格等于内容高度——内容不足一屏不滚,滚到顶/底即停,不会拖出空白 - **题型穿插(v1.8.0)**:顺序练习、分类刷题、分项刷题一律按「单选→多选→判断」轮转出题,不再刷完一种才轮到下一种;先按「只刷未做」过滤再穿插 - **手写判断依据(v1.9.1 起)**:`data/basis.json` 按题号存人工编写的判断依据,命中即替换自动推断(原文与选项对照保留)。**已全库覆盖 4327 / 4327 题(100%)**,共 26 个分项、4327 条,逐条人工编写、无脚本生成:法律法规 389 + 安管人员 488 + 危大工程 469 + 重大事故隐患 277 + 施工用电 376 + 施工机具 222 + 应急和事故管理 177 + 塔式起重机 164 + 附着式升降脚手架 176 + 施工升降机 172 + 扣件式钢管脚手架 147 + 高处作业吊篮 147 + 消防安全 130 + 高处作业 133 + 起重吊装 143 + 建筑起重机械 113 + 安全生产费用及安责险 98 + 有限空间作业 80 + 文明施工 77 + 物料提升机 63 + 模板支架 60 + 特种作业人员 59 + 安全生产许可证 55 + 基坑工程 42 + 施工许可 32 + 建筑市场 20 + 起重机械 18。全部条目 ≥34 字、统一以「判断依据」开头,含条号/数值口径与干扰项错因 - **判断依据全量体检(v1.9.0)**:修掉「整条条文含『不得』就把本题说成禁止性规定」的误判(原 3504 条规范性质结论里 1008 条与条文对不上,现已 0 条);新增「主体→产物」依据(如「省、自治区、直辖市和设区的市人民政府」→「制定地方政府规章」,并列出国务院/部门/人大各自制定什么)与「范围→标准层级」依据(全国→GB、某行业→JGJ、本省→DB、团体 T/、企业 Q/);审计脚本 `scripts/audit_basis_quality.py` 可复跑 - **复习中心(v1.8.1)**:记忆池按分类列出「今日到期 N 题」,每类可单独「复习这一分类」;顶部有「今日只复习、不推新题」开关(持久化),未来 7 天预告;无计划时也能直接复习 - **计划=新题配额(v1.8.2)**:计划的截止日期只决定每天投放多少新题(自动按剩余天数调整),复习调度全池统一;换计划/清计划都保留已学记录,看板同时给出计划内与全池两个口径 - **记忆池与复习入口(v1.8.0)**:任何模式答过一题就进全局记忆池(含模拟考试:答对推进一档、答错回退一档;空着没作答的题不算答过,仍留在池外按未学处理,见 v1.11.2),按 1/2/4/7/15/30 天排期;首页/分类页显示「待复习 N」,点「复习 N 题」只做到期题;复习中心显示记忆池总览与未来 7 天预告;计划只决定每天投放多少新题,换计划不清空已学记录 - **顺序练习**:按 分类 / 分项 / 题型 筛选,翻页即记位置,下次打开接着上次那题 - **随机练习**:同筛选条件下乱序 - **错题本**:答错自动进本,连续答对 2 次自动移出(能看到「已毕业」提示) - **我的收藏**:★ 收藏常错题 - **全真模拟**:自定题量与时长、倒计时、交卷评分、错题清单、一键重做 - **逐题解析**:答完立刻显示「为什么」和「怎么记」——为什么 = 法规条文原文 + 选项逐条对照;怎么记 = 本条在题库考过几次、常考数字、同条其他题 - **遗忘曲线模式**:设截止日期,按艾宾浩斯间隔(1/2/4/7/15/30 天)排每日任务;**每日任务只定数量、不锁题目**(v1.11.3),可随时切分类刷,答一题今日进度 +1;复习到期优先、新题按题型轮转 - **三种刷题模式的区别(v1.11.1)**:顺序 = 当前筛选的全部题、按「单选→多选→判断」轮转、可按筛选条件断点续接;随机 = 同一批题只做洗牌(不抽样);遗忘曲线 = 不是一套固定题,而是「到期复习 + 当日新题额度」的排程——顺序/随机刷过的题会自动喂进它。模拟考试交卷时**答对、答错的题都进记忆池**(答对推进一档、答错回退一档,次日重来;空着没作答的不进池),答错的题同时进错题本 - **检索**:按题干 / 选项 / 考点关键词找题 - **快捷键**:A–E 或 1–5 选项,Enter 提交/下一题,空格看答案,←/→ 翻页,F 收藏(输入框内不抢键) - **进度持久化**:`%APPDATA%\QuizApp\state.json`(收藏/错题/统计/成绩/位置),原子写入,文件损坏自动备份并重建 - **导出**:错题本可导出成 txt(题干+选项+答案+考点) ## 遗忘曲线模式怎么用 1. 侧栏点「遗忘曲线」,填截止日期(默认 30 天后),点「生成计划」; 2. 看板显示:截止日期/剩余天数、**今日目标**(复习 X · 新学 Y)、**今日已完成与还差几题**、总体进度、未来 7 天复习预告; 3. 点「开始今日任务(还差 N 题)」刷题,每题左上标【新学】或【复习】; 4. 全部做完自动回看板,明天再来接着做;「重新制定计划」会清空记忆进度(错题本/收藏保留)。 **v1.11.3:今日任务只定数量,不锁题目。** 看板上的数字是「今天要做多少题」,不是「今天这几道题」——当天第一次打开看板时把目标定下来(写进 `state.json` 的 `day` 字段),之后**切到任意分类**用顺序/随机/错题本/模拟考试刷题,都算今天的进度,答一题 +1,「还差 N 题」跟着减;目标当天不再变(否则每日额度会边刷边缩),换计划才重算。「开始今日任务」只是按当前情形发一轮够量的题(复习在前),不做任何锁定。 排程规则(quizapp/memory.py,纯逻辑可单测): - 新学的题当天答对 → 记为第 1 档,1 天后复习;再答对 → 2、4、7、15、30 天; - 答错回退一档、次日重来,同时照旧进错题本; - 每日新题量按「剩余未学 ÷ 剩余天数」自动算,复习积压超过新题量 2 倍时自动减半让路; - 复习排期不会超过截止日期(最后一轮压在截止日当天); - 队列 = 到期复习(前)+ 当天新题(后),两部分各自按 单选→多选→判断 轮转,保证每天三种题型都有。 ## 解析(为什么 / 怎么记) 源题库的「考点」列只有出处(如“《立法法》第七十二条规定”),没有讲解。程序的做法是把出处变成可读的解析: - **为什么**(v1.5.0:所有题型都给「判断依据」): - 条文题:说明条文是禁止性(严禁/不得)还是义务性(应当/必须),数字题直接对比条文里的数字; - 判断题:区分「方向反了(把禁止说成允许)」「数字/日期被改」「主体被换」; - 目录题:说明【禁止】= 全面停用、【限制】= 限条件使用; - 施行日期题:给出该法现行版本的准确施行日期与修正依据; - 条文未收录时:给该题型的通用判断方法,不编造理由。 - 分类题(X 属于哪种法规/标准):**给判断依据,不只是给答案**——每个文件写明「以什么形式发布(部令/国务院令/人大公告/部委文号)→ 属于什么等级 → 为什么」,再附「一眼分辨」口诀和效力层级;内置对照表 - 分类题(X 属于哪种法规/标准):**给判断依据,不只是给答案**——每个文件写明「以什么形式发布(部令/国务院令/人大公告/部委文号)→ 属于什么等级 → 为什么」,再附「一眼分辨」口诀和效力层级;内置对照表(`quizapp/legal_forms.py`,45 个文件逐个核实文号/标准号)——「《建筑工程施工许可管理办法》→ 住建部令第 18 号 → 部门规章」,并给出法律/行政法规/地方性法规/部门规章/地方政府规章的制定主体对照; - 条文题:先给原文,再逐项说清——正确项“条文只禁止「…」,所以选它”;干扰项若是制定主体,说明“它制定的是法律/部门规章,不是本题所问”; - 判断题:找原文最接近的一句做对齐,“哪里错:题干写「可以」,原文是「严禁…」”; - 目录题:逐项标出“列入本目录【禁止】/【限制】”。 - **怎么记**:分类题(「X 属于哪种法规/标准」)给「判断依据」——直接摘出该概念的定义句(如“地方性法规由省级人大及其常委会制定”);条文题给“本条文还考过 N 次”、**只保留本题也涉及的数字**、3 道同条题预览;不再拿整部法规的统计和无关数字凑数。 - **覆盖率**:条文库当前收录 40 部(13 部法规规章 + 25 部行业标准/部委文件 + 2 部目录清单)、6824 条原文,可对上 3910 / 4327 题(90.4%)。对不上的题会明说“暂未收录该条原文”,但仍给出同条题群记忆卡,不编造理由。 - **支持的条号形态**:法规用“第七十二条”;标准用“4.8.6条”(含“第3.2.3.1条”“2.0.21、2.0.22条”并列写法,以及不带“条”的“中 3.9.3”);危大通知这类用“附件1、一”。 - **无条号 → 关键词定位**:标准化法/立法法这类只写“相关规定”的题,按答案与题干里的分类词(行政法规/地方性法规/部门规章/国家标准/强制性/推荐性…)在条文里定位定义句,标注「按关键词定位」展示。 - **补条文的两条路**:①官网抓取——编辑 `scripts/lawlib.py` 的 `DOCS` 加页面地址,跑 `python scripts/lawlib.py`;②本地文件——把 PDF/docx 放到桌面或任意位置,改 `scripts/import_standards.py` 的 `SOURCES` 后跑 `python scripts/import_standards.py`(PDF 文字版直接抽,扫描版先用 `scripts/ocr_pdfs.py` OCR 成 `data/ocr/.txt`)。 - **网页抓取**:`scripts/fetch_web_standard.py` 支持两种站点——分章节站点(消防规范网,逐节抓 JGJ/T 46-2024、GB/T 50720、GB 10055)与整页全文(gzhxaq.com,抓 JGJ 59/276/311、GB/T 19155、GB 5144),抓完自动落入 `data/ocr/.txt`,再跑导入脚本切条。 - **待补**:高处作业吊篮 GB/T 19155 残余(44)、有限空间指南残余(40)、淘汰目录部分条目(36,选项与条目名缩写不一致)、JG/T 546 附着式升降平台(28)、GB/T 34025 齿轮防坠安全器(25)、施工许可办法(25)、大气污染防治法(24)、起重吊装 JGJ 276 残余(22)等。 ## 项目结构 ``` QuizApp/ ├─ main.py 启动入口(--selftest / --smoke 供打包自检) ├─ quizapp/ │ ├─ model.py 题库模型、判题、筛选、检索(不依赖 tkinter) │ ├─ store.py 进度存储(原子写、损坏自愈) │ ├─ memory.py 遗忘曲线排程(艾宾浩斯间隔、每日队列、统计) │ ├─ explain.py 逐题解析(条文原文对照、同条题群记忆卡) │ └─ ui.py Tkinter 界面(深色主题、自绘选项行/滚动条/下拉) ├─ data/questions.json 抽取后的题库(2.0 MB) ├─ data/laws.json 条文库(40 部 / 6824 条,解析用;法规 + 标准 + 目录) ├─ data/ocr/ 本地 PDF/docx 抽取或 OCR 出来的文本缓存(不打包) ├─ assets/app.ico 应用图标 ├─ release/ 交付 exe ├─ scripts/ 抽取、条文导入/网页抓取/OCR、图标、截图、打包、exe 验证脚本 │ ├─ lawlib.py 官网抓取法规条文 → laws.json │ ├─ import_standards.py 本地 PDF/docx 切条并入 laws.json │ ├─ fetch_web_standard.py 从消防规范网/标准站点抓全文 → 文本缓存 │ └─ ocr_pdfs.py 扫描版 PDF → 图片 → OCR 文本缓存 └─ tests/ 72 项单元 + 界面交互测试 ``` ## 源码运行 / 测试 / 打包 ```powershell # 直接跑源码(需 Python 3.10+,只用标准库 tkinter) python main.py # 测试(72 项,含真起窗口的界面交互测试) python -m unittest discover -s tests -t . -v # 打包单文件 exe powershell -ExecutionPolicy Bypass -File scripts\build_exe.ps1 ``` 打包要点(Anaconda 环境踩过的坑,已固化进脚本): - `--add-binary` 补 `tcl86t.dll` / `tk86t.dll`,`--add-data` 补 `tcl8.6` / `tk8.6`,否则 exe 启动即崩(无窗口无报错) - 构建时把 `D:\Anaconda3\Library\bin` 加进 PATH,让分析阶段能解析 `_tkinter` - 窗口模式(`--windowed`)下 `sys.stdout` 是 None,自检里的 `print` 必须做空值保护,否则自检直接崩 ## 验证记录 - 源码测试:`Ran 72 tests ... OK`(模型 + 存储 + 界面 + 遗忘曲线 + 记忆模式界面 + 解析 11 项) - 打包自检:`exe --selftest` → 日志含 `SELFTEST OK`、题库 4327 题、判题自检 True、 `遗忘曲线自检: 计划 4327 题 · 今日 140 题 · 题型 judge/multi/single`、 `解析自检: 条文库 40 部/6824 条 · 可解析 3910 题`(v1.11.3) - 界面实测:启动 exe 截屏确认深色界面、题目渲染、筛选下拉、底部导航均正常; 设 `QUIZAPP_START_MODE=memory` 启动直接进遗忘曲线看板,`scripts/verify_exe.py` 用 PrintWindow 抓图可复现