app.py
CHANGED
|
@@ -75,16 +75,18 @@ def handle_load(source, c_type, c_id, model):
|
|
| 75 |
json.dumps({})
|
| 76 |
]
|
| 77 |
|
|
|
|
| 78 |
def handle_qa_select(selection, qa_json):
|
| 79 |
if not selection or not qa_json:
|
| 80 |
-
|
|
|
|
| 81 |
try:
|
| 82 |
qas = json.loads(qa_json)
|
| 83 |
idx = int(selection.split(":")[0][1:]) - 1
|
| 84 |
curr = qas[idx]
|
| 85 |
-
return [curr['id'], curr['q'], curr['a'], "correct", "无", ""
|
| 86 |
except:
|
| 87 |
-
return [""
|
| 88 |
|
| 89 |
# ============== UI 布局 ==============
|
| 90 |
def create_ui():
|
|
@@ -122,7 +124,6 @@ def create_ui():
|
|
| 122 |
a_disp = gr.Text(label="标准答案")
|
| 123 |
status_opt = gr.Radio(
|
| 124 |
label="审核结论",
|
| 125 |
-
# 【修正】将 "modified" 改为 "needs_modification" 匹配 DataManager 内部逻辑
|
| 126 |
choices=[("正确", "correct"), ("错误", "incorrect"), ("优化", "needs_modification")],
|
| 127 |
value="correct"
|
| 128 |
)
|
|
@@ -130,7 +131,6 @@ def create_ui():
|
|
| 130 |
|
| 131 |
comment = gr.Text(label="审核备注")
|
| 132 |
|
| 133 |
-
# 【新增】状态提示框,用于反馈保存成功与否
|
| 134 |
save_status = gr.Text(label="操作反馈", interactive=False)
|
| 135 |
save_btn = gr.Button("💾 提交单条审核", variant="primary")
|
| 136 |
|
|
@@ -139,7 +139,6 @@ def create_ui():
|
|
| 139 |
next_btn = gr.Button("➡️ 下一个图表")
|
| 140 |
|
| 141 |
gr.Markdown("---")
|
| 142 |
-
# 【新增】下载区
|
| 143 |
with gr.Row():
|
| 144 |
export_btn = gr.Button("📥 导出并下载审核记录", variant="secondary")
|
| 145 |
download_file = gr.File(label="下载文件", visible=False)
|
|
@@ -157,10 +156,11 @@ def create_ui():
|
|
| 157 |
id_dd.change(handle_load, inputs=[src_dd, typ_dd, id_dd, mdl_dd], outputs=load_event_outputs)
|
| 158 |
mdl_dd.change(handle_load, inputs=[src_dd, typ_dd, id_dd, mdl_dd], outputs=load_event_outputs)
|
| 159 |
|
|
|
|
| 160 |
qa_radio.change(
|
| 161 |
handle_qa_select,
|
| 162 |
inputs=[qa_radio, qa_store],
|
| 163 |
-
outputs=[curr_qid, q_disp, a_disp, status_opt, err_type,
|
| 164 |
)
|
| 165 |
|
| 166 |
# 导航逻辑
|
|
@@ -172,14 +172,14 @@ def create_ui():
|
|
| 172 |
gr.update(value=target['chart_type']),
|
| 173 |
gr.update(value=target['chart_id']),
|
| 174 |
gr.update(value=target['model']),
|
| 175 |
-
gr.update(value="") # 切换时清空状态
|
| 176 |
]
|
| 177 |
return [gr.update()] * 4 + [gr.update()]
|
| 178 |
|
| 179 |
prev_btn.click(lambda: navigate(-1), outputs=[src_dd, typ_dd, id_dd, mdl_dd, save_status])
|
| 180 |
next_btn.click(lambda: navigate(1), outputs=[src_dd, typ_dd, id_dd, mdl_dd, save_status])
|
| 181 |
|
| 182 |
-
#
|
| 183 |
def quick_save(qid, cid, src, status, cmt):
|
| 184 |
if not qid:
|
| 185 |
return "⚠️ 无效操作:未选择题目", gr.update()
|
|
@@ -189,7 +189,6 @@ def create_ui():
|
|
| 189 |
"status": status, "comment": cmt
|
| 190 |
})
|
| 191 |
|
| 192 |
-
# 【增强】保存后立刻刷新全局统计信息
|
| 193 |
stats = data_manager.get_review_stats()
|
| 194 |
stats_str = f"✅{stats['correct']} | ❌{stats['incorrect']} | 总{stats['total']}"
|
| 195 |
|
|
@@ -198,11 +197,10 @@ def create_ui():
|
|
| 198 |
save_btn.click(
|
| 199 |
quick_save,
|
| 200 |
inputs=[curr_qid, id_dd, src_dd, status_opt, comment],
|
| 201 |
-
# 【修复】将结果输出到已经实例化的组件上
|
| 202 |
outputs=[save_status, stats_txt]
|
| 203 |
)
|
| 204 |
|
| 205 |
-
#
|
| 206 |
def handle_export():
|
| 207 |
file_path = data_manager.export_reviews()
|
| 208 |
return gr.update(value=file_path, visible=True)
|
|
|
|
| 75 |
json.dumps({})
|
| 76 |
]
|
| 77 |
|
| 78 |
+
# 【修复处 1】移除冗余返回值,只返回需要更新的 6 个 UI 状态
|
| 79 |
def handle_qa_select(selection, qa_json):
|
| 80 |
if not selection or not qa_json:
|
| 81 |
+
# curr_qid, q_disp, a_disp, status_opt, err_type, comment
|
| 82 |
+
return ["", "", "", "correct", "无", ""]
|
| 83 |
try:
|
| 84 |
qas = json.loads(qa_json)
|
| 85 |
idx = int(selection.split(":")[0][1:]) - 1
|
| 86 |
curr = qas[idx]
|
| 87 |
+
return [curr['id'], curr['q'], curr['a'], "correct", "无", ""]
|
| 88 |
except:
|
| 89 |
+
return ["", "", "", "correct", "无", ""]
|
| 90 |
|
| 91 |
# ============== UI 布局 ==============
|
| 92 |
def create_ui():
|
|
|
|
| 124 |
a_disp = gr.Text(label="标准答案")
|
| 125 |
status_opt = gr.Radio(
|
| 126 |
label="审核结论",
|
|
|
|
| 127 |
choices=[("正确", "correct"), ("错误", "incorrect"), ("优化", "needs_modification")],
|
| 128 |
value="correct"
|
| 129 |
)
|
|
|
|
| 131 |
|
| 132 |
comment = gr.Text(label="审核备注")
|
| 133 |
|
|
|
|
| 134 |
save_status = gr.Text(label="操作反馈", interactive=False)
|
| 135 |
save_btn = gr.Button("💾 提交单条审核", variant="primary")
|
| 136 |
|
|
|
|
| 139 |
next_btn = gr.Button("➡️ 下一个图表")
|
| 140 |
|
| 141 |
gr.Markdown("---")
|
|
|
|
| 142 |
with gr.Row():
|
| 143 |
export_btn = gr.Button("📥 导出并下载审核记录", variant="secondary")
|
| 144 |
download_file = gr.File(label="下载文件", visible=False)
|
|
|
|
| 156 |
id_dd.change(handle_load, inputs=[src_dd, typ_dd, id_dd, mdl_dd], outputs=load_event_outputs)
|
| 157 |
mdl_dd.change(handle_load, inputs=[src_dd, typ_dd, id_dd, mdl_dd], outputs=load_event_outputs)
|
| 158 |
|
| 159 |
+
# 【修复处 2】移除这里 outputs 里的 gr.State(),使其与上方返回的 6 个值严格对齐
|
| 160 |
qa_radio.change(
|
| 161 |
handle_qa_select,
|
| 162 |
inputs=[qa_radio, qa_store],
|
| 163 |
+
outputs=[curr_qid, q_disp, a_disp, status_opt, err_type, comment]
|
| 164 |
)
|
| 165 |
|
| 166 |
# 导航逻辑
|
|
|
|
| 172 |
gr.update(value=target['chart_type']),
|
| 173 |
gr.update(value=target['chart_id']),
|
| 174 |
gr.update(value=target['model']),
|
| 175 |
+
gr.update(value="") # 切换时清空反馈状态
|
| 176 |
]
|
| 177 |
return [gr.update()] * 4 + [gr.update()]
|
| 178 |
|
| 179 |
prev_btn.click(lambda: navigate(-1), outputs=[src_dd, typ_dd, id_dd, mdl_dd, save_status])
|
| 180 |
next_btn.click(lambda: navigate(1), outputs=[src_dd, typ_dd, id_dd, mdl_dd, save_status])
|
| 181 |
|
| 182 |
+
# 保存逻辑
|
| 183 |
def quick_save(qid, cid, src, status, cmt):
|
| 184 |
if not qid:
|
| 185 |
return "⚠️ 无效操作:未选择题目", gr.update()
|
|
|
|
| 189 |
"status": status, "comment": cmt
|
| 190 |
})
|
| 191 |
|
|
|
|
| 192 |
stats = data_manager.get_review_stats()
|
| 193 |
stats_str = f"✅{stats['correct']} | ❌{stats['incorrect']} | 总{stats['total']}"
|
| 194 |
|
|
|
|
| 197 |
save_btn.click(
|
| 198 |
quick_save,
|
| 199 |
inputs=[curr_qid, id_dd, src_dd, status_opt, comment],
|
|
|
|
| 200 |
outputs=[save_status, stats_txt]
|
| 201 |
)
|
| 202 |
|
| 203 |
+
# 导出下载逻辑
|
| 204 |
def handle_export():
|
| 205 |
file_path = data_manager.export_reviews()
|
| 206 |
return gr.update(value=file_path, visible=True)
|