streamlit-nightly 1.43.2.dev20250307__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 +306 -0
- streamlit/__main__.py +20 -0
- streamlit/auth_util.py +218 -0
- streamlit/cli_util.py +105 -0
- streamlit/column_config.py +56 -0
- streamlit/commands/__init__.py +13 -0
- streamlit/commands/echo.py +126 -0
- streamlit/commands/execution_control.py +238 -0
- streamlit/commands/experimental_query_params.py +169 -0
- streamlit/commands/logo.py +189 -0
- streamlit/commands/navigation.py +385 -0
- streamlit/commands/page_config.py +311 -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 +150 -0
- streamlit/components/v1/__init__.py +31 -0
- streamlit/components/v1/component_arrow.py +141 -0
- streamlit/components/v1/component_registry.py +130 -0
- streamlit/components/v1/components.py +38 -0
- streamlit/components/v1/custom_component.py +243 -0
- streamlit/config.py +1513 -0
- streamlit/config_option.py +311 -0
- streamlit/config_util.py +177 -0
- streamlit/connections/__init__.py +28 -0
- streamlit/connections/base_connection.py +174 -0
- streamlit/connections/snowflake_connection.py +562 -0
- streamlit/connections/snowpark_connection.py +213 -0
- streamlit/connections/sql_connection.py +425 -0
- streamlit/connections/util.py +97 -0
- streamlit/cursor.py +210 -0
- streamlit/dataframe_util.py +1416 -0
- streamlit/delta_generator.py +602 -0
- streamlit/delta_generator_singletons.py +204 -0
- streamlit/deprecation_util.py +209 -0
- streamlit/development.py +21 -0
- streamlit/elements/__init__.py +13 -0
- streamlit/elements/alert.py +234 -0
- streamlit/elements/arrow.py +962 -0
- streamlit/elements/balloons.py +47 -0
- streamlit/elements/bokeh_chart.py +133 -0
- streamlit/elements/code.py +114 -0
- streamlit/elements/deck_gl_json_chart.py +546 -0
- streamlit/elements/dialog_decorator.py +267 -0
- streamlit/elements/doc_string.py +558 -0
- streamlit/elements/empty.py +130 -0
- streamlit/elements/exception.py +331 -0
- streamlit/elements/form.py +354 -0
- streamlit/elements/graphviz_chart.py +150 -0
- streamlit/elements/heading.py +302 -0
- streamlit/elements/html.py +105 -0
- streamlit/elements/iframe.py +191 -0
- streamlit/elements/image.py +196 -0
- streamlit/elements/json.py +139 -0
- streamlit/elements/layouts.py +879 -0
- streamlit/elements/lib/__init__.py +13 -0
- streamlit/elements/lib/built_in_chart_utils.py +1157 -0
- streamlit/elements/lib/color_util.py +263 -0
- streamlit/elements/lib/column_config_utils.py +542 -0
- streamlit/elements/lib/column_types.py +2188 -0
- streamlit/elements/lib/dialog.py +147 -0
- streamlit/elements/lib/dicttools.py +154 -0
- streamlit/elements/lib/event_utils.py +37 -0
- streamlit/elements/lib/file_uploader_utils.py +66 -0
- streamlit/elements/lib/form_utils.py +77 -0
- streamlit/elements/lib/image_utils.py +441 -0
- streamlit/elements/lib/js_number.py +105 -0
- streamlit/elements/lib/mutable_status_container.py +183 -0
- streamlit/elements/lib/options_selector_utils.py +250 -0
- streamlit/elements/lib/pandas_styler_utils.py +274 -0
- streamlit/elements/lib/policies.py +194 -0
- streamlit/elements/lib/streamlit_plotly_theme.py +207 -0
- streamlit/elements/lib/subtitle_utils.py +176 -0
- streamlit/elements/lib/utils.py +250 -0
- streamlit/elements/map.py +508 -0
- streamlit/elements/markdown.py +277 -0
- streamlit/elements/media.py +793 -0
- streamlit/elements/metric.py +301 -0
- streamlit/elements/plotly_chart.py +546 -0
- streamlit/elements/progress.py +156 -0
- streamlit/elements/pyplot.py +194 -0
- streamlit/elements/snow.py +47 -0
- streamlit/elements/spinner.py +113 -0
- streamlit/elements/text.py +76 -0
- streamlit/elements/toast.py +98 -0
- streamlit/elements/vega_charts.py +1984 -0
- streamlit/elements/widgets/__init__.py +13 -0
- streamlit/elements/widgets/audio_input.py +310 -0
- streamlit/elements/widgets/button.py +1123 -0
- streamlit/elements/widgets/button_group.py +1008 -0
- streamlit/elements/widgets/camera_input.py +263 -0
- streamlit/elements/widgets/chat.py +647 -0
- streamlit/elements/widgets/checkbox.py +352 -0
- streamlit/elements/widgets/color_picker.py +265 -0
- streamlit/elements/widgets/data_editor.py +983 -0
- streamlit/elements/widgets/file_uploader.py +486 -0
- streamlit/elements/widgets/multiselect.py +338 -0
- streamlit/elements/widgets/number_input.py +545 -0
- streamlit/elements/widgets/radio.py +407 -0
- streamlit/elements/widgets/select_slider.py +437 -0
- streamlit/elements/widgets/selectbox.py +366 -0
- streamlit/elements/widgets/slider.py +880 -0
- streamlit/elements/widgets/text_widgets.py +628 -0
- streamlit/elements/widgets/time_widgets.py +970 -0
- streamlit/elements/write.py +574 -0
- streamlit/emojis.py +34 -0
- streamlit/env_util.py +61 -0
- streamlit/error_util.py +105 -0
- streamlit/errors.py +452 -0
- streamlit/external/__init__.py +13 -0
- streamlit/external/langchain/__init__.py +23 -0
- streamlit/external/langchain/streamlit_callback_handler.py +406 -0
- streamlit/file_util.py +247 -0
- streamlit/git_util.py +173 -0
- streamlit/hello/__init__.py +13 -0
- streamlit/hello/animation_demo.py +82 -0
- streamlit/hello/dataframe_demo.py +71 -0
- streamlit/hello/hello.py +37 -0
- streamlit/hello/mapping_demo.py +114 -0
- streamlit/hello/plotting_demo.py +55 -0
- streamlit/hello/streamlit_app.py +55 -0
- streamlit/hello/utils.py +28 -0
- streamlit/logger.py +130 -0
- streamlit/material_icon_names.py +25 -0
- streamlit/navigation/__init__.py +13 -0
- streamlit/navigation/page.py +302 -0
- streamlit/net_util.py +125 -0
- streamlit/platform.py +33 -0
- streamlit/proto/Alert_pb2.py +29 -0
- streamlit/proto/Alert_pb2.pyi +90 -0
- streamlit/proto/AppPage_pb2.py +27 -0
- streamlit/proto/AppPage_pb2.pyi +64 -0
- streamlit/proto/ArrowNamedDataSet_pb2.py +28 -0
- streamlit/proto/ArrowNamedDataSet_pb2.pyi +57 -0
- streamlit/proto/ArrowVegaLiteChart_pb2.py +29 -0
- streamlit/proto/ArrowVegaLiteChart_pb2.pyi +84 -0
- streamlit/proto/Arrow_pb2.py +33 -0
- streamlit/proto/Arrow_pb2.pyi +188 -0
- streamlit/proto/AudioInput_pb2.py +28 -0
- streamlit/proto/AudioInput_pb2.pyi +58 -0
- streamlit/proto/Audio_pb2.py +27 -0
- streamlit/proto/Audio_pb2.pyi +58 -0
- streamlit/proto/AuthRedirect_pb2.py +27 -0
- streamlit/proto/AuthRedirect_pb2.pyi +41 -0
- streamlit/proto/AutoRerun_pb2.py +27 -0
- streamlit/proto/AutoRerun_pb2.pyi +45 -0
- streamlit/proto/BackMsg_pb2.py +29 -0
- streamlit/proto/BackMsg_pb2.pyi +105 -0
- streamlit/proto/Balloons_pb2.py +27 -0
- streamlit/proto/Balloons_pb2.pyi +43 -0
- streamlit/proto/Block_pb2.py +53 -0
- streamlit/proto/Block_pb2.pyi +322 -0
- streamlit/proto/BokehChart_pb2.py +27 -0
- streamlit/proto/BokehChart_pb2.pyi +49 -0
- streamlit/proto/ButtonGroup_pb2.py +36 -0
- streamlit/proto/ButtonGroup_pb2.pyi +169 -0
- streamlit/proto/Button_pb2.py +27 -0
- streamlit/proto/Button_pb2.pyi +71 -0
- streamlit/proto/CameraInput_pb2.py +28 -0
- streamlit/proto/CameraInput_pb2.pyi +58 -0
- streamlit/proto/ChatInput_pb2.py +31 -0
- streamlit/proto/ChatInput_pb2.pyi +111 -0
- streamlit/proto/Checkbox_pb2.py +30 -0
- streamlit/proto/Checkbox_pb2.pyi +90 -0
- streamlit/proto/ClientState_pb2.py +30 -0
- streamlit/proto/ClientState_pb2.pyi +90 -0
- streamlit/proto/Code_pb2.py +27 -0
- streamlit/proto/Code_pb2.pyi +55 -0
- streamlit/proto/ColorPicker_pb2.py +28 -0
- streamlit/proto/ColorPicker_pb2.pyi +67 -0
- streamlit/proto/Common_pb2.py +51 -0
- streamlit/proto/Common_pb2.pyi +293 -0
- streamlit/proto/Components_pb2.py +35 -0
- streamlit/proto/Components_pb2.pyi +172 -0
- streamlit/proto/DataFrame_pb2.py +56 -0
- streamlit/proto/DataFrame_pb2.pyi +397 -0
- streamlit/proto/DateInput_pb2.py +28 -0
- streamlit/proto/DateInput_pb2.pyi +83 -0
- streamlit/proto/DeckGlJsonChart_pb2.py +29 -0
- streamlit/proto/DeckGlJsonChart_pb2.pyi +102 -0
- streamlit/proto/Delta_pb2.py +31 -0
- streamlit/proto/Delta_pb2.pyi +74 -0
- streamlit/proto/DocString_pb2.py +29 -0
- streamlit/proto/DocString_pb2.pyi +93 -0
- streamlit/proto/DownloadButton_pb2.py +27 -0
- streamlit/proto/DownloadButton_pb2.pyi +70 -0
- streamlit/proto/Element_pb2.py +78 -0
- streamlit/proto/Element_pb2.pyi +312 -0
- streamlit/proto/Empty_pb2.py +27 -0
- streamlit/proto/Empty_pb2.pyi +36 -0
- streamlit/proto/Exception_pb2.py +27 -0
- streamlit/proto/Exception_pb2.pyi +72 -0
- streamlit/proto/Favicon_pb2.py +27 -0
- streamlit/proto/Favicon_pb2.pyi +40 -0
- streamlit/proto/FileUploader_pb2.py +28 -0
- streamlit/proto/FileUploader_pb2.pyi +78 -0
- streamlit/proto/ForwardMsg_pb2.py +53 -0
- streamlit/proto/ForwardMsg_pb2.pyi +293 -0
- streamlit/proto/GitInfo_pb2.py +29 -0
- streamlit/proto/GitInfo_pb2.pyi +83 -0
- streamlit/proto/GraphVizChart_pb2.py +27 -0
- streamlit/proto/GraphVizChart_pb2.pyi +53 -0
- streamlit/proto/Heading_pb2.py +27 -0
- streamlit/proto/Heading_pb2.pyi +56 -0
- streamlit/proto/Html_pb2.py +27 -0
- streamlit/proto/Html_pb2.pyi +42 -0
- streamlit/proto/IFrame_pb2.py +27 -0
- streamlit/proto/IFrame_pb2.pyi +59 -0
- streamlit/proto/Image_pb2.py +29 -0
- streamlit/proto/Image_pb2.pyi +84 -0
- streamlit/proto/Json_pb2.py +27 -0
- streamlit/proto/Json_pb2.pyi +53 -0
- streamlit/proto/LabelVisibilityMessage_pb2.py +29 -0
- streamlit/proto/LabelVisibilityMessage_pb2.pyi +68 -0
- streamlit/proto/LinkButton_pb2.py +27 -0
- streamlit/proto/LinkButton_pb2.pyi +58 -0
- streamlit/proto/Logo_pb2.py +27 -0
- streamlit/proto/Logo_pb2.pyi +51 -0
- streamlit/proto/Markdown_pb2.py +29 -0
- streamlit/proto/Markdown_pb2.pyi +86 -0
- streamlit/proto/Metric_pb2.py +32 -0
- streamlit/proto/Metric_pb2.pyi +101 -0
- streamlit/proto/MetricsEvent_pb2.py +30 -0
- streamlit/proto/MetricsEvent_pb2.pyi +200 -0
- streamlit/proto/MultiSelect_pb2.py +28 -0
- streamlit/proto/MultiSelect_pb2.pyi +81 -0
- streamlit/proto/NamedDataSet_pb2.py +28 -0
- streamlit/proto/NamedDataSet_pb2.pyi +59 -0
- streamlit/proto/Navigation_pb2.py +30 -0
- streamlit/proto/Navigation_pb2.pyi +84 -0
- streamlit/proto/NewSession_pb2.py +51 -0
- streamlit/proto/NewSession_pb2.pyi +481 -0
- streamlit/proto/NumberInput_pb2.py +30 -0
- streamlit/proto/NumberInput_pb2.pyi +121 -0
- streamlit/proto/PageConfig_pb2.py +33 -0
- streamlit/proto/PageConfig_pb2.pyi +126 -0
- streamlit/proto/PageInfo_pb2.py +27 -0
- streamlit/proto/PageInfo_pb2.pyi +43 -0
- streamlit/proto/PageLink_pb2.py +27 -0
- streamlit/proto/PageLink_pb2.pyi +63 -0
- streamlit/proto/PageNotFound_pb2.py +27 -0
- streamlit/proto/PageNotFound_pb2.pyi +42 -0
- streamlit/proto/PageProfile_pb2.py +31 -0
- streamlit/proto/PageProfile_pb2.pyi +127 -0
- streamlit/proto/PagesChanged_pb2.py +28 -0
- streamlit/proto/PagesChanged_pb2.pyi +48 -0
- streamlit/proto/ParentMessage_pb2.py +27 -0
- streamlit/proto/ParentMessage_pb2.pyi +46 -0
- streamlit/proto/PlotlyChart_pb2.py +31 -0
- streamlit/proto/PlotlyChart_pb2.pyi +131 -0
- streamlit/proto/Progress_pb2.py +27 -0
- streamlit/proto/Progress_pb2.pyi +43 -0
- streamlit/proto/Radio_pb2.py +28 -0
- streamlit/proto/Radio_pb2.pyi +84 -0
- streamlit/proto/RootContainer_pb2.py +27 -0
- streamlit/proto/RootContainer_pb2.pyi +56 -0
- streamlit/proto/Selectbox_pb2.py +28 -0
- streamlit/proto/Selectbox_pb2.pyi +80 -0
- streamlit/proto/SessionEvent_pb2.py +28 -0
- streamlit/proto/SessionEvent_pb2.pyi +62 -0
- streamlit/proto/SessionStatus_pb2.py +27 -0
- streamlit/proto/SessionStatus_pb2.pyi +57 -0
- streamlit/proto/Skeleton_pb2.py +29 -0
- streamlit/proto/Skeleton_pb2.pyi +71 -0
- streamlit/proto/Slider_pb2.py +32 -0
- streamlit/proto/Slider_pb2.pyi +142 -0
- streamlit/proto/Snow_pb2.py +27 -0
- streamlit/proto/Snow_pb2.pyi +43 -0
- streamlit/proto/Spinner_pb2.py +27 -0
- streamlit/proto/Spinner_pb2.pyi +49 -0
- streamlit/proto/TextArea_pb2.py +28 -0
- streamlit/proto/TextArea_pb2.pyi +80 -0
- streamlit/proto/TextInput_pb2.py +30 -0
- streamlit/proto/TextInput_pb2.pyi +107 -0
- streamlit/proto/Text_pb2.py +27 -0
- streamlit/proto/Text_pb2.pyi +46 -0
- streamlit/proto/TimeInput_pb2.py +28 -0
- streamlit/proto/TimeInput_pb2.pyi +74 -0
- streamlit/proto/Toast_pb2.py +27 -0
- streamlit/proto/Toast_pb2.pyi +45 -0
- streamlit/proto/VegaLiteChart_pb2.py +29 -0
- streamlit/proto/VegaLiteChart_pb2.pyi +71 -0
- streamlit/proto/Video_pb2.py +31 -0
- streamlit/proto/Video_pb2.pyi +117 -0
- streamlit/proto/WidgetStates_pb2.py +31 -0
- streamlit/proto/WidgetStates_pb2.pyi +126 -0
- streamlit/proto/__init__.py +15 -0
- streamlit/proto/openmetrics_data_model_pb2.py +60 -0
- streamlit/proto/openmetrics_data_model_pb2.pyi +522 -0
- streamlit/py.typed +0 -0
- streamlit/runtime/__init__.py +50 -0
- streamlit/runtime/app_session.py +982 -0
- streamlit/runtime/caching/__init__.py +98 -0
- streamlit/runtime/caching/cache_data_api.py +665 -0
- streamlit/runtime/caching/cache_errors.py +142 -0
- streamlit/runtime/caching/cache_resource_api.py +527 -0
- streamlit/runtime/caching/cache_type.py +33 -0
- streamlit/runtime/caching/cache_utils.py +523 -0
- streamlit/runtime/caching/cached_message_replay.py +290 -0
- streamlit/runtime/caching/hashing.py +637 -0
- streamlit/runtime/caching/legacy_cache_api.py +169 -0
- streamlit/runtime/caching/storage/__init__.py +29 -0
- streamlit/runtime/caching/storage/cache_storage_protocol.py +239 -0
- streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
- streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +145 -0
- streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
- streamlit/runtime/connection_factory.py +436 -0
- streamlit/runtime/context.py +280 -0
- streamlit/runtime/credentials.py +364 -0
- streamlit/runtime/forward_msg_cache.py +296 -0
- streamlit/runtime/forward_msg_queue.py +240 -0
- streamlit/runtime/fragment.py +477 -0
- streamlit/runtime/media_file_manager.py +234 -0
- streamlit/runtime/media_file_storage.py +143 -0
- streamlit/runtime/memory_media_file_storage.py +181 -0
- streamlit/runtime/memory_session_storage.py +77 -0
- streamlit/runtime/memory_uploaded_file_manager.py +138 -0
- streamlit/runtime/metrics_util.py +486 -0
- streamlit/runtime/pages_manager.py +165 -0
- streamlit/runtime/runtime.py +792 -0
- streamlit/runtime/runtime_util.py +106 -0
- streamlit/runtime/script_data.py +46 -0
- streamlit/runtime/scriptrunner/__init__.py +38 -0
- streamlit/runtime/scriptrunner/exec_code.py +159 -0
- streamlit/runtime/scriptrunner/magic.py +273 -0
- streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
- streamlit/runtime/scriptrunner/script_cache.py +89 -0
- streamlit/runtime/scriptrunner/script_runner.py +756 -0
- streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
- streamlit/runtime/scriptrunner_utils/exceptions.py +48 -0
- streamlit/runtime/scriptrunner_utils/script_requests.py +307 -0
- streamlit/runtime/scriptrunner_utils/script_run_context.py +287 -0
- streamlit/runtime/secrets.py +534 -0
- streamlit/runtime/session_manager.py +394 -0
- streamlit/runtime/state/__init__.py +41 -0
- streamlit/runtime/state/common.py +191 -0
- streamlit/runtime/state/query_params.py +205 -0
- streamlit/runtime/state/query_params_proxy.py +218 -0
- streamlit/runtime/state/safe_session_state.py +138 -0
- streamlit/runtime/state/session_state.py +772 -0
- streamlit/runtime/state/session_state_proxy.py +153 -0
- streamlit/runtime/state/widgets.py +135 -0
- streamlit/runtime/stats.py +109 -0
- streamlit/runtime/uploaded_file_manager.py +148 -0
- streamlit/runtime/websocket_session_manager.py +167 -0
- streamlit/source_util.py +98 -0
- streamlit/static/favicon.png +0 -0
- streamlit/static/index.html +61 -0
- streamlit/static/static/css/index.Bmkmz40k.css +1 -0
- streamlit/static/static/css/index.DpJG_94W.css +1 -0
- streamlit/static/static/css/index.DzuxGC_t.css +1 -0
- streamlit/static/static/js/FileDownload.esm.Bp9m5jrx.js +1 -0
- streamlit/static/static/js/FileHelper.D_3pbilj.js +5 -0
- streamlit/static/static/js/FormClearHelper.Ct2rwLXo.js +1 -0
- streamlit/static/static/js/Hooks.BKdzj5MJ.js +1 -0
- streamlit/static/static/js/InputInstructions.DB3QGNJP.js +1 -0
- streamlit/static/static/js/ProgressBar.D40A5xc2.js +2 -0
- streamlit/static/static/js/RenderInPortalIfExists.DLUCooTN.js +1 -0
- streamlit/static/static/js/Toolbar.BiGGIQun.js +1 -0
- streamlit/static/static/js/UploadFileInfo.C-jY39rj.js +1 -0
- streamlit/static/static/js/base-input.CQBQT24M.js +4 -0
- streamlit/static/static/js/checkbox.Buj8gd_M.js +9 -0
- streamlit/static/static/js/createDownloadLinkElement.DZMwyjvU.js +1 -0
- streamlit/static/static/js/createSuper.CesK3I23.js +1 -0
- streamlit/static/static/js/data-grid-overlay-editor.B69OOFM4.js +1 -0
- streamlit/static/static/js/downloader.BZQhlBNT.js +1 -0
- streamlit/static/static/js/es6.D9Zhqujy.js +2 -0
- streamlit/static/static/js/iframeResizer.contentWindow.CAzcBpCC.js +1 -0
- streamlit/static/static/js/index.08vcOOvb.js +1 -0
- streamlit/static/static/js/index.0uqKfJUS.js +1 -0
- streamlit/static/static/js/index.B02M5u69.js +203 -0
- streamlit/static/static/js/index.B7mcZKMx.js +1 -0
- streamlit/static/static/js/index.BAQDHFA_.js +1 -0
- streamlit/static/static/js/index.BI60cMVr.js +2 -0
- streamlit/static/static/js/index.BLug2inK.js +1 -0
- streamlit/static/static/js/index.BM6TMY8g.js +2 -0
- streamlit/static/static/js/index.BZ9p1t7G.js +1 -0
- streamlit/static/static/js/index.BZqa87a1.js +2 -0
- streamlit/static/static/js/index.BcsRUzZZ.js +1 -0
- streamlit/static/static/js/index.BgVMiY_P.js +197 -0
- streamlit/static/static/js/index.BtuGy7By.js +6 -0
- streamlit/static/static/js/index.BuDuBmrs.js +1 -0
- streamlit/static/static/js/index.BvXU2oKV.js +1 -0
- streamlit/static/static/js/index.BxcwPacT.js +73 -0
- streamlit/static/static/js/index.CWX8KB81.js +1 -0
- streamlit/static/static/js/index.CXzZTo_q.js +1 -0
- streamlit/static/static/js/index.CcRWp_KL.js +1 -0
- streamlit/static/static/js/index.Cd-_xe55.js +3 -0
- streamlit/static/static/js/index.CdG2PXln.js +4537 -0
- streamlit/static/static/js/index.CjXvXmcP.js +1 -0
- streamlit/static/static/js/index.D1HZENZx.js +776 -0
- streamlit/static/static/js/index.D21Efo64.js +1617 -0
- streamlit/static/static/js/index.D9WgGVBx.js +7 -0
- streamlit/static/static/js/index.DEcsHtvb.js +12 -0
- streamlit/static/static/js/index.DFeMfr_K.js +1 -0
- streamlit/static/static/js/index.DHFBoItz.js +1 -0
- streamlit/static/static/js/index.D_PrBKnJ.js +3 -0
- streamlit/static/static/js/index.DmuRkekN.js +3855 -0
- streamlit/static/static/js/index.Do6eY8sf.js +1 -0
- streamlit/static/static/js/index.Dz3lP2P-.js +1 -0
- streamlit/static/static/js/index.Dz_UqF-s.js +1 -0
- streamlit/static/static/js/index.GkSUsPhJ.js +1 -0
- streamlit/static/static/js/index.H1U1IC_d.js +3 -0
- streamlit/static/static/js/index.g6p_4DPr.js +1 -0
- streamlit/static/static/js/index.g9x_GKss.js +1 -0
- streamlit/static/static/js/index.zo9jm08y.js +1 -0
- streamlit/static/static/js/input.DnaFglHq.js +2 -0
- streamlit/static/static/js/inputUtils.CQWz5UKz.js +1 -0
- streamlit/static/static/js/memory.Crb9x4-F.js +1 -0
- streamlit/static/static/js/mergeWith.ouAz0sK3.js +1 -0
- streamlit/static/static/js/number-overlay-editor._UaN-O48.js +9 -0
- streamlit/static/static/js/possibleConstructorReturn.CtGjGFHz.js +1 -0
- streamlit/static/static/js/sandbox.CBybYOhV.js +1 -0
- streamlit/static/static/js/sprintf.D7DtBTRn.js +1 -0
- streamlit/static/static/js/textarea.Cb_uJt5U.js +2 -0
- streamlit/static/static/js/threshold.DjX0wlsa.js +1 -0
- streamlit/static/static/js/timepicker.DKT7pfoF.js +4 -0
- streamlit/static/static/js/timer.CAwTRJ_g.js +1 -0
- streamlit/static/static/js/toConsumableArray.05Ikp13-.js +3 -0
- streamlit/static/static/js/uniqueId.D2FMWUEI.js +1 -0
- streamlit/static/static/js/useBasicWidgetState.urnZLANY.js +1 -0
- streamlit/static/static/js/useOnInputChange.BOKIIdJ1.js +1 -0
- streamlit/static/static/js/value.CgPGBV_l.js +1 -0
- streamlit/static/static/js/withFullScreenWrapper.C_N8J0Xx.js +1 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.BQhdFMY1.woff2 +0 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.DMm9YOAa.woff +0 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.DRggAlZN.ttf +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.ATXxdsX0.ttf +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.BEiXGLvX.woff +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.Dq_IR9rO.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.CTRA-rTL.woff +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.Di6jR-x-.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.wX97UBjC.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.BdnERNNW.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.BsDP51OF.woff +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.CL6g_b3V.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.CB_wures.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.CTYiF6lA.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.Dxdc4cR9.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.Cx986IdX.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.Jm3AIy58.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.waoOVXN0.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.DxDJ3AOS.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.DzxPMmG6.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.SpSLRI95.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.3WenGoN9.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.BMLOBm91.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.NWA7e6Wa.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.B22Nviop.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.Dr94JaBh.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.ypZvNtVU.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.B3XSjfu4.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.CZnvNsCZ.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.iY-2wyZ7.woff +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.DA0__PXp.woff +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.flOr_0UB.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.t53AETM-.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.CFMepnvq.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.D1sUS0GD.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.DbIhKOiC.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.C3H0VqGB.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.DN2j7dab.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.YYjJ1zSn.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.BNo7hRIc.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.CS6fqUqJ.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.DDBCnlJ7.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.C5JkGWo-.ttf +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.D3wIWfF6.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.D5yQViql.woff +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.C195tn64.woff +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.Dbsnue_I.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.mCD8mA8B.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.B7gKUWhC.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.Dy4dx90m.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.oD1tc_U0.woff +0 -0
- streamlit/static/static/media/KaTeX_Size3-Regular.CTq5MqoE.woff +0 -0
- streamlit/static/static/media/KaTeX_Size3-Regular.DgpXs0kz.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.BF-4gkZK.woff +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.DWFBv043.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.Dl5lxZxV.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.C0xS9mPB.woff +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.CO6r4hn1.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.D3Ib7_Hf.ttf +0 -0
- streamlit/static/static/media/MaterialSymbols-Rounded.DcZbplWk.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Bold.CFEfr7-q.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-BoldItalic.C-LkFXxa.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Italic.CxFOx7N-.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Regular.CBOlD63d.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-SemiBold.CFHwW3Wd.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-SemiBoldItalic.Cg2yRu82.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Bold.-6c9oR8J.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-BoldItalic.DmM_grLY.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Italic.I1ipWe7Q.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Regular.DZLUzqI4.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-SemiBold.sKQIyTMz.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-SemiBoldItalic.C0wP0icr.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Bold.8TUnKj4x.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-BoldItalic.CBVO7Ve7.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Italic.DkFgL2HZ.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Regular.CNJNET2S.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-SemiBold.CHyh9GC5.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-SemiBoldItalic.CBtz8sWN.woff2 +0 -0
- streamlit/static/static/media/balloon-0.Czj7AKwE.png +0 -0
- streamlit/static/static/media/balloon-1.CNvFFrND.png +0 -0
- streamlit/static/static/media/balloon-2.DTvC6B1t.png +0 -0
- streamlit/static/static/media/balloon-3.CgSk4tbL.png +0 -0
- streamlit/static/static/media/balloon-4.mbtFrzxf.png +0 -0
- streamlit/static/static/media/balloon-5.CSwkUfRA.png +0 -0
- streamlit/static/static/media/fireworks.B4d-_KUe.gif +0 -0
- streamlit/static/static/media/flake-0.DgWaVvm5.png +0 -0
- streamlit/static/static/media/flake-1.B2r5AHMK.png +0 -0
- streamlit/static/static/media/flake-2.BnWSExPC.png +0 -0
- streamlit/static/static/media/snowflake.JU2jBHL8.svg +11 -0
- streamlit/string_util.py +203 -0
- streamlit/temporary_directory.py +56 -0
- streamlit/testing/__init__.py +13 -0
- streamlit/testing/v1/__init__.py +17 -0
- streamlit/testing/v1/app_test.py +1050 -0
- streamlit/testing/v1/element_tree.py +2083 -0
- streamlit/testing/v1/local_script_runner.py +180 -0
- streamlit/testing/v1/util.py +53 -0
- streamlit/time_util.py +75 -0
- streamlit/type_util.py +460 -0
- streamlit/url_util.py +122 -0
- streamlit/user_info.py +519 -0
- streamlit/util.py +72 -0
- streamlit/vendor/__init__.py +0 -0
- streamlit/vendor/pympler/__init__.py +0 -0
- streamlit/vendor/pympler/asizeof.py +2869 -0
- streamlit/version.py +18 -0
- streamlit/watcher/__init__.py +28 -0
- streamlit/watcher/event_based_path_watcher.py +406 -0
- streamlit/watcher/folder_black_list.py +82 -0
- streamlit/watcher/local_sources_watcher.py +233 -0
- streamlit/watcher/path_watcher.py +185 -0
- streamlit/watcher/polling_path_watcher.py +124 -0
- streamlit/watcher/util.py +207 -0
- streamlit/web/__init__.py +13 -0
- streamlit/web/bootstrap.py +353 -0
- streamlit/web/cache_storage_manager_config.py +38 -0
- streamlit/web/cli.py +369 -0
- streamlit/web/server/__init__.py +26 -0
- streamlit/web/server/app_static_file_handler.py +93 -0
- streamlit/web/server/authlib_tornado_integration.py +60 -0
- streamlit/web/server/browser_websocket_handler.py +246 -0
- streamlit/web/server/component_request_handler.py +116 -0
- streamlit/web/server/media_file_handler.py +141 -0
- streamlit/web/server/oauth_authlib_routes.py +176 -0
- streamlit/web/server/oidc_mixin.py +108 -0
- streamlit/web/server/routes.py +295 -0
- streamlit/web/server/server.py +479 -0
- streamlit/web/server/server_util.py +161 -0
- streamlit/web/server/stats_request_handler.py +95 -0
- streamlit/web/server/upload_file_request_handler.py +137 -0
- streamlit/web/server/websocket_headers.py +56 -0
- streamlit_nightly-1.43.2.dev20250307.data/scripts/streamlit.cmd +16 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/METADATA +207 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/RECORD +563 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/WHEEL +5 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/entry_points.txt +2 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/top_level.txt +1 -0
@@ -0,0 +1,880 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
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
|
+
from collections.abc import Sequence
|
18
|
+
from dataclasses import dataclass
|
19
|
+
from datetime import date, datetime, time, timedelta, timezone, tzinfo
|
20
|
+
from numbers import Integral, Real
|
21
|
+
from textwrap import dedent
|
22
|
+
from typing import (
|
23
|
+
TYPE_CHECKING,
|
24
|
+
Any,
|
25
|
+
Final,
|
26
|
+
TypeVar,
|
27
|
+
Union,
|
28
|
+
cast,
|
29
|
+
overload,
|
30
|
+
)
|
31
|
+
|
32
|
+
from typing_extensions import TypeAlias
|
33
|
+
|
34
|
+
from streamlit.elements.lib.form_utils import current_form_id
|
35
|
+
from streamlit.elements.lib.js_number import JSNumber, JSNumberBoundsException
|
36
|
+
from streamlit.elements.lib.policies import (
|
37
|
+
check_widget_policies,
|
38
|
+
maybe_raise_label_warnings,
|
39
|
+
)
|
40
|
+
from streamlit.elements.lib.utils import (
|
41
|
+
Key,
|
42
|
+
LabelVisibility,
|
43
|
+
compute_and_register_element_id,
|
44
|
+
get_label_visibility_proto_value,
|
45
|
+
to_key,
|
46
|
+
)
|
47
|
+
from streamlit.errors import (
|
48
|
+
StreamlitAPIException,
|
49
|
+
StreamlitValueAboveMaxError,
|
50
|
+
StreamlitValueBelowMinError,
|
51
|
+
)
|
52
|
+
from streamlit.proto.Slider_pb2 import Slider as SliderProto
|
53
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
54
|
+
from streamlit.runtime.scriptrunner import ScriptRunContext, get_script_run_ctx
|
55
|
+
from streamlit.runtime.state import (
|
56
|
+
WidgetArgs,
|
57
|
+
WidgetCallback,
|
58
|
+
WidgetKwargs,
|
59
|
+
get_session_state,
|
60
|
+
register_widget,
|
61
|
+
)
|
62
|
+
|
63
|
+
if TYPE_CHECKING:
|
64
|
+
from streamlit.delta_generator import DeltaGenerator
|
65
|
+
|
66
|
+
SliderNumericT = TypeVar("SliderNumericT", int, float)
|
67
|
+
SliderDatelikeT = TypeVar("SliderDatelikeT", date, time, datetime)
|
68
|
+
|
69
|
+
SliderNumericSpanT: TypeAlias = Union[
|
70
|
+
list[SliderNumericT],
|
71
|
+
tuple[()],
|
72
|
+
tuple[SliderNumericT],
|
73
|
+
tuple[SliderNumericT, SliderNumericT],
|
74
|
+
]
|
75
|
+
SliderDatelikeSpanT: TypeAlias = Union[
|
76
|
+
list[SliderDatelikeT],
|
77
|
+
tuple[()],
|
78
|
+
tuple[SliderDatelikeT],
|
79
|
+
tuple[SliderDatelikeT, SliderDatelikeT],
|
80
|
+
]
|
81
|
+
|
82
|
+
StepNumericT: TypeAlias = SliderNumericT
|
83
|
+
StepDatelikeT: TypeAlias = timedelta
|
84
|
+
|
85
|
+
SliderStep = Union[int, float, timedelta]
|
86
|
+
SliderScalar = Union[int, float, date, time, datetime]
|
87
|
+
SliderValueT = TypeVar("SliderValueT", int, float, date, time, datetime)
|
88
|
+
SliderValueGeneric: TypeAlias = Union[
|
89
|
+
SliderValueT,
|
90
|
+
Sequence[SliderValueT],
|
91
|
+
]
|
92
|
+
SliderValue: TypeAlias = Union[
|
93
|
+
SliderValueGeneric[int],
|
94
|
+
SliderValueGeneric[float],
|
95
|
+
SliderValueGeneric[date],
|
96
|
+
SliderValueGeneric[time],
|
97
|
+
SliderValueGeneric[datetime],
|
98
|
+
]
|
99
|
+
SliderReturnGeneric: TypeAlias = Union[
|
100
|
+
SliderValueT,
|
101
|
+
tuple[SliderValueT],
|
102
|
+
tuple[SliderValueT, SliderValueT],
|
103
|
+
]
|
104
|
+
SliderReturn: TypeAlias = Union[
|
105
|
+
SliderReturnGeneric[int],
|
106
|
+
SliderReturnGeneric[float],
|
107
|
+
SliderReturnGeneric[date],
|
108
|
+
SliderReturnGeneric[time],
|
109
|
+
SliderReturnGeneric[datetime],
|
110
|
+
]
|
111
|
+
|
112
|
+
SECONDS_TO_MICROS: Final = 1000 * 1000
|
113
|
+
DAYS_TO_MICROS: Final = 24 * 60 * 60 * SECONDS_TO_MICROS
|
114
|
+
|
115
|
+
UTC_EPOCH: Final = datetime(1970, 1, 1, tzinfo=timezone.utc)
|
116
|
+
|
117
|
+
|
118
|
+
def _time_to_datetime(time_: time) -> datetime:
|
119
|
+
# Note, here we pick an arbitrary date well after Unix epoch.
|
120
|
+
# This prevents pre-epoch timezone issues (https://bugs.python.org/issue36759)
|
121
|
+
# We're dropping the date from datetime later, anyway.
|
122
|
+
return datetime.combine(date(2000, 1, 1), time_)
|
123
|
+
|
124
|
+
|
125
|
+
def _date_to_datetime(date_: date) -> datetime:
|
126
|
+
return datetime.combine(date_, time())
|
127
|
+
|
128
|
+
|
129
|
+
def _delta_to_micros(delta: timedelta) -> int:
|
130
|
+
return (
|
131
|
+
delta.microseconds
|
132
|
+
+ delta.seconds * SECONDS_TO_MICROS
|
133
|
+
+ delta.days * DAYS_TO_MICROS
|
134
|
+
)
|
135
|
+
|
136
|
+
|
137
|
+
def _datetime_to_micros(dt: datetime) -> int:
|
138
|
+
# The frontend is not aware of timezones and only expects a UTC-based
|
139
|
+
# timestamp (in microseconds). Since we want to show the date/time exactly
|
140
|
+
# as it is in the given datetime object, we just set the tzinfo to UTC and
|
141
|
+
# do not do any timezone conversions. Only the backend knows about
|
142
|
+
# original timezone and will replace the UTC timestamp in the deserialization.
|
143
|
+
utc_dt = dt.replace(tzinfo=timezone.utc)
|
144
|
+
return _delta_to_micros(utc_dt - UTC_EPOCH)
|
145
|
+
|
146
|
+
|
147
|
+
def _micros_to_datetime(micros: int, orig_tz: tzinfo | None) -> datetime:
|
148
|
+
"""Restore times/datetimes to original timezone (dates are always naive)"""
|
149
|
+
utc_dt = UTC_EPOCH + timedelta(microseconds=micros)
|
150
|
+
# Add the original timezone. No conversion is required here,
|
151
|
+
# since in the serialization, we also just replace the timestamp with UTC.
|
152
|
+
return utc_dt.replace(tzinfo=orig_tz)
|
153
|
+
|
154
|
+
|
155
|
+
@dataclass
|
156
|
+
class SliderSerde:
|
157
|
+
value: list[float]
|
158
|
+
data_type: int
|
159
|
+
single_value: bool
|
160
|
+
orig_tz: tzinfo | None
|
161
|
+
|
162
|
+
def deserialize_single_value(self, value: float):
|
163
|
+
if self.data_type == SliderProto.INT:
|
164
|
+
return int(value)
|
165
|
+
if self.data_type == SliderProto.DATETIME:
|
166
|
+
return _micros_to_datetime(int(value), self.orig_tz)
|
167
|
+
if self.data_type == SliderProto.DATE:
|
168
|
+
return _micros_to_datetime(int(value), self.orig_tz).date()
|
169
|
+
if self.data_type == SliderProto.TIME:
|
170
|
+
return (
|
171
|
+
_micros_to_datetime(int(value), self.orig_tz)
|
172
|
+
.time()
|
173
|
+
.replace(tzinfo=self.orig_tz)
|
174
|
+
)
|
175
|
+
return value
|
176
|
+
|
177
|
+
def deserialize(self, ui_value: list[float] | None, widget_id: str = ""):
|
178
|
+
if ui_value is not None:
|
179
|
+
val = ui_value
|
180
|
+
else:
|
181
|
+
# Widget has not been used; fallback to the original value,
|
182
|
+
val = self.value
|
183
|
+
|
184
|
+
# The widget always returns a float array, so fix the return type if necessary
|
185
|
+
val = [self.deserialize_single_value(v) for v in val]
|
186
|
+
return val[0] if self.single_value else tuple(val)
|
187
|
+
|
188
|
+
def serialize(self, v: Any) -> list[Any]:
|
189
|
+
range_value = isinstance(v, (list, tuple))
|
190
|
+
value = list(v) if range_value else [v]
|
191
|
+
if self.data_type == SliderProto.DATE:
|
192
|
+
value = [_datetime_to_micros(_date_to_datetime(v)) for v in value]
|
193
|
+
if self.data_type == SliderProto.TIME:
|
194
|
+
value = [_datetime_to_micros(_time_to_datetime(v)) for v in value]
|
195
|
+
if self.data_type == SliderProto.DATETIME:
|
196
|
+
value = [_datetime_to_micros(v) for v in value]
|
197
|
+
return value
|
198
|
+
|
199
|
+
|
200
|
+
class SliderMixin:
|
201
|
+
# For easier readability, all the arguments with un-changing types across these overload signatures have been
|
202
|
+
# collapsed onto a single line.
|
203
|
+
|
204
|
+
# fmt: off
|
205
|
+
# If min/max/value/step are not provided, then we return an int.
|
206
|
+
# if ONLY step is provided, then it must be an int and we return an int.
|
207
|
+
@overload
|
208
|
+
def slider(
|
209
|
+
self,
|
210
|
+
label: str,
|
211
|
+
min_value: None = None,
|
212
|
+
max_value: None = None,
|
213
|
+
value: None = None,
|
214
|
+
step: int | None = None,
|
215
|
+
format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, *, disabled: bool = False, label_visibility: LabelVisibility = "visible"
|
216
|
+
) -> int:
|
217
|
+
...
|
218
|
+
|
219
|
+
# If min-value or max_value is provided and a numeric type, and value (if provided)
|
220
|
+
# is a singular numeric, return the same numeric type.
|
221
|
+
@overload
|
222
|
+
def slider(
|
223
|
+
self,
|
224
|
+
label: str,
|
225
|
+
min_value: SliderNumericT | None = None,
|
226
|
+
max_value: SliderNumericT | None = None,
|
227
|
+
value: SliderNumericT | None = None,
|
228
|
+
step: StepNumericT[SliderNumericT] | None = None,
|
229
|
+
format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, *, disabled: bool = False, label_visibility: LabelVisibility = "visible"
|
230
|
+
) -> SliderNumericT:
|
231
|
+
...
|
232
|
+
|
233
|
+
# If value is provided and a sequence of numeric type,
|
234
|
+
# return a tuple of the same numeric type.
|
235
|
+
@overload
|
236
|
+
def slider(
|
237
|
+
self,
|
238
|
+
label: str,
|
239
|
+
min_value: SliderNumericT | None = None,
|
240
|
+
max_value: SliderNumericT | None = None,
|
241
|
+
*,
|
242
|
+
value: SliderNumericSpanT[SliderNumericT],
|
243
|
+
step: StepNumericT[SliderNumericT] | None = None,
|
244
|
+
format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, disabled: bool = False, label_visibility: LabelVisibility = "visible"
|
245
|
+
) -> tuple[SliderNumericT, SliderNumericT]:
|
246
|
+
...
|
247
|
+
|
248
|
+
# If value is provided positionally and a sequence of numeric type,
|
249
|
+
# return a tuple of the same numeric type.
|
250
|
+
@overload
|
251
|
+
def slider(
|
252
|
+
self,
|
253
|
+
label: str,
|
254
|
+
min_value: SliderNumericT,
|
255
|
+
max_value: SliderNumericT,
|
256
|
+
value: SliderNumericSpanT[SliderNumericT],
|
257
|
+
/,
|
258
|
+
step: StepNumericT[SliderNumericT] | None = None,
|
259
|
+
format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, *, disabled: bool = False, label_visibility: LabelVisibility = "visible"
|
260
|
+
) -> tuple[SliderNumericT, SliderNumericT]:
|
261
|
+
...
|
262
|
+
|
263
|
+
# If min-value is provided and a datelike type, and value (if provided)
|
264
|
+
# is a singular datelike, return the same datelike type.
|
265
|
+
@overload
|
266
|
+
def slider(
|
267
|
+
self,
|
268
|
+
label: str,
|
269
|
+
min_value: SliderDatelikeT,
|
270
|
+
max_value: SliderDatelikeT | None = None,
|
271
|
+
value: SliderDatelikeT | None = None,
|
272
|
+
step: StepDatelikeT | None = None,
|
273
|
+
format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, *, disabled: bool = False, label_visibility: LabelVisibility = "visible"
|
274
|
+
) -> SliderDatelikeT:
|
275
|
+
...
|
276
|
+
|
277
|
+
# If max-value is provided and a datelike type, and value (if provided)
|
278
|
+
# is a singular datelike, return the same datelike type.
|
279
|
+
@overload
|
280
|
+
def slider(
|
281
|
+
self,
|
282
|
+
label: str,
|
283
|
+
min_value: SliderDatelikeT | None = None,
|
284
|
+
*,
|
285
|
+
max_value: SliderDatelikeT,
|
286
|
+
value: SliderDatelikeT | None = None,
|
287
|
+
step: StepDatelikeT | None = None,
|
288
|
+
format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, disabled: bool = False, label_visibility: LabelVisibility = "visible"
|
289
|
+
) -> SliderDatelikeT:
|
290
|
+
...
|
291
|
+
|
292
|
+
# If value is provided and a datelike type, return the same datelike type.
|
293
|
+
@overload
|
294
|
+
def slider(
|
295
|
+
self,
|
296
|
+
label: str,
|
297
|
+
min_value: SliderDatelikeT | None = None,
|
298
|
+
max_value: SliderDatelikeT | None = None,
|
299
|
+
*,
|
300
|
+
value: SliderDatelikeT,
|
301
|
+
step: StepDatelikeT | None = None,
|
302
|
+
format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, disabled: bool = False, label_visibility: LabelVisibility = "visible"
|
303
|
+
) -> SliderDatelikeT:
|
304
|
+
...
|
305
|
+
|
306
|
+
# If value is provided and a sequence of datelike type,
|
307
|
+
# return a tuple of the same datelike type.
|
308
|
+
@overload
|
309
|
+
def slider(
|
310
|
+
self,
|
311
|
+
label: str,
|
312
|
+
min_value: SliderDatelikeT | None = None,
|
313
|
+
max_value: SliderDatelikeT | None = None,
|
314
|
+
*,
|
315
|
+
value: SliderDatelikeSpanT[SliderDatelikeT],
|
316
|
+
step: StepDatelikeT | None = None,
|
317
|
+
format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, disabled: bool = False, label_visibility: LabelVisibility = "visible"
|
318
|
+
) -> tuple[SliderDatelikeT, SliderDatelikeT]:
|
319
|
+
...
|
320
|
+
|
321
|
+
# If value is provided positionally and a sequence of datelike type,
|
322
|
+
# return a tuple of the same datelike type.
|
323
|
+
@overload
|
324
|
+
def slider(
|
325
|
+
self,
|
326
|
+
label: str,
|
327
|
+
min_value: SliderDatelikeT,
|
328
|
+
max_value: SliderDatelikeT,
|
329
|
+
value: SliderDatelikeSpanT[SliderDatelikeT],
|
330
|
+
/,
|
331
|
+
step: StepDatelikeT | None = None,
|
332
|
+
format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, *, disabled: bool = False, label_visibility: LabelVisibility = "visible"
|
333
|
+
) -> tuple[SliderDatelikeT, SliderDatelikeT]:
|
334
|
+
...
|
335
|
+
|
336
|
+
# fmt: on
|
337
|
+
|
338
|
+
# https://github.com/python/mypy/issues/17614
|
339
|
+
@gather_metrics("slider") # type: ignore[misc]
|
340
|
+
def slider(
|
341
|
+
self,
|
342
|
+
label: str,
|
343
|
+
min_value: SliderScalar | None = None,
|
344
|
+
max_value: SliderScalar | None = None,
|
345
|
+
value: SliderValue | None = None,
|
346
|
+
step: SliderStep | None = None,
|
347
|
+
format: str | None = None,
|
348
|
+
key: Key | None = None,
|
349
|
+
help: str | None = None,
|
350
|
+
on_change: WidgetCallback | None = None,
|
351
|
+
args: WidgetArgs | None = None,
|
352
|
+
kwargs: WidgetKwargs | None = None,
|
353
|
+
*, # keyword-only arguments:
|
354
|
+
disabled: bool = False,
|
355
|
+
label_visibility: LabelVisibility = "visible",
|
356
|
+
) -> Any:
|
357
|
+
r"""Display a slider widget.
|
358
|
+
|
359
|
+
This supports int, float, date, time, and datetime types.
|
360
|
+
|
361
|
+
This also allows you to render a range slider by passing a two-element
|
362
|
+
tuple or list as the ``value``.
|
363
|
+
|
364
|
+
The difference between ``st.slider`` and ``st.select_slider`` is that
|
365
|
+
``slider`` only accepts numerical or date/time data and takes a range as
|
366
|
+
input, while ``select_slider`` accepts any datatype and takes an iterable
|
367
|
+
set of options.
|
368
|
+
|
369
|
+
.. note::
|
370
|
+
Integer values exceeding +/- ``(1<<53) - 1`` cannot be accurately
|
371
|
+
stored or returned by the widget due to serialization contstraints
|
372
|
+
between the Python server and JavaScript client. You must handle
|
373
|
+
such numbers as floats, leading to a loss in precision.
|
374
|
+
|
375
|
+
Parameters
|
376
|
+
----------
|
377
|
+
label : str
|
378
|
+
A short label explaining to the user what this slider is for.
|
379
|
+
The label can optionally contain GitHub-flavored Markdown of the
|
380
|
+
following types: Bold, Italics, Strikethroughs, Inline Code, Links,
|
381
|
+
and Images. Images display like icons, with a max height equal to
|
382
|
+
the font height.
|
383
|
+
|
384
|
+
Unsupported Markdown elements are unwrapped so only their children
|
385
|
+
(text contents) render. Display unsupported elements as literal
|
386
|
+
characters by backslash-escaping them. E.g.,
|
387
|
+
``"1\. Not an ordered list"``.
|
388
|
+
|
389
|
+
See the ``body`` parameter of |st.markdown|_ for additional,
|
390
|
+
supported Markdown directives.
|
391
|
+
|
392
|
+
For accessibility reasons, you should never set an empty label, but
|
393
|
+
you can hide it with ``label_visibility`` if needed. In the future,
|
394
|
+
we may disallow empty labels by raising an exception.
|
395
|
+
|
396
|
+
.. |st.markdown| replace:: ``st.markdown``
|
397
|
+
.. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown
|
398
|
+
|
399
|
+
min_value : a supported type or None
|
400
|
+
The minimum permitted value.
|
401
|
+
Defaults to 0 if the value is an int, 0.0 if a float,
|
402
|
+
value - timedelta(days=14) if a date/datetime, time.min if a time
|
403
|
+
|
404
|
+
max_value : a supported type or None
|
405
|
+
The maximum permitted value.
|
406
|
+
Defaults to 100 if the value is an int, 1.0 if a float,
|
407
|
+
value + timedelta(days=14) if a date/datetime, time.max if a time
|
408
|
+
|
409
|
+
value : a supported type or a tuple/list of supported types or None
|
410
|
+
The value of the slider when it first renders. If a tuple/list
|
411
|
+
of two values is passed here, then a range slider with those lower
|
412
|
+
and upper bounds is rendered. For example, if set to `(1, 10)` the
|
413
|
+
slider will have a selectable range between 1 and 10.
|
414
|
+
Defaults to min_value.
|
415
|
+
|
416
|
+
step : int, float, timedelta, or None
|
417
|
+
The stepping interval.
|
418
|
+
Defaults to 1 if the value is an int, 0.01 if a float,
|
419
|
+
timedelta(days=1) if a date/datetime, timedelta(minutes=15) if a time
|
420
|
+
(or if max_value - min_value < 1 day)
|
421
|
+
|
422
|
+
format : str or None
|
423
|
+
A printf-style format string controlling how the interface should
|
424
|
+
display numbers. This does not impact the return value.
|
425
|
+
|
426
|
+
For information about formatting integers and floats, see
|
427
|
+
`sprintf.js
|
428
|
+
<https://github.com/alexei/sprintf.js?tab=readme-ov-file#format-specification>`_.
|
429
|
+
For example, ``format="%0.1f"`` adjusts the displayed decimal
|
430
|
+
precision to only show one digit after the decimal.
|
431
|
+
|
432
|
+
For information about formatting datetimes, dates, and times, see
|
433
|
+
`momentJS <https://momentjs.com/docs/#/displaying/format/>`_.
|
434
|
+
For example, ``format="ddd ha"`` adjusts the displayed datetime to
|
435
|
+
show the day of the week and the hour ("Tue 8pm").
|
436
|
+
|
437
|
+
key : str or int
|
438
|
+
An optional string or integer to use as the unique key for the widget.
|
439
|
+
If this is omitted, a key will be generated for the widget
|
440
|
+
based on its content. No two widgets may have the same key.
|
441
|
+
|
442
|
+
help : str or None
|
443
|
+
A tooltip that gets displayed next to the widget label. Streamlit
|
444
|
+
only displays the tooltip when ``label_visibility="visible"``. If
|
445
|
+
this is ``None`` (default), no tooltip is displayed.
|
446
|
+
|
447
|
+
The tooltip can optionally contain GitHub-flavored Markdown,
|
448
|
+
including the Markdown directives described in the ``body``
|
449
|
+
parameter of ``st.markdown``.
|
450
|
+
|
451
|
+
on_change : callable
|
452
|
+
An optional callback invoked when this slider's value changes.
|
453
|
+
|
454
|
+
args : tuple
|
455
|
+
An optional tuple of args to pass to the callback.
|
456
|
+
|
457
|
+
kwargs : dict
|
458
|
+
An optional dict of kwargs to pass to the callback.
|
459
|
+
|
460
|
+
disabled : bool
|
461
|
+
An optional boolean that disables the slider if set to ``True``.
|
462
|
+
The default is ``False``.
|
463
|
+
|
464
|
+
label_visibility : "visible", "hidden", or "collapsed"
|
465
|
+
The visibility of the label. The default is ``"visible"``. If this
|
466
|
+
is ``"hidden"``, Streamlit displays an empty spacer instead of the
|
467
|
+
label, which can help keep the widget alligned with other widgets.
|
468
|
+
If this is ``"collapsed"``, Streamlit displays no label or spacer.
|
469
|
+
|
470
|
+
|
471
|
+
Returns
|
472
|
+
-------
|
473
|
+
int/float/date/time/datetime or tuple of int/float/date/time/datetime
|
474
|
+
The current value of the slider widget. The return type will match
|
475
|
+
the data type of the value parameter.
|
476
|
+
|
477
|
+
Examples
|
478
|
+
--------
|
479
|
+
>>> import streamlit as st
|
480
|
+
>>>
|
481
|
+
>>> age = st.slider("How old are you?", 0, 130, 25)
|
482
|
+
>>> st.write("I'm ", age, "years old")
|
483
|
+
|
484
|
+
And here's an example of a range slider:
|
485
|
+
|
486
|
+
>>> import streamlit as st
|
487
|
+
>>>
|
488
|
+
>>> values = st.slider("Select a range of values", 0.0, 100.0, (25.0, 75.0))
|
489
|
+
>>> st.write("Values:", values)
|
490
|
+
|
491
|
+
This is a range time slider:
|
492
|
+
|
493
|
+
>>> import streamlit as st
|
494
|
+
>>> from datetime import time
|
495
|
+
>>>
|
496
|
+
>>> appointment = st.slider(
|
497
|
+
... "Schedule your appointment:", value=(time(11, 30), time(12, 45))
|
498
|
+
... )
|
499
|
+
>>> st.write("You're scheduled for:", appointment)
|
500
|
+
|
501
|
+
Finally, a datetime slider:
|
502
|
+
|
503
|
+
>>> import streamlit as st
|
504
|
+
>>> from datetime import datetime
|
505
|
+
>>>
|
506
|
+
>>> start_time = st.slider(
|
507
|
+
... "When do you start?",
|
508
|
+
... value=datetime(2020, 1, 1, 9, 30),
|
509
|
+
... format="MM/DD/YY - hh:mm",
|
510
|
+
... )
|
511
|
+
>>> st.write("Start time:", start_time)
|
512
|
+
|
513
|
+
.. output::
|
514
|
+
https://doc-slider.streamlit.app/
|
515
|
+
height: 300px
|
516
|
+
|
517
|
+
"""
|
518
|
+
ctx = get_script_run_ctx()
|
519
|
+
return self._slider(
|
520
|
+
label=label,
|
521
|
+
min_value=min_value,
|
522
|
+
max_value=max_value,
|
523
|
+
value=value,
|
524
|
+
step=step,
|
525
|
+
format=format,
|
526
|
+
key=key,
|
527
|
+
help=help,
|
528
|
+
on_change=on_change,
|
529
|
+
args=args,
|
530
|
+
kwargs=kwargs,
|
531
|
+
disabled=disabled,
|
532
|
+
label_visibility=label_visibility,
|
533
|
+
ctx=ctx,
|
534
|
+
)
|
535
|
+
|
536
|
+
def _slider(
|
537
|
+
self,
|
538
|
+
label: str,
|
539
|
+
min_value=None,
|
540
|
+
max_value=None,
|
541
|
+
value=None,
|
542
|
+
step=None,
|
543
|
+
format: str | None = None,
|
544
|
+
key: Key | None = None,
|
545
|
+
help: str | None = None,
|
546
|
+
on_change: WidgetCallback | None = None,
|
547
|
+
args: WidgetArgs | None = None,
|
548
|
+
kwargs: WidgetKwargs | None = None,
|
549
|
+
*, # keyword-only arguments:
|
550
|
+
disabled: bool = False,
|
551
|
+
label_visibility: LabelVisibility = "visible",
|
552
|
+
ctx: ScriptRunContext | None = None,
|
553
|
+
) -> SliderReturn:
|
554
|
+
key = to_key(key)
|
555
|
+
|
556
|
+
check_widget_policies(
|
557
|
+
self.dg,
|
558
|
+
key,
|
559
|
+
on_change,
|
560
|
+
default_value=value,
|
561
|
+
)
|
562
|
+
maybe_raise_label_warnings(label, label_visibility)
|
563
|
+
|
564
|
+
element_id = compute_and_register_element_id(
|
565
|
+
"slider",
|
566
|
+
user_key=key,
|
567
|
+
form_id=current_form_id(self.dg),
|
568
|
+
label=label,
|
569
|
+
min_value=min_value,
|
570
|
+
max_value=max_value,
|
571
|
+
value=value,
|
572
|
+
step=step,
|
573
|
+
format=format,
|
574
|
+
help=help,
|
575
|
+
)
|
576
|
+
|
577
|
+
SUPPORTED_TYPES = {
|
578
|
+
Integral: SliderProto.INT,
|
579
|
+
Real: SliderProto.FLOAT,
|
580
|
+
datetime: SliderProto.DATETIME,
|
581
|
+
date: SliderProto.DATE,
|
582
|
+
time: SliderProto.TIME,
|
583
|
+
}
|
584
|
+
TIMELIKE_TYPES = (SliderProto.DATETIME, SliderProto.TIME, SliderProto.DATE)
|
585
|
+
|
586
|
+
if value is None:
|
587
|
+
# We need to know if this is a single or range slider, but don't have
|
588
|
+
# a default value, so we check if session_state can tell us.
|
589
|
+
# We already calcluated the id, so there is no risk of this causing
|
590
|
+
# the id to change.
|
591
|
+
|
592
|
+
single_value = True
|
593
|
+
|
594
|
+
session_state = get_session_state().filtered_state
|
595
|
+
|
596
|
+
if key is not None and key in session_state:
|
597
|
+
state_value = session_state[key]
|
598
|
+
single_value = isinstance(state_value, tuple(SUPPORTED_TYPES.keys()))
|
599
|
+
|
600
|
+
if single_value:
|
601
|
+
value = min_value if min_value is not None else 0
|
602
|
+
else:
|
603
|
+
mn = min_value if min_value is not None else 0
|
604
|
+
mx = max_value if max_value is not None else 100
|
605
|
+
value = [mn, mx]
|
606
|
+
|
607
|
+
# Ensure that the value is either a single value or a range of values.
|
608
|
+
single_value = isinstance(value, tuple(SUPPORTED_TYPES.keys()))
|
609
|
+
range_value = isinstance(value, (list, tuple)) and len(value) in (0, 1, 2)
|
610
|
+
if not single_value and not range_value:
|
611
|
+
raise StreamlitAPIException(
|
612
|
+
"Slider value should either be an int/float/datetime or a list/tuple of "
|
613
|
+
"0 to 2 ints/floats/datetimes"
|
614
|
+
)
|
615
|
+
|
616
|
+
# Simplify future logic by always making value a list
|
617
|
+
if single_value:
|
618
|
+
value = [value]
|
619
|
+
|
620
|
+
def value_to_generic_type(v):
|
621
|
+
if isinstance(v, Integral):
|
622
|
+
return SUPPORTED_TYPES[Integral]
|
623
|
+
elif isinstance(v, Real):
|
624
|
+
return SUPPORTED_TYPES[Real]
|
625
|
+
else:
|
626
|
+
return SUPPORTED_TYPES[type(v)]
|
627
|
+
|
628
|
+
def all_same_type(items):
|
629
|
+
return len(set(map(value_to_generic_type, items))) < 2
|
630
|
+
|
631
|
+
if not all_same_type(value):
|
632
|
+
raise StreamlitAPIException(
|
633
|
+
"Slider tuple/list components must be of the same type.\n"
|
634
|
+
f"But were: {list(map(type, value))}"
|
635
|
+
)
|
636
|
+
|
637
|
+
if len(value) == 0:
|
638
|
+
data_type = SliderProto.INT
|
639
|
+
else:
|
640
|
+
data_type = value_to_generic_type(value[0])
|
641
|
+
|
642
|
+
datetime_min = time.min
|
643
|
+
datetime_max = time.max
|
644
|
+
if data_type == SliderProto.TIME:
|
645
|
+
datetime_min = time.min.replace(tzinfo=value[0].tzinfo)
|
646
|
+
datetime_max = time.max.replace(tzinfo=value[0].tzinfo)
|
647
|
+
if data_type in (SliderProto.DATETIME, SliderProto.DATE):
|
648
|
+
datetime_min = value[0] - timedelta(days=14)
|
649
|
+
datetime_max = value[0] + timedelta(days=14)
|
650
|
+
|
651
|
+
DEFAULTS = {
|
652
|
+
SliderProto.INT: {
|
653
|
+
"min_value": 0,
|
654
|
+
"max_value": 100,
|
655
|
+
"step": 1,
|
656
|
+
"format": "%d",
|
657
|
+
},
|
658
|
+
SliderProto.FLOAT: {
|
659
|
+
"min_value": 0.0,
|
660
|
+
"max_value": 1.0,
|
661
|
+
"step": 0.01,
|
662
|
+
"format": "%0.2f",
|
663
|
+
},
|
664
|
+
SliderProto.DATETIME: {
|
665
|
+
"min_value": datetime_min,
|
666
|
+
"max_value": datetime_max,
|
667
|
+
"step": timedelta(days=1),
|
668
|
+
"format": "YYYY-MM-DD",
|
669
|
+
},
|
670
|
+
SliderProto.DATE: {
|
671
|
+
"min_value": datetime_min,
|
672
|
+
"max_value": datetime_max,
|
673
|
+
"step": timedelta(days=1),
|
674
|
+
"format": "YYYY-MM-DD",
|
675
|
+
},
|
676
|
+
SliderProto.TIME: {
|
677
|
+
"min_value": datetime_min,
|
678
|
+
"max_value": datetime_max,
|
679
|
+
"step": timedelta(minutes=15),
|
680
|
+
"format": "HH:mm",
|
681
|
+
},
|
682
|
+
}
|
683
|
+
|
684
|
+
if min_value is None:
|
685
|
+
min_value = DEFAULTS[data_type]["min_value"]
|
686
|
+
if max_value is None:
|
687
|
+
max_value = DEFAULTS[data_type]["max_value"]
|
688
|
+
if step is None:
|
689
|
+
step = DEFAULTS[data_type]["step"]
|
690
|
+
if data_type in (
|
691
|
+
SliderProto.DATETIME,
|
692
|
+
SliderProto.DATE,
|
693
|
+
) and max_value - min_value < timedelta(days=1):
|
694
|
+
step = timedelta(minutes=15)
|
695
|
+
if format is None:
|
696
|
+
format = cast(str, DEFAULTS[data_type]["format"])
|
697
|
+
|
698
|
+
if step == 0:
|
699
|
+
raise StreamlitAPIException(
|
700
|
+
"Slider components cannot be passed a `step` of 0."
|
701
|
+
)
|
702
|
+
|
703
|
+
# Ensure that all arguments are of the same type.
|
704
|
+
slider_args = [min_value, max_value, step]
|
705
|
+
int_args = all(isinstance(a, Integral) for a in slider_args)
|
706
|
+
float_args = all(
|
707
|
+
isinstance(a, Real) and not isinstance(a, Integral) for a in slider_args
|
708
|
+
)
|
709
|
+
# When min and max_value are the same timelike, step should be a timedelta
|
710
|
+
timelike_args = (
|
711
|
+
data_type in TIMELIKE_TYPES
|
712
|
+
and isinstance(step, timedelta)
|
713
|
+
and type(min_value) is type(max_value)
|
714
|
+
)
|
715
|
+
|
716
|
+
if not int_args and not float_args and not timelike_args:
|
717
|
+
raise StreamlitAPIException(
|
718
|
+
"Slider value arguments must be of matching types."
|
719
|
+
"\n`min_value` has %(min_type)s type."
|
720
|
+
"\n`max_value` has %(max_type)s type."
|
721
|
+
"\n`step` has %(step)s type."
|
722
|
+
% {
|
723
|
+
"min_type": type(min_value).__name__,
|
724
|
+
"max_type": type(max_value).__name__,
|
725
|
+
"step": type(step).__name__,
|
726
|
+
}
|
727
|
+
)
|
728
|
+
|
729
|
+
# Ensure that the value matches arguments' types.
|
730
|
+
all_ints = data_type == SliderProto.INT and int_args
|
731
|
+
all_floats = data_type == SliderProto.FLOAT and float_args
|
732
|
+
all_timelikes = data_type in TIMELIKE_TYPES and timelike_args
|
733
|
+
|
734
|
+
if not all_ints and not all_floats and not all_timelikes:
|
735
|
+
raise StreamlitAPIException(
|
736
|
+
"Both value and arguments must be of the same type."
|
737
|
+
"\n`value` has %(value_type)s type."
|
738
|
+
"\n`min_value` has %(min_type)s type."
|
739
|
+
"\n`max_value` has %(max_type)s type."
|
740
|
+
% {
|
741
|
+
"value_type": type(value).__name__,
|
742
|
+
"min_type": type(min_value).__name__,
|
743
|
+
"max_type": type(max_value).__name__,
|
744
|
+
}
|
745
|
+
)
|
746
|
+
|
747
|
+
# Ensure that min <= value(s) <= max, adjusting the bounds as necessary.
|
748
|
+
min_value = min(min_value, max_value)
|
749
|
+
max_value = max(min_value, max_value)
|
750
|
+
if len(value) == 1:
|
751
|
+
min_value = min(value[0], min_value)
|
752
|
+
max_value = max(value[0], max_value)
|
753
|
+
elif len(value) == 2:
|
754
|
+
start, end = value
|
755
|
+
if start > end:
|
756
|
+
# Swap start and end, since they seem reversed
|
757
|
+
start, end = end, start
|
758
|
+
value = start, end
|
759
|
+
min_value = min(start, min_value)
|
760
|
+
max_value = max(end, max_value)
|
761
|
+
else:
|
762
|
+
# Empty list, so let's just use the outer bounds
|
763
|
+
value = [min_value, max_value]
|
764
|
+
|
765
|
+
# Bounds checks. JSNumber produces human-readable exceptions that
|
766
|
+
# we simply re-package as StreamlitAPIExceptions.
|
767
|
+
# (We check `min_value` and `max_value` here; `value` and `step` are
|
768
|
+
# already known to be in the [min_value, max_value] range.)
|
769
|
+
try:
|
770
|
+
if all_ints:
|
771
|
+
JSNumber.validate_int_bounds(min_value, "`min_value`")
|
772
|
+
JSNumber.validate_int_bounds(max_value, "`max_value`")
|
773
|
+
elif all_floats:
|
774
|
+
JSNumber.validate_float_bounds(min_value, "`min_value`")
|
775
|
+
JSNumber.validate_float_bounds(max_value, "`max_value`")
|
776
|
+
elif all_timelikes:
|
777
|
+
# No validation yet. TODO: check between 0001-01-01 to 9999-12-31
|
778
|
+
pass
|
779
|
+
except JSNumberBoundsException as e:
|
780
|
+
raise StreamlitAPIException(str(e))
|
781
|
+
|
782
|
+
orig_tz = None
|
783
|
+
# Convert dates or times into datetimes
|
784
|
+
if data_type == SliderProto.TIME:
|
785
|
+
value = list(map(_time_to_datetime, value))
|
786
|
+
min_value = _time_to_datetime(min_value)
|
787
|
+
max_value = _time_to_datetime(max_value)
|
788
|
+
|
789
|
+
if data_type == SliderProto.DATE:
|
790
|
+
value = list(map(_date_to_datetime, value))
|
791
|
+
min_value = _date_to_datetime(min_value)
|
792
|
+
max_value = _date_to_datetime(max_value)
|
793
|
+
|
794
|
+
# The frontend will error if the values are equal, so checking here
|
795
|
+
# lets us produce a nicer python error message and stack trace.
|
796
|
+
if min_value == max_value:
|
797
|
+
raise StreamlitAPIException(
|
798
|
+
"Slider `min_value` must be less than the `max_value`."
|
799
|
+
f"\nThe values were {min_value} and {max_value}."
|
800
|
+
)
|
801
|
+
|
802
|
+
# Now, convert to microseconds (so we can serialize datetime to a long)
|
803
|
+
if data_type in TIMELIKE_TYPES:
|
804
|
+
# Restore times/datetimes to original timezone (dates are always naive)
|
805
|
+
orig_tz = (
|
806
|
+
value[0].tzinfo
|
807
|
+
if data_type in (SliderProto.TIME, SliderProto.DATETIME)
|
808
|
+
else None
|
809
|
+
)
|
810
|
+
|
811
|
+
value = list(map(_datetime_to_micros, value))
|
812
|
+
min_value = _datetime_to_micros(min_value)
|
813
|
+
max_value = _datetime_to_micros(max_value)
|
814
|
+
step = _delta_to_micros(cast(timedelta, step))
|
815
|
+
|
816
|
+
# It would be great if we could guess the number of decimal places from
|
817
|
+
# the `step` argument, but this would only be meaningful if step were a
|
818
|
+
# decimal. As a possible improvement we could make this function accept
|
819
|
+
# decimals and/or use some heuristics for floats.
|
820
|
+
|
821
|
+
slider_proto = SliderProto()
|
822
|
+
slider_proto.type = SliderProto.Type.SLIDER
|
823
|
+
slider_proto.id = element_id
|
824
|
+
slider_proto.label = label
|
825
|
+
slider_proto.format = format
|
826
|
+
slider_proto.default[:] = value
|
827
|
+
slider_proto.min = min_value
|
828
|
+
slider_proto.max = max_value
|
829
|
+
slider_proto.step = cast(float, step)
|
830
|
+
slider_proto.data_type = data_type
|
831
|
+
slider_proto.options[:] = []
|
832
|
+
slider_proto.form_id = current_form_id(self.dg)
|
833
|
+
slider_proto.disabled = disabled
|
834
|
+
slider_proto.label_visibility.value = get_label_visibility_proto_value(
|
835
|
+
label_visibility
|
836
|
+
)
|
837
|
+
|
838
|
+
if help is not None:
|
839
|
+
slider_proto.help = dedent(help)
|
840
|
+
|
841
|
+
serde = SliderSerde(value, data_type, single_value, orig_tz)
|
842
|
+
|
843
|
+
widget_state = register_widget(
|
844
|
+
slider_proto.id,
|
845
|
+
on_change_handler=on_change,
|
846
|
+
args=args,
|
847
|
+
kwargs=kwargs,
|
848
|
+
deserializer=serde.deserialize,
|
849
|
+
serializer=serde.serialize,
|
850
|
+
ctx=ctx,
|
851
|
+
value_type="double_array_value",
|
852
|
+
)
|
853
|
+
|
854
|
+
if widget_state.value_changed:
|
855
|
+
# Min/Max bounds checks when the value is updated.
|
856
|
+
serialized_values = serde.serialize(widget_state.value)
|
857
|
+
for value in serialized_values:
|
858
|
+
# Use the deserialized values for more readable error messages for dates/times
|
859
|
+
deserialized_value = serde.deserialize_single_value(value)
|
860
|
+
if value < slider_proto.min:
|
861
|
+
raise StreamlitValueBelowMinError(
|
862
|
+
value=deserialized_value,
|
863
|
+
min_value=serde.deserialize_single_value(slider_proto.min),
|
864
|
+
)
|
865
|
+
if value > slider_proto.max:
|
866
|
+
raise StreamlitValueAboveMaxError(
|
867
|
+
value=deserialized_value,
|
868
|
+
max_value=serde.deserialize_single_value(slider_proto.max),
|
869
|
+
)
|
870
|
+
|
871
|
+
slider_proto.value[:] = serialized_values
|
872
|
+
slider_proto.set_value = True
|
873
|
+
|
874
|
+
self.dg._enqueue("slider", slider_proto)
|
875
|
+
return cast(SliderReturn, widget_state.value)
|
876
|
+
|
877
|
+
@property
|
878
|
+
def dg(self) -> DeltaGenerator:
|
879
|
+
"""Get our DeltaGenerator."""
|
880
|
+
return cast("DeltaGenerator", self)
|