快速结论:当你在事件回调里对“已经渲染过”的 gr.Accordion 返回 open=True,且这次更新同时把 visible=False 翻成 True 时,后端逻辑状态已变为展开,但前端挂载后仍显示折叠,导致第一次点击标题被“吃掉”(实际触发 collapse),第二次点击才展开。优先排查是否属于同一更新中同时切换 visible 与 open 的场景。
适用环境:Issue 中已确认 Gradio 6.28.0 复现,Gradio 5.49.1 行为正确;修复分支基于 Gradio main 分支验证。Issue 未提供操作系统、Python、浏览器、CUDA、显卡等环境信息。
最快修复方案:暂无确认的一步修复方案。Issue 中作者给出的修复位于 js/accordion/Index.svelte,需要改动 Gradio 前端源码(改用 bind:open 并调整事件派发时机),属于需要等待官方合入修复的缺陷,不是配置项层面的修复。
注意事项:该修复仅在作者 fork 分支 fix-accordion-open-visual-sync 上验证,尚未合入官方仓库;作者在对应仓库开 PR 时遇到 404,说明当时外部 PR 可能被限制。Issue 最终已被官方确认并关闭修复,因此升级到包含该修复的 Gradio 版本前,不要依赖“手动改前端”作为长期方案。
问题场景
使用 Gradio 搭建 Blocks 应用时,用户在一个事件处理器(例如页面切换、按钮点击的 populate/navigate 函数)中返回 gr.update(open=True) 或 gr.Accordion(open=True),目标是让页面上已经渲染过的 Accordion 展开。典型触发条件是同一个更新里 Accordion 从 visible=False 变为 visible=True,同时 open=False 变为 open=True,也就是“新挂载 + 携带展开状态”的组合。Issue 报告的场景是分页表格/分页卡片列表,每页 16 个 Accordion,切换到新页时需要让指定槽位默认展开。
报错原文
Accordion: backend `open=True` doesn't visually expand on an already-rendered accordion; first header click is consumed (regression vs 5.x)
原始 Issue 正文中还出现了由复现脚本输出顺序不匹配导致的报错:
Textbox.__init__() got an unexpected keyword argument 'open'
原因分析
Issue 中确认的根因在前端 js/accordion/Index.svelte,有两个问题点:
set_data在 open 状态更新仍在 flush 时同步派发expand事件,可能导致共享 Accordion 组件渲染为折叠状态;文件里原本的注释已提示该竞态,但只对gradio_expand做了规避。open以单向方式传给共享 Accordion,用户点击后状态与props.open发生分歧,后续无关更新可能把视觉状态又拉回去。
结果是:后端逻辑 open 为 true,前端刚挂载的组件却按折叠渲染;第一次点击标题时内部状态本来已是 true,点击把它翻回 false,视觉上没有任何变化(实际触发 collapse),第二次点击才真正展开。此外,原报告中的复现脚本还存在 outputs 顺序不匹配:populate() 返回的是 Accordion、Textbox 交替,而 outputs_populate 先列全部 Accordion 再列全部 Textbox,这会产生 Textbox.__init__() got an unexpected keyword argument 'open',属于脚本自身写法问题,与 Accordion 视觉不同步是两个独立问题。
环境排查
- 确认 Gradio 版本:
6.28.0可复现,5.49.1行为正确,对比两版行为可快速判断是否命中该回归。 - 确认更新方式:事件回调是否同时返回
visible=True与open=True;若只单独更新open,按 Issue 中的最小测试不会复现。 - 确认
outputs顺序与回调返回值顺序一致,避免把open误传给 Textbox 等组件。 - Issue 未提供 Python、操作系统、浏览器、CUDA、显卡、PyTorch 等环境项,这些项目不作为排查依据。
解决步骤
- 先做版本对照:用
gradio==5.49.1和gradio==6.28.0分别跑最小脚本,确认 5.49.1 更新后内容高度为展开态(112px)、第一次点击即可折叠;6.28.0 更新后为折叠态(50px)、第一次点击无视觉变化。 - 核对复现脚本的
outputs顺序,先把所有 Accordion 更新放在前面、所有 Textbox 更新放在后面,排除Textbox.__init__() got an unexpected keyword argument 'open'这类由顺序错位引发的干扰。 - 确认问题范围:是否属于“同一次更新中
visible=False → True且open=False → True”的场景。如果只是单独更新open,Issue 中作者测试显示不会复现,可以排除该路径。 - 若确认命中该回归,按 Issue 中作者的 fork 分支核对/应用修复:在
js/accordion/Index.svelte中,把expand与相关事件的派发放到 DOM flush 之后,并将共享 Accordion 的open改为bind:open,使props.open与点击状态保持单一数据源。 - 官方已确认该问题并将关闭修复,因此可优先尝试升级到包含该修复的 Gradio 版本;Issue 中未给出具体修复版本号,不要凭猜测指定版本。
- 如果需要本地临时绕过,可考虑避免在首次挂载的同一次更新中同时设置
visible=True和open=True(例如先让组件可见,再在后续事件中更新open),但这属于 Issue 未明确验证的变通做法,可优先尝试并在实际环境中自行验证。
验证方法
用 Issue 中最小复现脚本在浏览器中观察:点击 “Reveal” 后,Accordion 应立刻视觉展开,Textbox 内容可见,第一次点击标题即可正常折叠,不再出现“第一次点击无反应、第二次才展开”。如需更精确,可比对 DOM 中 Accordion 内容区域高度:5.49.1 更新后为 112px(展开),6.28.0 为 50px(折叠)。作者还补充了两个回归测试方向:更新同时翻转 visible 与 open;用户点击后再发生无关更新,视觉状态不应被拉回。修复后跑 Accordion 测试套件,确认无新增失败。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


![[Bug]: Heavy RAM Usage over time](https://www.chat-gpts.plus/wp-content/uploads/2026/10/12685-b90db227-768x403.jpg)