首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Streamlit中使用回调时,以正确的顺序显示小部件

在Streamlit中使用回调时,以正确的顺序显示小部件
EN

Stack Overflow用户
提问于 2022-01-23 16:26:14
回答 1查看 612关注 0票数 0

我在Streamlit (1.3.1)中做了一个非常简单的应用程序:

  1. 使用文件上传器小部件读取Excel文件,
  2. 让用户选择他们感兴趣的工作表,使用选择框

预览

我使用来自st.selectbox的回调来显示预览,这样只有在用户主动选择了他们感兴趣的工作表之后,它才会显示。但是为了做到这一点,我需要在调用st.selectbox之前定义我的回调函数--这将导致预览显示在应用程序中的文件上传器和选择框小部件之上,而不是在我想要的地方,在这些小部件下面。

这是我的代码和我的输出的屏幕抓取。

代码语言:javascript
运行
复制
import streamlit as st
import pandas as pd

# CREATE APP
# Add file_uploader
uploaded_file = st.file_uploader(
    label='Upload a file', type=['xls', 'xlsx', 'xlsm'],
    key='file-uploader',
    help='''
        Upload an Excel file. The file must be
        closed in order for you to upload it.
    '''
)


# Define function that loads sheet preview
def load_sheet_preview():
    st.dataframe(df[st.session_state.selectbox_sheet])


# Add selectbox
if uploaded_file is not None:
    df = pd.read_excel(uploaded_file, sheet_name=None)      # sheet_name=None needs explicitly including - it isn't the default        # noqa: E501

    st.selectbox(
        key='selectbox_sheet',
        label='Select worksheet',
        options=df.keys(),
        on_change=load_sheet_preview
    )

用函数包装生成文件上传器和选择框的代码,按照我希望它们出现在应用程序中的顺序,也不会对问题进行排序。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-03 20:43:58

我想出了一个解决方案,它涉及(显式地)使用st.session_state而不是回调,并为下拉选项添加一个默认值。在选择默认选项时,未加载预览。

代码语言:javascript
运行
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import io

import pandas as pd
import streamlit as st

# CREATE APP
# Add file_uploader
uploaded_file = st.file_uploader(
    label='Upload a file', type=['xls', 'xlsx', 'xlsm'],
    key='file-uploader',
    help='''
        Upload an Excel file. The file must be
        closed in order for you to upload it.
    '''
)

# Add selectbox
if 'selectbox_sheet' not in st.session_state:       # Initialise variable
    st.session_state['selectbox_sheet'] = '--'

if uploaded_file is not None:
    sheets_dict = pd.read_excel(uploaded_file, sheet_name=None)      # This creates a dictionary of dataframes. sheet_name=None needs explicitly including - it isn't the default        # noqa: E501

    default_option = {'--': ''}

    selectbox_options = dict(**default_option, **sheets_dict)     # Join dictionaries        # noqa: E501

    st.selectbox(
        key='selectbox_sheet',
        label='Select worksheet',
        options=selectbox_options.keys()
    )

# Load sheet preview
if st.session_state.selectbox_sheet != '--':
    st.dataframe(sheets_dict[st.session_state.selectbox_sheet])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70824164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档