You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Radio按钮仍绑定原变量:NiceGUI动态更新单选框选项异常问题

解决NiceGUI Radio组件无法更新选项的问题

问题根源

  1. 局部变量覆盖全局引用:在UpdateOptions函数中,optionsDict = {'1': 'Opt1', '2': 'Opt2'}会创建一个局部字典,完全替换掉全局的optionsDict引用,导致后续修改的是局部变量,和Radio组件绑定的原字典无关。
  2. 未显式传递新选项给update方法:NiceGUI的Radio组件默认不会自动监听字典的内容变化,调用update()时必须显式传入更新后的选项集合。

修复步骤

  • 删除函数内重新赋值optionsDict的语句,直接修改全局字典的内容
  • 调用optionSelector.update(options=optionsDict)来强制Radio组件刷新选项

修改后的完整代码

from nicegui import ui

class RecipeSelector:
    def __init__(self, initval):
        self.value = initval
        self.name = 'Recipeselector'

selectedOption = RecipeSelector('1')
optionsDict = {'1': 'Opt1', '2': 'Opt2'}

async def UpdateOptions():
    result = await suredialog
    if result == 'Yes':
        # 直接修改全局字典,不重新赋值
        index = int(max(optionsDict.keys())) + 1
        optionsDict[str(index)] = f'Opt{index}'
        # 显式传递更新后的选项给update方法
        optionSelector.update(options=optionsDict)
        ui.notify("Radio Updated")
    else:
        ui.notify(f'You chose {result}')

with ui.dialog() as suredialog, ui.card():
    ui.label('Are you sure?')
    with ui.row():
        ui.button('Yes', on_click=lambda: suredialog.submit('Yes'))
        ui.button('No', on_click=lambda: suredialog.submit('No'))

optionSelector = ui.radio(optionsDict).bind_value(selectedOption, 'value')
ui.button('New Option', on_click=UpdateOptions)

ui.run()

额外说明

如果确实需要重置字典内容,不要直接赋值,而是用clear()和update()方法修改原字典:

# 重置字典内容的正确方式
optionsDict.clear()
optionsDict.update({'1': 'Opt1', '2': 'Opt2'})

内容的提问来源于stack exchange,提问作者Lucas A. Rivas P.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:57:33