我有两个输入字段,允许用户通过
更改一个输入字段应更新另一个字段以保持同步
如何使用Streamlight实现这种行为
我到目前为止所做的尝试
已选择ID->;更新名称选择框:
users = [(1, 'Jim'), (2, 'Jim'), (3, 'Jane')]
users.sort(key=lambda user: user[1]) # sort by name
selected_id = st.sidebar.number_input('ID', value=1)
options = ['%s (%d)' % (name, id) for id, name in users]
index = [i for i, user in enumerate(users) if user[0] == selected_id][0]
selected_option = st.sidebar.selectbox('Name', options, index)
所选名称->;更新ID号输入(使用st.empty()
):
users = [(1, 'Jim'), (2, 'Jim'), (3, 'Jane')]
users.sort(key=lambda user: user[1]) # sort by name
id_input = st.sidebar.empty()
options = ['%s (%d)' % (name, id) for id, name in users]
selected_option = st.sidebar.selectbox('Name', options)
# e.g. get 2 from "Jim (2)"
id = int(re.match(r'\w+ \((\d+)\)', selected_option).group(1))
selected_id = id_input.number_input('ID', value=id)
要使小部件保持同步,需要解决两个问题:
对于(1),看起来如果不引入某种持久状态,就没有办法做到这一点。如果无法在脚本运行之间存储当前选择,我们只能将两个小部件的值相互比较,并与默认值进行比较。一旦小部件发生更改,就会出现问题:例如,如果默认值为1,数字输入的值为2,选择框的值为3,我们无法判断最近更改的是数字输入还是选择框(因此更新为最新的值)
对于(2),只要在选择发生更改时使用占位符并刷新小部件就可以了。重要的是,如果选择没有改变,小部件应该而不是被刷新,否则我们将得到
DuplicateWidgetID
错误(因为小部件的内容也不会改变,它们将具有相同的生成键)下面的一些代码显示了处理这两个问题的一种方法,并在最后捕获用户的选择。请注意,以这种方式使用
@st.cache
将在多个浏览器会话中保留单个全局选择,并允许任何人通过streamlight菜单清除选择->;'清除缓存”,如果多个用户同时访问脚本,则可能会出现问题相关问题 更多 >
编程相关推荐