gradio v6.26.0: Dropdown label not shown on field when option value is None

这个问题通常出现在 Gradio 6.x 中使用 gr.Dropdown(choices=[("Default", None), ...]) ,即把 None 当作一个选项真实值时。下拉列表能显示该项,但输入框不会显示已选中的 label。优先排查你的 choices 里是否用 None 作为选项值

快速结论:这个问题通常出现在 Gradio 6.x 中使用 gr.Dropdown(choices=[("Default", None), ...]),即把 None 当作一个选项真实值时。下拉列表能显示该项,但输入框不会显示已选中的 label。优先排查你的 choices 里是否用 None 作为选项值。

适用环境:Issue 已确认工具为 Gradio;出现问题的版本为 gradio 6.26.0;在 gradio 5.49.1 上不存在该问题。Issue 未提供操作系统、Python、CUDA、显卡或其它依赖信息,这些项目无法确认。

最快修复方案:暂无确认的一步修复方案。官方明确表示不会修改此行为,因为 None 在内部被保留为“未选择任何值”。可优先尝试的变通做法是给“Default”选项使用一个不会与真实值冲突的哨兵字符串(例如 "__default__"),在回调函数内部再把它转换回 None

注意事项:官方说明这是设计限制,不是回归 bug;官方提到可能在 Gradio 7 大版本中重新考虑该逻辑,但目前无时间表。Issue 中的哨兵字符串方案是 workaround,并非修复,会要求改动业务代码中大量依赖 None 的判断逻辑,存在引入新问题的风险。Gradio 6.x 下不要指望通过配置或补丁让 None 同时作为选项值正常显示。

问题场景

在 Gradio 6.26.0 中使用 gr.Dropdown,并给 choices 传入带有 None 值的元组列表,例如 [("Default", None), ("Option A", "a"), ...]。运行时下拉箭头展开后可以看到“Default”这一项,但选中后输入框内不显示“Default”这个 label,字段看起来像是没有选中任何内容。在 Gradio 5.49.1 中同样代码没有该现象。

报错原文

gradio v6.26.0: Dropdown label not shown on field when option value is None

原因分析

最可能的原因是 Gradio 6.x 内部把 None 保留为“no value selected / 未选择任何值”这一状态的标志值。当选项的真实值也是 None 时,组件无法区分“当前未选择”与“当前选中了值为 None 的选项”,因此在输入框中不再渲染该选项的 label。官方在讨论后确认这是有意行为,并明确不会在当前版本中改变该逻辑,只补了文档说明。

环境排查

  • 确认 Gradio 版本:问题报告为 gradio 6.26.0;旧版 gradio 5.49.1 行为不同。
  • 检查 gr.Dropdownchoices 中是否存在 ("label", None) 这类以 None 作为 value 的选项。
  • 确认组件初始值 value 与 change 回调中处理的值的类型。
  • Issue 未提供操作系统、Python 版本、CUDA、显卡、PyTorch 等信息,这些不需要作为本问题的排查重点。

解决步骤

  1. 确认你的代码确实使用了 None 作为某个 Dropdown 选项的值。如果下拉展开能看到该选项、但选中后字段空白,基本就是这个模式。
  2. 官方首选做法(可优先尝试):给“Default”选项换成一个不会与真实选项值冲突的哨兵字符串,例如 "__default__",并把 Dropdown 的初始 value 设为该字符串。
  3. 在回调函数内部把哨兵字符串转换回 None,保持后续业务逻辑仍按 None 处理。
  4. 如果代码中大量依赖 None 判断,先评估改动范围。社区反馈显示这类全局替换成本高、风险大;官方也承认用户可能需要改动整个仓库逻辑。
  5. 不要期待在当前 6.x 系列获得官方修复。官方表示会在 Gradio 7 大版本中“可能重新考虑”,目前该 Issue 已按设计限制关闭。

Issue 中给出的变通示例(哨兵值方案):

import gradio as gr

DEFAULT = "__default__"

def on_select(value):
    value = None if value == DEFAULT else value
    return (
        "Selected: Default (None)"
        if value is None
        else f"Selected: {value}"
    )

with gr.Blocks() as demo:
    dropdown = gr.Dropdown(
        choices=[
            ("Default", DEFAULT),
            ("Option A", "a"),
            ("Option B", "b"),
            ("Option C", "c"),
        ],
        value=DEFAULT,
        label="Choose an option",
    )
    output = gr.Textbox(label="Result")
    dropdown.change(on_select, inputs=dropdown, outputs=output)

demo.launch()

验证方法

应用哨兵字符串方案后,重新启动应用:展开 Dropdown 能看到“Default”选项,选中后输入框字段能正常显示“Default”这个 label;同时回调输出应与原先使用 None 时的业务逻辑一致(例如文本框中显示 Selected: Default (None))。如果字段仍为空白,检查是否还有其它选项值被设成了 None,或初始 value 未同步改成哨兵字符串。

参考来源

gradio-app/gradio #13832

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25112

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注