streamlit-data-editor-plus 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- streamlit/__init__.py +292 -0
- streamlit/__main__.py +20 -0
- streamlit/auth_util.py +583 -0
- streamlit/cli_util.py +107 -0
- streamlit/column_config.py +60 -0
- streamlit/commands/__init__.py +13 -0
- streamlit/commands/echo.py +128 -0
- streamlit/commands/execution_control.py +318 -0
- streamlit/commands/logo.py +250 -0
- streamlit/commands/navigation.py +430 -0
- streamlit/commands/page_config.py +335 -0
- streamlit/components/__init__.py +13 -0
- streamlit/components/lib/__init__.py +13 -0
- streamlit/components/lib/local_component_registry.py +84 -0
- streamlit/components/types/__init__.py +13 -0
- streamlit/components/types/base_component_registry.py +99 -0
- streamlit/components/types/base_custom_component.py +158 -0
- streamlit/components/v1/__init__.py +29 -0
- streamlit/components/v1/component_arrow.py +141 -0
- streamlit/components/v1/component_registry.py +147 -0
- streamlit/components/v1/components.py +38 -0
- streamlit/components/v1/custom_component.py +239 -0
- streamlit/components/v2/__init__.py +531 -0
- streamlit/components/v2/bidi_component/__init__.py +20 -0
- streamlit/components/v2/bidi_component/constants.py +29 -0
- streamlit/components/v2/bidi_component/main.py +537 -0
- streamlit/components/v2/bidi_component/serialization.py +272 -0
- streamlit/components/v2/bidi_component/state.py +92 -0
- streamlit/components/v2/component_definition_resolver.py +143 -0
- streamlit/components/v2/component_file_watcher.py +403 -0
- streamlit/components/v2/component_manager.py +439 -0
- streamlit/components/v2/component_manifest_handler.py +122 -0
- streamlit/components/v2/component_path_utils.py +233 -0
- streamlit/components/v2/component_registry.py +426 -0
- streamlit/components/v2/get_bidi_component_manager.py +51 -0
- streamlit/components/v2/manifest_scanner.py +620 -0
- streamlit/components/v2/presentation.py +198 -0
- streamlit/components/v2/types.py +317 -0
- streamlit/config.py +2977 -0
- streamlit/config_option.py +319 -0
- streamlit/config_util.py +887 -0
- streamlit/connections/__init__.py +32 -0
- streamlit/connections/base_connection.py +215 -0
- streamlit/connections/snowflake_connection.py +765 -0
- streamlit/connections/snowpark_connection.py +213 -0
- streamlit/connections/sql_connection.py +427 -0
- streamlit/connections/util.py +97 -0
- streamlit/cursor.py +314 -0
- streamlit/dataframe_util.py +1434 -0
- streamlit/delta_generator.py +696 -0
- streamlit/delta_generator_singletons.py +243 -0
- streamlit/deprecation_util.py +253 -0
- streamlit/development.py +21 -0
- streamlit/elements/__init__.py +13 -0
- streamlit/elements/alert.py +341 -0
- streamlit/elements/arrow.py +1065 -0
- streamlit/elements/balloons.py +47 -0
- streamlit/elements/bokeh_chart.py +75 -0
- streamlit/elements/code.py +154 -0
- streamlit/elements/deck_gl_json_chart.py +627 -0
- streamlit/elements/dialog_decorator.py +320 -0
- streamlit/elements/empty.py +130 -0
- streamlit/elements/exception.py +370 -0
- streamlit/elements/form.py +481 -0
- streamlit/elements/graphviz_chart.py +226 -0
- streamlit/elements/heading.py +407 -0
- streamlit/elements/help.py +565 -0
- streamlit/elements/html.py +189 -0
- streamlit/elements/iframe.py +245 -0
- streamlit/elements/image.py +221 -0
- streamlit/elements/json.py +171 -0
- streamlit/elements/layouts.py +1534 -0
- streamlit/elements/lib/__init__.py +13 -0
- streamlit/elements/lib/built_in_chart_utils.py +1316 -0
- streamlit/elements/lib/color_util.py +272 -0
- streamlit/elements/lib/column_config_utils.py +555 -0
- streamlit/elements/lib/column_types.py +2699 -0
- streamlit/elements/lib/dialog.py +212 -0
- streamlit/elements/lib/dicttools.py +152 -0
- streamlit/elements/lib/file_uploader_utils.py +91 -0
- streamlit/elements/lib/form_utils.py +77 -0
- streamlit/elements/lib/image_utils.py +447 -0
- streamlit/elements/lib/js_number.py +105 -0
- streamlit/elements/lib/layout_utils.py +325 -0
- streamlit/elements/lib/mutable_expander_container.py +73 -0
- streamlit/elements/lib/mutable_popover_container.py +73 -0
- streamlit/elements/lib/mutable_status_container.py +194 -0
- streamlit/elements/lib/mutable_tab_container.py +73 -0
- streamlit/elements/lib/options_selector_utils.py +480 -0
- streamlit/elements/lib/pandas_styler_utils.py +302 -0
- streamlit/elements/lib/policies.py +198 -0
- streamlit/elements/lib/shortcut_utils.py +152 -0
- streamlit/elements/lib/streamlit_plotly_theme.py +206 -0
- streamlit/elements/lib/subtitle_utils.py +175 -0
- streamlit/elements/lib/utils.py +274 -0
- streamlit/elements/map.py +526 -0
- streamlit/elements/markdown.py +529 -0
- streamlit/elements/media.py +843 -0
- streamlit/elements/metric.py +529 -0
- streamlit/elements/pdf.py +190 -0
- streamlit/elements/plotly_chart.py +779 -0
- streamlit/elements/progress.py +172 -0
- streamlit/elements/pyplot.py +240 -0
- streamlit/elements/snow.py +47 -0
- streamlit/elements/space.py +121 -0
- streamlit/elements/spinner.py +152 -0
- streamlit/elements/table.py +240 -0
- streamlit/elements/text.py +113 -0
- streamlit/elements/toast.py +175 -0
- streamlit/elements/vega_charts.py +2510 -0
- streamlit/elements/widgets/__init__.py +13 -0
- streamlit/elements/widgets/audio_input.py +334 -0
- streamlit/elements/widgets/button.py +1559 -0
- streamlit/elements/widgets/button_group.py +1061 -0
- streamlit/elements/widgets/camera_input.py +281 -0
- streamlit/elements/widgets/chat.py +1028 -0
- streamlit/elements/widgets/checkbox.py +420 -0
- streamlit/elements/widgets/color_picker.py +329 -0
- streamlit/elements/widgets/data_editor.py +1168 -0
- streamlit/elements/widgets/data_editor_plus.py +902 -0
- streamlit/elements/widgets/feedback.py +322 -0
- streamlit/elements/widgets/file_uploader.py +592 -0
- streamlit/elements/widgets/multiselect.py +654 -0
- streamlit/elements/widgets/number_input.py +719 -0
- streamlit/elements/widgets/radio.py +551 -0
- streamlit/elements/widgets/select_slider.py +568 -0
- streamlit/elements/widgets/selectbox.py +680 -0
- streamlit/elements/widgets/slider.py +1093 -0
- streamlit/elements/widgets/text_widgets.py +779 -0
- streamlit/elements/widgets/time_widgets.py +1712 -0
- streamlit/elements/write.py +585 -0
- streamlit/emojis.py +34 -0
- streamlit/env_util.py +56 -0
- streamlit/error_util.py +112 -0
- streamlit/errors.py +680 -0
- streamlit/external/__init__.py +13 -0
- streamlit/external/langchain/__init__.py +23 -0
- streamlit/external/langchain/streamlit_callback_handler.py +410 -0
- streamlit/file_util.py +266 -0
- streamlit/git_util.py +200 -0
- streamlit/hello/__init__.py +13 -0
- streamlit/hello/__pycache__/__init__.cpython-312.pyc +0 -0
- streamlit/hello/__pycache__/streamlit_app.cpython-312.pyc +0 -0
- streamlit/hello/animation_demo.py +82 -0
- streamlit/hello/dataframe_demo.py +71 -0
- streamlit/hello/hello.py +46 -0
- streamlit/hello/mapping_demo.py +113 -0
- streamlit/hello/plotting_demo.py +62 -0
- streamlit/hello/streamlit_app.py +57 -0
- streamlit/hello/utils.py +30 -0
- streamlit/logger.py +129 -0
- streamlit/material_icon_names.py +25 -0
- streamlit/navigation/__init__.py +13 -0
- streamlit/navigation/page.py +365 -0
- streamlit/net_util.py +125 -0
- streamlit/path_security.py +98 -0
- streamlit/platform.py +31 -0
- streamlit/proto/Alert_pb2.py +28 -0
- streamlit/proto/Alert_pb2.pyi +100 -0
- streamlit/proto/AppPage_pb2.py +25 -0
- streamlit/proto/AppPage_pb2.pyi +75 -0
- streamlit/proto/ArrowData_pb2.py +27 -0
- streamlit/proto/ArrowData_pb2.pyi +103 -0
- streamlit/proto/ArrowNamedDataSet_pb2.py +26 -0
- streamlit/proto/ArrowNamedDataSet_pb2.pyi +65 -0
- streamlit/proto/AudioInput_pb2.py +26 -0
- streamlit/proto/AudioInput_pb2.pyi +72 -0
- streamlit/proto/Audio_pb2.py +26 -0
- streamlit/proto/Audio_pb2.pyi +75 -0
- streamlit/proto/AuthRedirect_pb2.py +25 -0
- streamlit/proto/AuthRedirect_pb2.pyi +48 -0
- streamlit/proto/AutoRerun_pb2.py +25 -0
- streamlit/proto/AutoRerun_pb2.pyi +52 -0
- streamlit/proto/BackMsg_pb2.py +29 -0
- streamlit/proto/BackMsg_pb2.pyi +132 -0
- streamlit/proto/Balloons_pb2.py +25 -0
- streamlit/proto/Balloons_pb2.pyi +48 -0
- streamlit/proto/BidiComponent_pb2.py +32 -0
- streamlit/proto/BidiComponent_pb2.pyi +176 -0
- streamlit/proto/Block_pb2.py +62 -0
- streamlit/proto/Block_pb2.pyi +518 -0
- streamlit/proto/ButtonGroup_pb2.py +32 -0
- streamlit/proto/ButtonGroup_pb2.pyi +157 -0
- streamlit/proto/ButtonLikeIconPosition_pb2.py +25 -0
- streamlit/proto/ButtonLikeIconPosition_pb2.pyi +47 -0
- streamlit/proto/Button_pb2.py +26 -0
- streamlit/proto/Button_pb2.pyi +82 -0
- streamlit/proto/CameraInput_pb2.py +26 -0
- streamlit/proto/CameraInput_pb2.pyi +66 -0
- streamlit/proto/ChatInput_pb2.py +27 -0
- streamlit/proto/ChatInput_pb2.pyi +113 -0
- streamlit/proto/Checkbox_pb2.py +28 -0
- streamlit/proto/Checkbox_pb2.pyi +99 -0
- streamlit/proto/ClientState_pb2.py +28 -0
- streamlit/proto/ClientState_pb2.pyi +137 -0
- streamlit/proto/Code_pb2.py +25 -0
- streamlit/proto/Code_pb2.pyi +59 -0
- streamlit/proto/ColorPicker_pb2.py +26 -0
- streamlit/proto/ColorPicker_pb2.pyi +82 -0
- streamlit/proto/Common_pb2.py +49 -0
- streamlit/proto/Common_pb2.pyi +325 -0
- streamlit/proto/Components_pb2.py +33 -0
- streamlit/proto/Components_pb2.pyi +196 -0
- streamlit/proto/Dataframe_pb2.py +30 -0
- streamlit/proto/Dataframe_pb2.pyi +172 -0
- streamlit/proto/DateInput_pb2.py +26 -0
- streamlit/proto/DateInput_pb2.pyi +91 -0
- streamlit/proto/DateTimeInput_pb2.py +26 -0
- streamlit/proto/DateTimeInput_pb2.pyi +94 -0
- streamlit/proto/DeckGlJsonChart_pb2.py +27 -0
- streamlit/proto/DeckGlJsonChart_pb2.pyi +91 -0
- streamlit/proto/Delta_pb2.py +29 -0
- streamlit/proto/Delta_pb2.pyi +82 -0
- streamlit/proto/DownloadButton_pb2.py +26 -0
- streamlit/proto/DownloadButton_pb2.pyi +92 -0
- streamlit/proto/Element_pb2.py +81 -0
- streamlit/proto/Element_pb2.pyi +348 -0
- streamlit/proto/Empty_pb2.py +25 -0
- streamlit/proto/Empty_pb2.pyi +42 -0
- streamlit/proto/Exception_pb2.py +26 -0
- streamlit/proto/Exception_pb2.pyi +88 -0
- streamlit/proto/Favicon_pb2.py +25 -0
- streamlit/proto/Favicon_pb2.pyi +47 -0
- streamlit/proto/Feedback_pb2.py +27 -0
- streamlit/proto/Feedback_pb2.pyi +93 -0
- streamlit/proto/FileUploader_pb2.py +26 -0
- streamlit/proto/FileUploader_pb2.pyi +90 -0
- streamlit/proto/ForwardMsg_pb2.py +48 -0
- streamlit/proto/ForwardMsg_pb2.pyi +296 -0
- streamlit/proto/GapSize_pb2.py +27 -0
- streamlit/proto/GapSize_pb2.pyi +82 -0
- streamlit/proto/GitInfo_pb2.py +27 -0
- streamlit/proto/GitInfo_pb2.pyi +84 -0
- streamlit/proto/GraphVizChart_pb2.py +25 -0
- streamlit/proto/GraphVizChart_pb2.pyi +56 -0
- streamlit/proto/Heading_pb2.py +25 -0
- streamlit/proto/Heading_pb2.pyi +63 -0
- streamlit/proto/HeightConfig_pb2.py +25 -0
- streamlit/proto/HeightConfig_pb2.pyi +61 -0
- streamlit/proto/Help_pb2.py +27 -0
- streamlit/proto/Help_pb2.pyi +104 -0
- streamlit/proto/Html_pb2.py +25 -0
- streamlit/proto/Html_pb2.pyi +52 -0
- streamlit/proto/IFrame_pb2.py +25 -0
- streamlit/proto/IFrame_pb2.pyi +68 -0
- streamlit/proto/Image_pb2.py +27 -0
- streamlit/proto/Image_pb2.pyi +73 -0
- streamlit/proto/Json_pb2.py +25 -0
- streamlit/proto/Json_pb2.pyi +63 -0
- streamlit/proto/LabelVisibility_pb2.py +27 -0
- streamlit/proto/LabelVisibility_pb2.pyi +69 -0
- streamlit/proto/LinkButton_pb2.py +26 -0
- streamlit/proto/LinkButton_pb2.pyi +76 -0
- streamlit/proto/Logo_pb2.py +27 -0
- streamlit/proto/Logo_pb2.pyi +82 -0
- streamlit/proto/Markdown_pb2.py +27 -0
- streamlit/proto/Markdown_pb2.pyi +83 -0
- streamlit/proto/Metric_pb2.py +32 -0
- streamlit/proto/Metric_pb2.pyi +145 -0
- streamlit/proto/MetricsEvent_pb2.py +28 -0
- streamlit/proto/MetricsEvent_pb2.pyi +224 -0
- streamlit/proto/MultiSelect_pb2.py +26 -0
- streamlit/proto/MultiSelect_pb2.pyi +108 -0
- streamlit/proto/Navigation_pb2.py +28 -0
- streamlit/proto/Navigation_pb2.pyi +89 -0
- streamlit/proto/NewSession_pb2.py +47 -0
- streamlit/proto/NewSession_pb2.pyi +753 -0
- streamlit/proto/NumberInput_pb2.py +28 -0
- streamlit/proto/NumberInput_pb2.pyi +138 -0
- streamlit/proto/PageConfig_pb2.py +33 -0
- streamlit/proto/PageConfig_pb2.pyi +179 -0
- streamlit/proto/PageInfo_pb2.py +25 -0
- streamlit/proto/PageInfo_pb2.pyi +50 -0
- streamlit/proto/PageLink_pb2.py +26 -0
- streamlit/proto/PageLink_pb2.pyi +80 -0
- streamlit/proto/PageNotFound_pb2.py +25 -0
- streamlit/proto/PageNotFound_pb2.pyi +49 -0
- streamlit/proto/PageProfile_pb2.py +29 -0
- streamlit/proto/PageProfile_pb2.pyi +146 -0
- streamlit/proto/ParentMessage_pb2.py +25 -0
- streamlit/proto/ParentMessage_pb2.pyi +53 -0
- streamlit/proto/PlotlyChart_pb2.py +27 -0
- streamlit/proto/PlotlyChart_pb2.pyi +96 -0
- streamlit/proto/Progress_pb2.py +25 -0
- streamlit/proto/Progress_pb2.pyi +50 -0
- streamlit/proto/Radio_pb2.py +26 -0
- streamlit/proto/Radio_pb2.pyi +104 -0
- streamlit/proto/RootContainer_pb2.py +25 -0
- streamlit/proto/RootContainer_pb2.pyi +56 -0
- streamlit/proto/Selectbox_pb2.py +26 -0
- streamlit/proto/Selectbox_pb2.pyi +107 -0
- streamlit/proto/SessionEvent_pb2.py +26 -0
- streamlit/proto/SessionEvent_pb2.pyi +72 -0
- streamlit/proto/SessionStatus_pb2.py +25 -0
- streamlit/proto/SessionStatus_pb2.pyi +64 -0
- streamlit/proto/Skeleton_pb2.py +27 -0
- streamlit/proto/Skeleton_pb2.pyi +75 -0
- streamlit/proto/Slider_pb2.py +30 -0
- streamlit/proto/Slider_pb2.pyi +161 -0
- streamlit/proto/Snow_pb2.py +25 -0
- streamlit/proto/Snow_pb2.pyi +48 -0
- streamlit/proto/Space_pb2.py +25 -0
- streamlit/proto/Space_pb2.pyi +48 -0
- streamlit/proto/Spinner_pb2.py +25 -0
- streamlit/proto/Spinner_pb2.pyi +56 -0
- streamlit/proto/Table_pb2.py +28 -0
- streamlit/proto/Table_pb2.pyi +83 -0
- streamlit/proto/TextAlignmentConfig_pb2.py +27 -0
- streamlit/proto/TextAlignmentConfig_pb2.pyi +69 -0
- streamlit/proto/TextArea_pb2.py +26 -0
- streamlit/proto/TextArea_pb2.pyi +97 -0
- streamlit/proto/TextInput_pb2.py +28 -0
- streamlit/proto/TextInput_pb2.pyi +124 -0
- streamlit/proto/Text_pb2.py +25 -0
- streamlit/proto/Text_pb2.pyi +53 -0
- streamlit/proto/TimeInput_pb2.py +26 -0
- streamlit/proto/TimeInput_pb2.pyi +86 -0
- streamlit/proto/Toast_pb2.py +25 -0
- streamlit/proto/Toast_pb2.pyi +64 -0
- streamlit/proto/Transient_pb2.py +26 -0
- streamlit/proto/Transient_pb2.pyi +53 -0
- streamlit/proto/VegaLiteChart_pb2.py +27 -0
- streamlit/proto/VegaLiteChart_pb2.pyi +92 -0
- streamlit/proto/Video_pb2.py +30 -0
- streamlit/proto/Video_pb2.pyi +129 -0
- streamlit/proto/WidgetStates_pb2.py +31 -0
- streamlit/proto/WidgetStates_pb2.pyi +157 -0
- streamlit/proto/WidthConfig_pb2.py +25 -0
- streamlit/proto/WidthConfig_pb2.pyi +61 -0
- streamlit/proto/__init__.py +15 -0
- streamlit/proto/openmetrics_data_model_pb2.py +58 -0
- streamlit/proto/openmetrics_data_model_pb2.pyi +558 -0
- streamlit/py.typed +0 -0
- streamlit/runtime/__init__.py +50 -0
- streamlit/runtime/app_session.py +1302 -0
- streamlit/runtime/caching/__init__.py +118 -0
- streamlit/runtime/caching/cache_data_api.py +775 -0
- streamlit/runtime/caching/cache_errors.py +143 -0
- streamlit/runtime/caching/cache_resource_api.py +756 -0
- streamlit/runtime/caching/cache_type.py +33 -0
- streamlit/runtime/caching/cache_utils.py +601 -0
- streamlit/runtime/caching/cached_message_replay.py +290 -0
- streamlit/runtime/caching/hashing.py +655 -0
- streamlit/runtime/caching/legacy_cache_api.py +170 -0
- streamlit/runtime/caching/storage/__init__.py +29 -0
- streamlit/runtime/caching/storage/cache_storage_protocol.py +236 -0
- streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
- streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +159 -0
- streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
- streamlit/runtime/caching/ttl_cleanup_cache.py +85 -0
- streamlit/runtime/connection_factory.py +498 -0
- streamlit/runtime/context.py +449 -0
- streamlit/runtime/context_util.py +49 -0
- streamlit/runtime/credentials.py +355 -0
- streamlit/runtime/download_data_util.py +53 -0
- streamlit/runtime/forward_msg_cache.py +101 -0
- streamlit/runtime/forward_msg_queue.py +263 -0
- streamlit/runtime/fragment.py +441 -0
- streamlit/runtime/media_file_manager.py +409 -0
- streamlit/runtime/media_file_storage.py +143 -0
- streamlit/runtime/memory_media_file_storage.py +201 -0
- streamlit/runtime/memory_session_storage.py +77 -0
- streamlit/runtime/memory_uploaded_file_manager.py +149 -0
- streamlit/runtime/metrics_util.py +612 -0
- streamlit/runtime/pages_manager.py +160 -0
- streamlit/runtime/runtime.py +775 -0
- streamlit/runtime/runtime_util.py +108 -0
- streamlit/runtime/script_data.py +46 -0
- streamlit/runtime/scriptrunner/__init__.py +38 -0
- streamlit/runtime/scriptrunner/exec_code.py +167 -0
- streamlit/runtime/scriptrunner/magic.py +277 -0
- streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
- streamlit/runtime/scriptrunner/script_cache.py +89 -0
- streamlit/runtime/scriptrunner/script_runner.py +805 -0
- streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
- streamlit/runtime/scriptrunner_utils/exceptions.py +44 -0
- streamlit/runtime/scriptrunner_utils/script_requests.py +311 -0
- streamlit/runtime/scriptrunner_utils/script_run_context.py +277 -0
- streamlit/runtime/secrets.py +533 -0
- streamlit/runtime/session_manager.py +430 -0
- streamlit/runtime/state/__init__.py +47 -0
- streamlit/runtime/state/common.py +256 -0
- streamlit/runtime/state/presentation.py +85 -0
- streamlit/runtime/state/query_params.py +767 -0
- streamlit/runtime/state/query_params_proxy.py +222 -0
- streamlit/runtime/state/safe_session_state.py +146 -0
- streamlit/runtime/state/session_state.py +1299 -0
- streamlit/runtime/state/session_state_proxy.py +153 -0
- streamlit/runtime/state/widgets.py +197 -0
- streamlit/runtime/stats.py +356 -0
- streamlit/runtime/theme_util.py +148 -0
- streamlit/runtime/uploaded_file_manager.py +152 -0
- streamlit/runtime/websocket_session_manager.py +301 -0
- streamlit/source_util.py +97 -0
- streamlit/starlette.py +34 -0
- streamlit/string_util.py +264 -0
- streamlit/temporary_directory.py +67 -0
- streamlit/testing/__init__.py +13 -0
- streamlit/testing/v1/__init__.py +17 -0
- streamlit/testing/v1/app_test.py +1089 -0
- streamlit/testing/v1/element_tree.py +2272 -0
- streamlit/testing/v1/local_script_runner.py +176 -0
- streamlit/testing/v1/util.py +61 -0
- streamlit/time_util.py +73 -0
- streamlit/type_util.py +480 -0
- streamlit/url_util.py +120 -0
- streamlit/user_info.py +698 -0
- streamlit/util.py +108 -0
- streamlit/vendor/__init__.py +0 -0
- streamlit/vendor/pympler/__init__.py +0 -0
- streamlit/vendor/pympler/asizeof.py +2870 -0
- streamlit/version.py +18 -0
- streamlit/watcher/__init__.py +28 -0
- streamlit/watcher/event_based_path_watcher.py +500 -0
- streamlit/watcher/folder_black_list.py +82 -0
- streamlit/watcher/local_sources_watcher.py +297 -0
- streamlit/watcher/path_watcher.py +244 -0
- streamlit/watcher/polling_path_watcher.py +138 -0
- streamlit/watcher/util.py +223 -0
- streamlit/web/__init__.py +13 -0
- streamlit/web/bootstrap.py +463 -0
- streamlit/web/cache_storage_manager_config.py +38 -0
- streamlit/web/cli.py +465 -0
- streamlit/web/server/__init__.py +30 -0
- streamlit/web/server/app_discovery.py +422 -0
- streamlit/web/server/app_static_file_handler.py +102 -0
- streamlit/web/server/authlib_tornado_integration.py +125 -0
- streamlit/web/server/bidi_component_request_handler.py +193 -0
- streamlit/web/server/browser_websocket_handler.py +341 -0
- streamlit/web/server/component_file_utils.py +105 -0
- streamlit/web/server/component_request_handler.py +107 -0
- streamlit/web/server/media_file_handler.py +148 -0
- streamlit/web/server/oauth_authlib_routes.py +314 -0
- streamlit/web/server/oidc_mixin.py +138 -0
- streamlit/web/server/routes.py +257 -0
- streamlit/web/server/server.py +555 -0
- streamlit/web/server/server_util.py +235 -0
- streamlit/web/server/starlette/__init__.py +23 -0
- streamlit/web/server/starlette/starlette_app.py +541 -0
- streamlit/web/server/starlette/starlette_app_utils.py +306 -0
- streamlit/web/server/starlette/starlette_auth_routes.py +584 -0
- streamlit/web/server/starlette/starlette_gzip_middleware.py +121 -0
- streamlit/web/server/starlette/starlette_path_security_middleware.py +97 -0
- streamlit/web/server/starlette/starlette_routes.py +884 -0
- streamlit/web/server/starlette/starlette_server.py +496 -0
- streamlit/web/server/starlette/starlette_server_config.py +55 -0
- streamlit/web/server/starlette/starlette_static_routes.py +181 -0
- streamlit/web/server/starlette/starlette_websocket.py +560 -0
- streamlit/web/server/stats_request_handler.py +116 -0
- streamlit/web/server/upload_file_request_handler.py +158 -0
- streamlit/web/server/websocket_headers.py +56 -0
- streamlit_data_editor_plus-0.1.0.dist-info/METADATA +76 -0
- streamlit_data_editor_plus-0.1.0.dist-info/RECORD +456 -0
- streamlit_data_editor_plus-0.1.0.dist-info/WHEEL +5 -0
- streamlit_data_editor_plus-0.1.0.dist-info/entry_points.txt +2 -0
- streamlit_data_editor_plus-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
"""Column types that can be configured via the ``column_config`` parameter of
|
|
16
|
+
``st.dataframe`` and ``st.data_editor``.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"AreaChartColumn",
|
|
23
|
+
"BarChartColumn",
|
|
24
|
+
"CheckboxColumn",
|
|
25
|
+
"Column",
|
|
26
|
+
"DateColumn",
|
|
27
|
+
"DatetimeColumn",
|
|
28
|
+
"ImageColumn",
|
|
29
|
+
"JsonColumn",
|
|
30
|
+
"LineChartColumn",
|
|
31
|
+
"LinkColumn",
|
|
32
|
+
"ListColumn",
|
|
33
|
+
"MultiselectColumn",
|
|
34
|
+
"NumberColumn",
|
|
35
|
+
"ProgressColumn",
|
|
36
|
+
"SelectboxColumn",
|
|
37
|
+
"TextColumn",
|
|
38
|
+
"TimeColumn",
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
from streamlit.elements.lib.column_types import (
|
|
43
|
+
AreaChartColumn,
|
|
44
|
+
BarChartColumn,
|
|
45
|
+
CheckboxColumn,
|
|
46
|
+
Column,
|
|
47
|
+
DateColumn,
|
|
48
|
+
DatetimeColumn,
|
|
49
|
+
ImageColumn,
|
|
50
|
+
JsonColumn,
|
|
51
|
+
LineChartColumn,
|
|
52
|
+
LinkColumn,
|
|
53
|
+
ListColumn,
|
|
54
|
+
MultiselectColumn,
|
|
55
|
+
NumberColumn,
|
|
56
|
+
ProgressColumn,
|
|
57
|
+
SelectboxColumn,
|
|
58
|
+
TextColumn,
|
|
59
|
+
TimeColumn,
|
|
60
|
+
)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import ast
|
|
18
|
+
import contextlib
|
|
19
|
+
import re
|
|
20
|
+
import textwrap
|
|
21
|
+
import traceback
|
|
22
|
+
from typing import TYPE_CHECKING, Any, Literal, cast
|
|
23
|
+
|
|
24
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from collections.abc import Generator, Iterable
|
|
28
|
+
|
|
29
|
+
_SPACES_RE = re.compile(r"\s*")
|
|
30
|
+
_EMPTY_LINE_RE = re.compile(r"\s*\n")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@gather_metrics("echo")
|
|
34
|
+
@contextlib.contextmanager
|
|
35
|
+
def echo(
|
|
36
|
+
code_location: Literal["above", "below"] = "above",
|
|
37
|
+
) -> Generator[None, None, None]:
|
|
38
|
+
"""Use in a `with` block to draw some code on the app, then execute it.
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
code_location : "above" or "below"
|
|
43
|
+
Whether to show the echoed code before or after the results of the
|
|
44
|
+
executed code block.
|
|
45
|
+
|
|
46
|
+
Example
|
|
47
|
+
-------
|
|
48
|
+
>>> import streamlit as st
|
|
49
|
+
>>>
|
|
50
|
+
>>> with st.echo():
|
|
51
|
+
>>> st.write('This code will be printed')
|
|
52
|
+
|
|
53
|
+
"""
|
|
54
|
+
from streamlit import code, empty, source_util, warning
|
|
55
|
+
|
|
56
|
+
if code_location == "below":
|
|
57
|
+
show_code = code
|
|
58
|
+
show_warning = warning
|
|
59
|
+
else:
|
|
60
|
+
placeholder = empty()
|
|
61
|
+
show_code = placeholder.code
|
|
62
|
+
show_warning = placeholder.warning
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
# Get stack frame *before* running the echoed code. The frame's
|
|
66
|
+
# line number will point to the `st.echo` statement we're running.
|
|
67
|
+
frame = traceback.extract_stack()[-3]
|
|
68
|
+
filename, start_line = frame.filename, frame.lineno or 0
|
|
69
|
+
|
|
70
|
+
# Read the file containing the source code of the echoed statement.
|
|
71
|
+
with source_util.open_python_file(filename) as source_file:
|
|
72
|
+
source_lines = source_file.readlines()
|
|
73
|
+
|
|
74
|
+
# Use ast to parse the Python file and find the code block to display
|
|
75
|
+
root_node = ast.parse("".join(source_lines))
|
|
76
|
+
line_to_node_map: dict[int, Any] = {}
|
|
77
|
+
|
|
78
|
+
def collect_body_statements(node: ast.AST) -> None:
|
|
79
|
+
if not hasattr(node, "body"):
|
|
80
|
+
return
|
|
81
|
+
for child in ast.iter_child_nodes(node):
|
|
82
|
+
# If child doesn't have "lineno", it is not something we could display
|
|
83
|
+
if hasattr(child, "lineno"):
|
|
84
|
+
line_to_node_map[cast("int", child.lineno)] = child
|
|
85
|
+
collect_body_statements(child)
|
|
86
|
+
|
|
87
|
+
collect_body_statements(root_node)
|
|
88
|
+
|
|
89
|
+
# In AST module the lineno (line numbers) are 1-indexed,
|
|
90
|
+
# so we decrease it by 1 to lookup in source lines list
|
|
91
|
+
echo_block_start_line = line_to_node_map[start_line].body[0].lineno - 1
|
|
92
|
+
echo_block_end_line = line_to_node_map[start_line].end_lineno
|
|
93
|
+
lines_to_display = source_lines[echo_block_start_line:echo_block_end_line]
|
|
94
|
+
|
|
95
|
+
code_string = textwrap.dedent("".join(lines_to_display))
|
|
96
|
+
|
|
97
|
+
# Run the echoed code...
|
|
98
|
+
yield
|
|
99
|
+
|
|
100
|
+
# And draw the code string to the app!
|
|
101
|
+
show_code(code_string, "python")
|
|
102
|
+
|
|
103
|
+
except FileNotFoundError as err:
|
|
104
|
+
show_warning(f"Unable to display code. {err}")
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _get_initial_indent(lines: Iterable[str]) -> int:
|
|
108
|
+
"""Return the indent of the first non-empty line in the list.
|
|
109
|
+
If all lines are empty, return 0.
|
|
110
|
+
"""
|
|
111
|
+
for line in lines:
|
|
112
|
+
indent = _get_indent(line)
|
|
113
|
+
if indent is not None:
|
|
114
|
+
return indent
|
|
115
|
+
|
|
116
|
+
return 0
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _get_indent(line: str) -> int | None:
|
|
120
|
+
"""Get the number of whitespaces at the beginning of the given line.
|
|
121
|
+
If the line is empty, or if it contains just whitespace and a newline,
|
|
122
|
+
return None.
|
|
123
|
+
"""
|
|
124
|
+
if _EMPTY_LINE_RE.match(line) is not None:
|
|
125
|
+
return None
|
|
126
|
+
|
|
127
|
+
match = _SPACES_RE.match(line)
|
|
128
|
+
return match.end() if match is not None else 0
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import os
|
|
18
|
+
import time
|
|
19
|
+
from collections.abc import Iterable, Mapping
|
|
20
|
+
from itertools import dropwhile
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import TYPE_CHECKING, Literal, NoReturn
|
|
23
|
+
|
|
24
|
+
import streamlit as st
|
|
25
|
+
from streamlit.errors import NoSessionContext, StreamlitAPIException
|
|
26
|
+
from streamlit.file_util import get_main_script_directory, normalize_path_join
|
|
27
|
+
from streamlit.navigation.page import StreamlitPage
|
|
28
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
|
29
|
+
from streamlit.runtime.scriptrunner import (
|
|
30
|
+
RerunData,
|
|
31
|
+
ScriptRunContext,
|
|
32
|
+
get_script_run_ctx,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
if TYPE_CHECKING:
|
|
36
|
+
from streamlit.runtime.state.query_params import QueryParams, QueryParamsInput
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@gather_metrics("stop")
|
|
40
|
+
def stop() -> NoReturn: # type: ignore[misc]
|
|
41
|
+
"""Stops execution immediately.
|
|
42
|
+
|
|
43
|
+
Streamlit will not run any statements after `st.stop()`.
|
|
44
|
+
We recommend rendering a message to explain why the script has stopped.
|
|
45
|
+
|
|
46
|
+
Example
|
|
47
|
+
-------
|
|
48
|
+
>>> import streamlit as st
|
|
49
|
+
>>>
|
|
50
|
+
>>> name = st.text_input("Name")
|
|
51
|
+
>>> if not name:
|
|
52
|
+
>>> st.warning('Please input a name.')
|
|
53
|
+
>>> st.stop()
|
|
54
|
+
>>> st.success("Thank you for inputting a name.")
|
|
55
|
+
|
|
56
|
+
"""
|
|
57
|
+
ctx = get_script_run_ctx()
|
|
58
|
+
|
|
59
|
+
if ctx and ctx.script_requests:
|
|
60
|
+
ctx.script_requests.request_stop()
|
|
61
|
+
# Force a yield point so the runner can stop
|
|
62
|
+
st.empty()
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _new_fragment_id_queue(
|
|
66
|
+
ctx: ScriptRunContext,
|
|
67
|
+
scope: Literal["app", "fragment"],
|
|
68
|
+
) -> list[str]:
|
|
69
|
+
if scope == "app":
|
|
70
|
+
return []
|
|
71
|
+
|
|
72
|
+
# > scope == "fragment"
|
|
73
|
+
curr_queue = ctx.fragment_ids_this_run
|
|
74
|
+
|
|
75
|
+
# If st.rerun(scope="fragment") is called during a full script run, we raise an
|
|
76
|
+
# exception. This occurs, of course, if st.rerun(scope="fragment") is called
|
|
77
|
+
# outside of a fragment, but it somewhat surprisingly occurs if it gets called
|
|
78
|
+
# from within a fragment during a run of the full script. While this behavior may
|
|
79
|
+
# be surprising, it seems somewhat reasonable given that the correct behavior of
|
|
80
|
+
# calling st.rerun(scope="fragment") in this situation is unclear to me:
|
|
81
|
+
# * Rerunning just the fragment immediately may cause weirdness down the line
|
|
82
|
+
# as any part of the script that occurs after the fragment will not be
|
|
83
|
+
# executed.
|
|
84
|
+
# * Waiting until the full script run completes before rerunning the fragment
|
|
85
|
+
# seems odd (even if we normally do this before running a fragment not
|
|
86
|
+
# triggered by st.rerun()) because it defers the execution of st.rerun().
|
|
87
|
+
# * Rerunning the full app feels incorrect as we're seemingly ignoring the
|
|
88
|
+
# `scope` argument.
|
|
89
|
+
# With these issues and given that it seems pretty unnatural to have a
|
|
90
|
+
# fragment-scoped rerun happen during a full script run to begin with, it seems
|
|
91
|
+
# reasonable to just disallow this completely for now.
|
|
92
|
+
if not curr_queue:
|
|
93
|
+
raise StreamlitAPIException(
|
|
94
|
+
'scope="fragment" can only be specified from `@st.fragment`-decorated '
|
|
95
|
+
"functions during fragment reruns."
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
new_queue = list(dropwhile(lambda x: x != ctx.current_fragment_id, curr_queue))
|
|
99
|
+
if not new_queue:
|
|
100
|
+
raise RuntimeError(
|
|
101
|
+
"Could not find current_fragment_id in fragment_id_queue. This should never happen."
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
return new_queue
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _set_query_params_for_switch(
|
|
108
|
+
query_params_state: QueryParams,
|
|
109
|
+
new_query_params: QueryParamsInput | None,
|
|
110
|
+
) -> None:
|
|
111
|
+
"""Set query params for a switch page."""
|
|
112
|
+
|
|
113
|
+
if new_query_params is None:
|
|
114
|
+
query_params_state.clear()
|
|
115
|
+
return
|
|
116
|
+
|
|
117
|
+
if isinstance(new_query_params, Mapping) or (
|
|
118
|
+
isinstance(new_query_params, Iterable)
|
|
119
|
+
and not isinstance(
|
|
120
|
+
new_query_params, # type: ignore[unreachable]
|
|
121
|
+
(str, bytes),
|
|
122
|
+
)
|
|
123
|
+
):
|
|
124
|
+
query_params_state.from_dict(new_query_params)
|
|
125
|
+
return
|
|
126
|
+
|
|
127
|
+
raise StreamlitAPIException(
|
|
128
|
+
f"`query_params` must be a mapping or an iterable of (key, value) pairs not a `{type(new_query_params)}`."
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
@gather_metrics("rerun")
|
|
133
|
+
def rerun( # type: ignore[misc]
|
|
134
|
+
*, # The scope argument can only be passed via keyword.
|
|
135
|
+
scope: Literal["app", "fragment"] = "app",
|
|
136
|
+
) -> NoReturn: # ty: ignore[invalid-return-type]
|
|
137
|
+
"""Rerun the script immediately.
|
|
138
|
+
|
|
139
|
+
When ``st.rerun()`` is called, Streamlit halts the current script run and
|
|
140
|
+
executes no further statements. Streamlit immediately queues the script to
|
|
141
|
+
rerun.
|
|
142
|
+
|
|
143
|
+
When using ``st.rerun`` in a fragment, you can scope the rerun to the
|
|
144
|
+
fragment. However, if a fragment is running as part of a full-app rerun,
|
|
145
|
+
a fragment-scoped rerun is not allowed.
|
|
146
|
+
|
|
147
|
+
Parameters
|
|
148
|
+
----------
|
|
149
|
+
scope : "app" or "fragment"
|
|
150
|
+
Specifies what part of the app should rerun. If ``scope`` is ``"app"``
|
|
151
|
+
(default), the full app reruns. If ``scope`` is ``"fragment"``,
|
|
152
|
+
Streamlit only reruns the fragment from which this command is called.
|
|
153
|
+
|
|
154
|
+
Setting ``scope="fragment"`` is only valid inside a fragment during a
|
|
155
|
+
fragment rerun. If ``st.rerun(scope="fragment")`` is called during a
|
|
156
|
+
full-app rerun or outside of a fragment, Streamlit will raise a
|
|
157
|
+
``StreamlitAPIException``.
|
|
158
|
+
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
if scope not in {"app", "fragment"}:
|
|
162
|
+
raise StreamlitAPIException(
|
|
163
|
+
f"'{scope}'is not a valid rerun scope. Valid scopes are 'app' and 'fragment'."
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
ctx = get_script_run_ctx()
|
|
167
|
+
|
|
168
|
+
if ctx and ctx.script_requests:
|
|
169
|
+
query_string = ctx.query_string
|
|
170
|
+
page_script_hash = ctx.page_script_hash
|
|
171
|
+
cached_message_hashes = ctx.cached_message_hashes
|
|
172
|
+
|
|
173
|
+
ctx.script_requests.request_rerun(
|
|
174
|
+
RerunData(
|
|
175
|
+
query_string=query_string,
|
|
176
|
+
page_script_hash=page_script_hash,
|
|
177
|
+
fragment_id_queue=_new_fragment_id_queue(ctx, scope),
|
|
178
|
+
is_fragment_scoped_rerun=scope == "fragment",
|
|
179
|
+
cached_message_hashes=cached_message_hashes,
|
|
180
|
+
context_info=ctx.context_info,
|
|
181
|
+
)
|
|
182
|
+
)
|
|
183
|
+
# Force a yield point so the runner can do the rerun
|
|
184
|
+
st.empty()
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
@gather_metrics("switch_page")
|
|
188
|
+
def switch_page( # type: ignore[misc]
|
|
189
|
+
page: str | Path | StreamlitPage,
|
|
190
|
+
*,
|
|
191
|
+
query_params: QueryParamsInput | None = None,
|
|
192
|
+
) -> NoReturn: # ty: ignore[invalid-return-type]
|
|
193
|
+
"""Programmatically switch the current page in a multipage app.
|
|
194
|
+
|
|
195
|
+
When ``st.switch_page`` is called, the current page execution stops and
|
|
196
|
+
the specified page runs as if the user clicked on it in the sidebar
|
|
197
|
+
navigation. The specified page must be recognized by Streamlit's multipage
|
|
198
|
+
architecture (your main Python file or a Python file in a ``pages/``
|
|
199
|
+
folder). Arbitrary Python scripts cannot be passed to ``st.switch_page``.
|
|
200
|
+
|
|
201
|
+
Parameters
|
|
202
|
+
----------
|
|
203
|
+
page : str, Path, or st.Page
|
|
204
|
+
The file path (relative to the main script) or an st.Page indicating
|
|
205
|
+
the page to switch to.
|
|
206
|
+
|
|
207
|
+
query_params : dict, list of tuples, or None
|
|
208
|
+
Query parameters to apply when navigating to the target page.
|
|
209
|
+
This can be a dictionary or an iterable of key-value tuples. Values can
|
|
210
|
+
be strings or iterables of strings (for repeated keys). When this is
|
|
211
|
+
``None`` (default), all non-embed query parameters are cleared during
|
|
212
|
+
navigation.
|
|
213
|
+
|
|
214
|
+
Examples
|
|
215
|
+
--------
|
|
216
|
+
**Example 1: Basic usage**
|
|
217
|
+
|
|
218
|
+
The following example shows how to switch to a different page in a
|
|
219
|
+
multipage app that uses the ``pages/`` directory:
|
|
220
|
+
|
|
221
|
+
.. code-block:: text
|
|
222
|
+
|
|
223
|
+
your-repository/
|
|
224
|
+
├── pages/
|
|
225
|
+
│ ├── page_1.py
|
|
226
|
+
│ └── page_2.py
|
|
227
|
+
└── your_app.py
|
|
228
|
+
|
|
229
|
+
>>> import streamlit as st
|
|
230
|
+
>>>
|
|
231
|
+
>>> if st.button("Home"):
|
|
232
|
+
>>> st.switch_page("your_app.py")
|
|
233
|
+
>>> if st.button("Page 1"):
|
|
234
|
+
>>> st.switch_page("pages/page_1.py")
|
|
235
|
+
>>> if st.button("Page 2"):
|
|
236
|
+
>>> st.switch_page("pages/page_2.py")
|
|
237
|
+
|
|
238
|
+
.. output::
|
|
239
|
+
https://doc-switch-page.streamlit.app/
|
|
240
|
+
height: 350px
|
|
241
|
+
|
|
242
|
+
**Example 2: Passing query parameters**
|
|
243
|
+
|
|
244
|
+
The following example shows how to pass query parameters when switching to a
|
|
245
|
+
different page. This example uses ``st.navigation`` to create a multipage app.
|
|
246
|
+
|
|
247
|
+
.. code-block:: text
|
|
248
|
+
|
|
249
|
+
your-repository/
|
|
250
|
+
├── page_2.py
|
|
251
|
+
└── your_app.py
|
|
252
|
+
|
|
253
|
+
>>> import streamlit as st
|
|
254
|
+
>>>
|
|
255
|
+
>>> def page_1():
|
|
256
|
+
>>> st.title("Page 1")
|
|
257
|
+
>>> if st.button("Switch to Page 2"):
|
|
258
|
+
>>> st.switch_page("page_2.py", query_params={"utm_source": "page_1"})
|
|
259
|
+
>>>
|
|
260
|
+
>>> pg = st.navigation([page_1, "page_2.py"])
|
|
261
|
+
>>> pg.run()
|
|
262
|
+
|
|
263
|
+
.. output::
|
|
264
|
+
https://doc-switch-page-query-params.streamlit.app/
|
|
265
|
+
height: 350px
|
|
266
|
+
|
|
267
|
+
"""
|
|
268
|
+
|
|
269
|
+
ctx = get_script_run_ctx()
|
|
270
|
+
|
|
271
|
+
if not ctx or not ctx.script_requests:
|
|
272
|
+
# This should never be the case
|
|
273
|
+
raise NoSessionContext()
|
|
274
|
+
|
|
275
|
+
page_script_hash = ""
|
|
276
|
+
if isinstance(page, StreamlitPage):
|
|
277
|
+
page_script_hash = page._script_hash
|
|
278
|
+
else:
|
|
279
|
+
# Convert Path to string if necessary
|
|
280
|
+
if isinstance(page, Path):
|
|
281
|
+
page = str(page)
|
|
282
|
+
|
|
283
|
+
main_script_directory = get_main_script_directory(ctx.main_script_path)
|
|
284
|
+
requested_page = os.path.realpath(
|
|
285
|
+
normalize_path_join(main_script_directory, page)
|
|
286
|
+
)
|
|
287
|
+
all_app_pages = ctx.pages_manager.get_pages().values()
|
|
288
|
+
|
|
289
|
+
matched_pages = [p for p in all_app_pages if p["script_path"] == requested_page]
|
|
290
|
+
|
|
291
|
+
if len(matched_pages) == 0:
|
|
292
|
+
raise StreamlitAPIException(
|
|
293
|
+
f"Could not find page: `{page}`. Must be the file path relative to the main script, "
|
|
294
|
+
f"from the directory: `{os.path.basename(main_script_directory)}`. Only the main app file "
|
|
295
|
+
"and files in the `pages/` directory are supported."
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
page_script_hash = matched_pages[0]["page_script_hash"]
|
|
299
|
+
|
|
300
|
+
# Reset query params (with exception of embed) and optionally apply overrides.
|
|
301
|
+
with ctx.session_state.query_params() as qp:
|
|
302
|
+
_set_query_params_for_switch(qp, query_params)
|
|
303
|
+
# Additional safeguard to ensure the query params
|
|
304
|
+
# are sent out to the frontend before the new rerun might clear
|
|
305
|
+
# outstanding messages. This uses the same time that is used as waiting
|
|
306
|
+
# in our event loop.
|
|
307
|
+
time.sleep(0.01)
|
|
308
|
+
|
|
309
|
+
ctx.script_requests.request_rerun(
|
|
310
|
+
RerunData(
|
|
311
|
+
query_string=ctx.query_string,
|
|
312
|
+
page_script_hash=page_script_hash,
|
|
313
|
+
cached_message_hashes=ctx.cached_message_hashes,
|
|
314
|
+
context_info=ctx.context_info,
|
|
315
|
+
)
|
|
316
|
+
)
|
|
317
|
+
# Force a yield point so the runner can do the rerun
|
|
318
|
+
st.empty()
|