314 lines
9.6 KiB
Python
314 lines
9.6 KiB
Python
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
# isort: skip_file
|
|
# ruff: noqa: E402, A001
|
|
|
|
"""Streamlit.
|
|
|
|
How to use Streamlit in 3 seconds:
|
|
|
|
1. Write an app
|
|
>>> import streamlit as st
|
|
>>> st.write(anything_you_want)
|
|
|
|
2. Run your app
|
|
$ streamlit run my_script.py
|
|
|
|
3. Use your app
|
|
A new tab will open on your browser. That's your Streamlit app!
|
|
|
|
4. Modify your code, save it, and watch changes live on your browser.
|
|
|
|
Take a look at the other commands in this module to find out what else
|
|
Streamlit can do:
|
|
|
|
>>> dir(streamlit)
|
|
|
|
Or try running our "Hello World":
|
|
|
|
$ streamlit hello
|
|
|
|
For more detailed info, see https://docs.streamlit.io.
|
|
"""
|
|
|
|
# IMPORTANT: Prefix with an underscore anything that the user shouldn't see.
|
|
|
|
import os as _os
|
|
|
|
# Set Matplotlib backend to avoid a crash.
|
|
# The default Matplotlib backend crashes Python on OSX when run on a thread
|
|
# that's not the main thread, so here we set a safer backend as a fix.
|
|
# This fix is OS-independent. We didn't see a good reason to make this
|
|
# Mac-only. Consistency within Streamlit seemed more important.
|
|
# IMPORTANT: This needs to run on top of all imports before any other
|
|
# import of matplotlib could happen.
|
|
_os.environ["MPLBACKEND"] = "Agg"
|
|
|
|
|
|
# Must be at the top, to avoid circular dependency.
|
|
from streamlit import logger as _logger
|
|
from streamlit import config as _config
|
|
from streamlit.deprecation_util import deprecate_func_name as _deprecate_func_name
|
|
from streamlit.version import STREAMLIT_VERSION_STRING as _STREAMLIT_VERSION_STRING
|
|
|
|
# Give the package a version.
|
|
__version__ = _STREAMLIT_VERSION_STRING
|
|
|
|
# DeltaGenerator methods:
|
|
# We initialize them here so that it is clear where they are instantiated.
|
|
# Further, it helps us to break circular imports because the DeltaGenerator
|
|
# imports the different elements but some elements also require DeltaGenerator
|
|
# functions such as the dg_stack. Now, elements that require DeltaGenerator functions
|
|
# can import the singleton module.
|
|
from streamlit.delta_generator_singletons import (
|
|
DeltaGeneratorSingleton as _DeltaGeneratorSingleton,
|
|
)
|
|
from streamlit.delta_generator import DeltaGenerator as _DeltaGenerator
|
|
from streamlit.elements.lib.mutable_status_container import (
|
|
StatusContainer as _StatusContainer,
|
|
)
|
|
from streamlit.elements.lib.dialog import Dialog as _Dialog
|
|
|
|
# instantiate the DeltaGeneratorSingleton
|
|
_dg_singleton = _DeltaGeneratorSingleton(
|
|
delta_generator_cls=_DeltaGenerator,
|
|
status_container_cls=_StatusContainer,
|
|
dialog_container_cls=_Dialog,
|
|
)
|
|
_main = _dg_singleton._main_dg
|
|
sidebar = _dg_singleton._sidebar_dg
|
|
_event = _dg_singleton._event_dg
|
|
_bottom = _dg_singleton._bottom_dg
|
|
|
|
|
|
from streamlit.elements.dialog_decorator import (
|
|
dialog_decorator as _dialog_decorator,
|
|
experimental_dialog_decorator as _experimental_dialog_decorator,
|
|
)
|
|
from streamlit.runtime.caching import (
|
|
cache_resource as _cache_resource,
|
|
cache_data as _cache_data,
|
|
cache as _cache,
|
|
)
|
|
from streamlit.runtime.connection_factory import (
|
|
connection_factory as _connection,
|
|
)
|
|
from streamlit.runtime.fragment import (
|
|
experimental_fragment as _experimental_fragment,
|
|
fragment as _fragment,
|
|
)
|
|
from streamlit.runtime.metrics_util import gather_metrics as _gather_metrics
|
|
from streamlit.runtime.secrets import secrets_singleton as _secrets_singleton
|
|
from streamlit.runtime.context import ContextProxy as _ContextProxy
|
|
from streamlit.runtime.state import (
|
|
SessionStateProxy as _SessionStateProxy,
|
|
QueryParamsProxy as _QueryParamsProxy,
|
|
)
|
|
from streamlit.user_info import (
|
|
UserInfoProxy as _UserInfoProxy,
|
|
DeprecatedUserInfoProxy as _DeprecatedUserInfoProxy,
|
|
login as _login,
|
|
logout as _logout,
|
|
)
|
|
from streamlit.commands.experimental_query_params import (
|
|
get_query_params as _get_query_params,
|
|
set_query_params as _set_query_params,
|
|
)
|
|
|
|
import streamlit.column_config as _column_config
|
|
|
|
# Modules that the user should have access to. These are imported with the "as" syntax
|
|
# and the same name; note that renaming the import with "as" does not make it an
|
|
# explicit export. In this case, you should import it with an underscore to make clear
|
|
# that it is internal and then assign it to a variable with the new intended name.
|
|
# You can check the export behavior by running 'mypy --strict example_app.py', which
|
|
# disables implicit_reexport, where you use the respective command in the example_app.py
|
|
# Streamlit app.
|
|
|
|
from streamlit.commands.echo import echo as echo
|
|
from streamlit.commands.logo import logo as logo
|
|
from streamlit.commands.navigation import navigation as navigation
|
|
from streamlit.navigation.page import Page as Page
|
|
from streamlit.elements.spinner import spinner as spinner
|
|
|
|
from streamlit.commands.page_config import set_page_config as set_page_config
|
|
from streamlit.commands.execution_control import (
|
|
stop as stop,
|
|
rerun as rerun,
|
|
switch_page as switch_page,
|
|
)
|
|
|
|
|
|
def _update_logger() -> None:
|
|
_logger.set_log_level(_config.get_option("logger.level").upper())
|
|
_logger.update_formatter()
|
|
_logger.init_tornado_logs()
|
|
|
|
|
|
# Make this file only depend on config option in an asynchronous manner. This
|
|
# avoids a race condition when another file (such as a test file) tries to pass
|
|
# in an alternative config.
|
|
_config.on_config_parsed(_update_logger, True)
|
|
|
|
secrets = _secrets_singleton
|
|
|
|
altair_chart = _main.altair_chart
|
|
area_chart = _main.area_chart
|
|
audio = _main.audio
|
|
audio_input = _main.audio_input
|
|
badge = _main.badge
|
|
balloons = _main.balloons
|
|
bar_chart = _main.bar_chart
|
|
bokeh_chart = _main.bokeh_chart
|
|
button = _main.button
|
|
caption = _main.caption
|
|
camera_input = _main.camera_input
|
|
chat_message = _main.chat_message
|
|
chat_input = _main.chat_input
|
|
checkbox = _main.checkbox
|
|
code = _main.code
|
|
columns = _main.columns
|
|
tabs = _main.tabs
|
|
container = _main.container
|
|
dataframe = _main.dataframe
|
|
data_editor = _main.data_editor
|
|
date_input = _main.date_input
|
|
divider = _main.divider
|
|
download_button = _main.download_button
|
|
expander = _main.expander
|
|
feedback = _main.feedback
|
|
pydeck_chart = _main.pydeck_chart
|
|
empty = _main.empty
|
|
error = _main.error
|
|
exception = _main.exception
|
|
file_uploader = _main.file_uploader
|
|
form = _main.form
|
|
form_submit_button = _main.form_submit_button
|
|
graphviz_chart = _main.graphviz_chart
|
|
header = _main.header
|
|
help = _main.help
|
|
html = _main.html
|
|
image = _main.image
|
|
info = _main.info
|
|
json = _main.json
|
|
latex = _main.latex
|
|
line_chart = _main.line_chart
|
|
link_button = _main.link_button
|
|
map = _main.map
|
|
markdown = _main.markdown
|
|
metric = _main.metric
|
|
multiselect = _main.multiselect
|
|
number_input = _main.number_input
|
|
page_link = _main.page_link
|
|
pills = _main.pills
|
|
plotly_chart = _main.plotly_chart
|
|
popover = _main.popover
|
|
progress = _main.progress
|
|
pyplot = _main.pyplot
|
|
radio = _main.radio
|
|
scatter_chart = _main.scatter_chart
|
|
selectbox = _main.selectbox
|
|
select_slider = _main.select_slider
|
|
segmented_control = _main.segmented_control
|
|
slider = _main.slider
|
|
snow = _main.snow
|
|
subheader = _main.subheader
|
|
success = _main.success
|
|
table = _main.table
|
|
text = _main.text
|
|
text_area = _main.text_area
|
|
text_input = _main.text_input
|
|
toggle = _main.toggle
|
|
time_input = _main.time_input
|
|
title = _main.title
|
|
vega_lite_chart = _main.vega_lite_chart
|
|
video = _main.video
|
|
warning = _main.warning
|
|
write = _main.write
|
|
write_stream = _main.write_stream
|
|
color_picker = _main.color_picker
|
|
status = _main.status
|
|
|
|
# Events - Note: these methods cannot be called directly on sidebar
|
|
# (ex: st.sidebar.toast)
|
|
toast = _event.toast
|
|
|
|
# Config
|
|
# We add the metrics tracking here, since importing
|
|
# gather_metrics in config causes a circular dependency
|
|
get_option = _gather_metrics("get_option", _config.get_option)
|
|
set_option = _gather_metrics("set_option", _config.set_user_option)
|
|
|
|
# Session State
|
|
session_state = _SessionStateProxy()
|
|
|
|
query_params = _QueryParamsProxy()
|
|
|
|
context = _ContextProxy()
|
|
|
|
# Caching
|
|
cache_data = _cache_data
|
|
cache_resource = _cache_resource
|
|
# `st.cache` is deprecated and should be removed soon
|
|
cache = _cache
|
|
|
|
# Namespaces
|
|
column_config = _column_config
|
|
|
|
# Connection
|
|
connection = _connection
|
|
|
|
# Fragment and dialog
|
|
dialog = _dialog_decorator
|
|
fragment = _fragment
|
|
|
|
|
|
# Auth
|
|
login = _login
|
|
logout = _logout
|
|
|
|
# User
|
|
user = _UserInfoProxy()
|
|
|
|
# Experimental APIs
|
|
experimental_dialog = _experimental_dialog_decorator
|
|
experimental_fragment = _experimental_fragment
|
|
experimental_user = _DeprecatedUserInfoProxy()
|
|
|
|
_EXPERIMENTAL_QUERY_PARAMS_DEPRECATE_MSG = (
|
|
"Refer to our [docs page](https://docs.streamlit.io/develop/api-reference/caching-and-state/st.query_params) "
|
|
"for more information."
|
|
)
|
|
|
|
experimental_get_query_params = _deprecate_func_name(
|
|
_get_query_params,
|
|
"experimental_get_query_params",
|
|
"2024-04-11",
|
|
_EXPERIMENTAL_QUERY_PARAMS_DEPRECATE_MSG,
|
|
name_override="query_params",
|
|
)
|
|
experimental_set_query_params = _deprecate_func_name(
|
|
_set_query_params,
|
|
"experimental_set_query_params",
|
|
"2024-04-11",
|
|
_EXPERIMENTAL_QUERY_PARAMS_DEPRECATE_MSG,
|
|
name_override="query_params",
|
|
)
|
|
|
|
|
|
# make it possible to call streamlit.components.v1.html etc. by importing it here
|
|
# import in the very end to avoid partially-initialized module import errors, because
|
|
# streamlit.components.v1 also uses some streamlit imports
|
|
import streamlit.components.v1 # noqa: F401
|