Spaces:
Running
運算中途按「回首頁」:中止還在跑的分析,並把結果導覽閘門關回去
Browse files業主回報:分析運算跑到一半按「回首頁」再重新進來,畫面又冒出上一輪的
分析運算面板,步驟列停在舊狀態、對話也還是舊訊息。
查證分兩段:分析**跑完後**再重置是乾淨的(實測面板/對話/下載捷徑全清),
**跑到一半**重置才會重現。所以問題不是重置漏清,而是重置沒有中止那條還在
跑的 generator——_run_computation 每個子階段都會 yield 一次畫面,重置把畫面
清乾淨之後,它後續的 yield 又一格一格把舊內容畫回去,看起來就像重置沒生效。
修法用 Gradio 原生 cancels:按「確定回首頁」時直接中止「確認並開始分析」與
「略過」那兩條事件鏈(兩者都會進同一支 _run_computation),generator 停在
原地,不再有遲到的 yield。為了拿得到那兩個事件物件,reset_confirm_btn 的
接線從原位置搬到 create_app 結尾(Gradio 接線順序不影響行為,只有 cancels
需要引用先前建立的事件)。
順帶修掉查證時發現的另一個殘留:結果導覽的 A2 閘門(語言指標分析/統計四項/
LLM輔助分析)在 _populate_tabs 產出結果時被打開,但重置從來沒關回去——重置
後回到全新首頁,那些項目仍可點,點進去是空白結果頁。已在
on_reset_clear_workspace 一併設回 interactive=False。
驗證(本機 .venv + Playwright):
- 中途重置:運算啟動 3.5 秒後按回首頁→確定,再等 12 秒讓遲到的 yield 有機會
出現——首頁正確顯示、工作區隱藏、無分析面板、對話 0 則、步驟列清空;
重新進入工作區後:研究選擇卡片正常、無面板殘留、步驟列回到未完成狀態、
對話只有歡迎詞、下載捷徑不在、語言指標分析與敘述統計皆不可點、
技術執行紀錄只剩「已重新開始分析」。
- 正常流程不受影響:重跑一次完整分析,指標計算/統計分析完成、導覽閘門
正確開啟、下載捷徑出現、步驟列正確(報告階段因本機 429 額度用盡標紅,
屬既有的誠實失敗行為)。
- console 僅 3 筆既有外部資源錯誤。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MQuAXWC1hCsiT48TXftPc7
- app_agent.py +43 -20
|
@@ -3918,6 +3918,11 @@ def create_app():
|
|
| 3918 |
gr.update(value=""), # meta_version
|
| 3919 |
gr.update(value="二群"), # meta_ngroups(元件宣告時的預設值)
|
| 3920 |
gr.update(value="群組間比較"), # meta_method(元件宣告時的預設值)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3921 |
)
|
| 3922 |
|
| 3923 |
def on_reset_confirm():
|
|
@@ -3943,24 +3948,10 @@ def create_app():
|
|
| 3943 |
|
| 3944 |
reset_btn.click(fn=lambda: gr.update(visible=True), outputs=[reset_confirm_row])
|
| 3945 |
reset_cancel_btn.click(fn=lambda: gr.update(visible=False), outputs=[reset_confirm_row])
|
| 3946 |
-
reset_confirm_btn
|
| 3947 |
-
|
| 3948 |
-
|
| 3949 |
-
|
| 3950 |
-
upload_progress_html,
|
| 3951 |
-
meta_title, meta_author, meta_lang, meta_pubyear, meta_version,
|
| 3952 |
-
meta_ngroups, meta_method],
|
| 3953 |
-
).then(
|
| 3954 |
-
fn=on_reset_confirm,
|
| 3955 |
-
# 2026-07-30(2-C 第 5 項):chat_upload 這輪常駐隱藏、不再接任何
|
| 3956 |
-
# wiring(見 chat_upload_col 定義處註解),這裡把它從 outputs 移除。
|
| 3957 |
-
# E3(2026-08-05):scenario_btn_col 空 Column 已整段拿掉,一併從
|
| 3958 |
-
# outputs 移除。回傳 tuple 的元素個數/順序已同步調整為 8 個,
|
| 3959 |
-
# 跟這份 outputs 清單一一對應。
|
| 3960 |
-
outputs=[chatbot, exec_log, session_state, app_header_html,
|
| 3961 |
-
upload_row,
|
| 3962 |
-
reset_confirm_row, homepage_col, workspace_row],
|
| 3963 |
-
)
|
| 3964 |
|
| 3965 |
# ── 檔案上傳確認(streaming generator)──────────────────────────────
|
| 3966 |
def on_upload_confirm(files, chat_history, log_history, state):
|
|
@@ -4272,7 +4263,7 @@ def create_app():
|
|
| 4272 |
def _unlock_meta():
|
| 4273 |
return gr.update(interactive=True), gr.update(interactive=True)
|
| 4274 |
|
| 4275 |
-
meta_confirm_btn.click(
|
| 4276 |
fn=_lock_meta, inputs=None, outputs=[meta_confirm_btn, meta_cancel_btn],
|
| 4277 |
).then(
|
| 4278 |
fn=on_metadata_confirm,
|
|
@@ -4306,7 +4297,7 @@ def create_app():
|
|
| 4306 |
chat_history, log_history, state = ch, lh, st
|
| 4307 |
yield (chat_history, log_history, state, gr.update(visible=False), todo, acc, comp, *tabs)
|
| 4308 |
|
| 4309 |
-
meta_cancel_btn.click(
|
| 4310 |
fn=_lock_meta, inputs=None, outputs=[meta_confirm_btn, meta_cancel_btn],
|
| 4311 |
).then(
|
| 4312 |
fn=on_metadata_skip,
|
|
@@ -4317,6 +4308,38 @@ def create_app():
|
|
| 4317 |
fn=_unlock_meta, inputs=None, outputs=[meta_confirm_btn, meta_cancel_btn],
|
| 4318 |
).then(fn=_populate_tabs, inputs=[session_state], outputs=_TAB_OUTPUTS)
|
| 4319 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4320 |
return demo
|
| 4321 |
|
| 4322 |
|
|
|
|
| 3918 |
gr.update(value=""), # meta_version
|
| 3919 |
gr.update(value="二群"), # meta_ngroups(元件宣告時的預設值)
|
| 3920 |
gr.update(value="群組間比較"), # meta_method(元件宣告時的預設值)
|
| 3921 |
+
# 2026-08-12:結果導覽的 A2 閘門要一起關回去。這幾顆在
|
| 3922 |
+
# _populate_tabs 產出結果時被打開(interactive=True),但重置
|
| 3923 |
+
# 從來沒有關回來——實測重置後回到全新首頁,「語言指標分析」等
|
| 3924 |
+
# 項目仍是可點狀態,點下去是一片空白的結果頁。
|
| 3925 |
+
*([gr.update(interactive=False)] * len(_TAB_NAV_GATES)),
|
| 3926 |
)
|
| 3927 |
|
| 3928 |
def on_reset_confirm():
|
|
|
|
| 3948 |
|
| 3949 |
reset_btn.click(fn=lambda: gr.update(visible=True), outputs=[reset_confirm_row])
|
| 3950 |
reset_cancel_btn.click(fn=lambda: gr.update(visible=False), outputs=[reset_confirm_row])
|
| 3951 |
+
# 2026-08-12:reset_confirm_btn 的接線搬到檔案最後(見 create_app 結尾
|
| 3952 |
+
# 「重置接線」那段)。原因:它需要 cancels=[分析運算那兩條事件鏈],而
|
| 3953 |
+
# 那兩條要等 meta_confirm_btn/meta_cancel_btn 接完才存在。Gradio 的
|
| 3954 |
+
# 接線順序不影響行為,只有 cancels 需要拿到事件物件,所以往後搬。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3955 |
|
| 3956 |
# ── 檔案上傳確認(streaming generator)──────────────────────────────
|
| 3957 |
def on_upload_confirm(files, chat_history, log_history, state):
|
|
|
|
| 4263 |
def _unlock_meta():
|
| 4264 |
return gr.update(interactive=True), gr.update(interactive=True)
|
| 4265 |
|
| 4266 |
+
confirm_run_evt = meta_confirm_btn.click(
|
| 4267 |
fn=_lock_meta, inputs=None, outputs=[meta_confirm_btn, meta_cancel_btn],
|
| 4268 |
).then(
|
| 4269 |
fn=on_metadata_confirm,
|
|
|
|
| 4297 |
chat_history, log_history, state = ch, lh, st
|
| 4298 |
yield (chat_history, log_history, state, gr.update(visible=False), todo, acc, comp, *tabs)
|
| 4299 |
|
| 4300 |
+
skip_run_evt = meta_cancel_btn.click(
|
| 4301 |
fn=_lock_meta, inputs=None, outputs=[meta_confirm_btn, meta_cancel_btn],
|
| 4302 |
).then(
|
| 4303 |
fn=on_metadata_skip,
|
|
|
|
| 4308 |
fn=_unlock_meta, inputs=None, outputs=[meta_confirm_btn, meta_cancel_btn],
|
| 4309 |
).then(fn=_populate_tabs, inputs=[session_state], outputs=_TAB_OUTPUTS)
|
| 4310 |
|
| 4311 |
+
# ── 重置接線(2026-08-12 從上面搬下來)──────────────────────────
|
| 4312 |
+
# 業主回報:分析運算跑到一半按「回首頁」再重新進來,畫面又冒出上一輪
|
| 4313 |
+
# 的分析運算面板、步驟列停在舊狀態、對話還是舊訊息。
|
| 4314 |
+
# 真因不是重置漏清(分析跑完後再重置是乾淨的,已實測),而是**重置沒有
|
| 4315 |
+
# 中止還在跑的運算**:那條 generator 每個子階段都會 yield 一次畫面,
|
| 4316 |
+
# 重置把畫面清乾淨之後,它後續的 yield 又把舊內容一格一格畫回去,
|
| 4317 |
+
# 最後看起來就像「重置沒生效」。
|
| 4318 |
+
# 修法用 Gradio 原生的 cancels:按下「確定回首頁」時直接中止那兩條
|
| 4319 |
+
# 事件鏈(確認送出/略過 都會進同一支 _run_computation),generator
|
| 4320 |
+
# 停在原地就不會再有遲到的 yield。這也是這段接線必須放在
|
| 4321 |
+
# meta_confirm_btn/meta_cancel_btn 之後的唯一理由——cancels 需要拿到
|
| 4322 |
+
# 它們的事件物件。
|
| 4323 |
+
reset_confirm_btn.click(
|
| 4324 |
+
fn=on_reset_clear_workspace,
|
| 4325 |
+
outputs=[metadata_row, file_input, canvas_idx_col, canvas_stat_col,
|
| 4326 |
+
canvas_report_col, canvas_exec_col, computing_html, result_nav_col,
|
| 4327 |
+
upload_progress_html,
|
| 4328 |
+
meta_title, meta_author, meta_lang, meta_pubyear, meta_version,
|
| 4329 |
+
meta_ngroups, meta_method, *_TAB_NAV_GATES],
|
| 4330 |
+
cancels=[confirm_run_evt, skip_run_evt],
|
| 4331 |
+
).then(
|
| 4332 |
+
fn=on_reset_confirm,
|
| 4333 |
+
# 2026-07-30(2-C 第 5 項):chat_upload 這輪常駐隱藏、不再接任何
|
| 4334 |
+
# wiring(見 chat_upload_col 定義處註解),這裡把它從 outputs 移除。
|
| 4335 |
+
# E3(2026-08-05):scenario_btn_col 空 Column 已整段拿掉,一併從
|
| 4336 |
+
# outputs 移除。回傳 tuple 的元素個數/順序已同步調整為 8 個,
|
| 4337 |
+
# 跟這份 outputs 清單一一對應。
|
| 4338 |
+
outputs=[chatbot, exec_log, session_state, app_header_html,
|
| 4339 |
+
upload_row,
|
| 4340 |
+
reset_confirm_row, homepage_col, workspace_row],
|
| 4341 |
+
)
|
| 4342 |
+
|
| 4343 |
return demo
|
| 4344 |
|
| 4345 |
|