Snippets Collections
import streamlit as st

# Create item
custom_item = form_cols[1].text_input(label="Custom item")
custom_item_submit = form_cols[1].button("Add to database", key="new_item_input_case_" + str(case_n) + "_layer_" + str(index))
    
# if saving the custom item
if custom_material_submit:
   st.session_state["custom_items_database_active"].insert_rows(idx=2)       # add a new row before inserting custom item
   st.session_state["custom_items_database_active"].cell(row=2, column=1, value=custom_item)       # insert custom item into new row (INSERT AND ROW SHOULD BE SAME VALUE)
   
   st.session_state["custom_materials_database_write"].save("/path/to/Excel.xlsx")       # save the file to reflect the changes next time the database is loaded
   # get_custom_database()

   # TODO make global function?  Attempt to show changes after adding
   # custom_item_panda = pd.DataFrame([custom_item])    # to see the changes get reflected in the form
   # all_custom_item = custom_item_panda.append(all_item_list_pandas, ignore_index=True)
   # materials_choices = customization_choices.append(all_custom_materials, ignore_index=True)

   form_cols[1].write("\"" + str(custom_item) + "\" has been added to the database.  Please select a different item to see the changes")



# Edit item
# First check if selected material is custom-made or not
if orig_material_name in st.session_state["orig_item_prefill_index"]:
   form_cols[1].info("Sorry, you can only change custom-made items.")
elif orig_material_name in st.session_state["custom_item_prefill_index"]:
   to_change = form_cols[1].text_input(label="Edit material name", value=orig_item_name)

   if form_cols[1].button("Save changes"):
         st.session_state["custom_item_database_active"].cell(row=st.session_state["custom_item_prefill_index"][orig_item_name]+2, column=1, value=to_change)
      st.session_state["custom_item_database_write"].save(st.session_state["custom_database_path"])
            form_cols[1].info("\"" + to_change + "\" has been saved to the database.  Please select a different item to see the changes reflect.")

      # TODO push new changes to form for immediate change view
      #         item_table_pandas = pd.DataFrame(item_table_active.values)
      #         custom_item_list = customize_options.append(item_table_pandas, ignore_index=True)
import streamlit as st

# Function to create a slider with an edit bar. The name of the slider must be unique on the page.
def createSliderWithEdit(container, initialValue, sliderName):
    val = initialValue

    # session_state is a global object, associated with streamlit, not with the container
    if sliderName in st.session_state:
        val = st.session_state[sliderName]
    nb = container.number_input(label=sliderName, value=val)

    # When you add a Key to the slider it will automatically create a session state associated with it.
    v = container.number_input(label='', value=nb, key=sliderName)
    # v = container.slider(label='', value=nb, key=sliderName)

createSliderWithEdit(st, 0, 'MyFavoriteInput')
createSliderWithEdit(st, 0, 'MySecondFavoriteInput')

col1, col2 = st.columns(2)

createSliderWithEdit(col1, 0, 'FirstInputInAColumn')
createSliderWithEdit(col2, 0, 'SecondInputInAColumn')
import streamlit as st



#app.py
import streamlit as st
import multipage_streamlit as mt
import page_1, page_2, page_3_args

st.write("Main page")
num_pages = 3
# pages = ["Page 1", "Page 2"]
pages = []
for i in range(1, num_pages + 1):
    pages.append("Page 3_" + str(i))
pages.insert(0, "Page 1")
pages.insert(1, "Page 2")


# Nav radios
page = st.radio(label="Welcome, please select a calculator:", options=pages, horizontal=True)
# st.write('<style>div.row-widget.stRadio > div{flex-direction:row;}</style>', unsafe_allow_html=True)
# st.markdown("---")

app = mt.MultiPage()
# app.add("Page a1", page_1.app)  # no parentheses or else it will run!
# app.add("Page b2", page_2.app)  # ^ditto
for i in range(1, num_pages+1):
    app.add("Page 3." + str(i), page_3_args.app)
# app.add("Page 1", page_1.app)
# app.add("Page 2", page_2.app)

# app.run_selectbox()

# Nav between case pages
if page == pages[0]: page_1.app()
elif page == pages[1]: page_2.app()
elif page == pages[2]: page_3_args.app(1)
elif page == pages[3]: page_3_args.app(2)
elif page == pages[4]: page_3_args.app(3)

# Session states
st.write(st.session_state)
# st.write(st.session_state["_state_"])
# st.write(st.session_state["_state_"]["page_1:x"])
# st.write(st.session_state["_state_"].keys())
# st.write(st.session_state["_state_"].values())



# page_1.py
import streamlit as st
from multipage_streamlit import State
# import page_1, page_2

def app():
    # state = State("sharing")
    # state = State(__name__)
    
    st.header("Page 1")

    # # if "page_1" not in st.session_state:
    # #     st.session_state["page_1"] = 9

    # # p1_text = st.number_input(label="Sharing state", value=st.session_state["page_1"], key="page_1")
    # p1_text = st.number_input(label="Sharing state", key=state("x", 9))
    # st.write(st.session_state[__name__ + ":x"])
    # st.number_input(label="Testing state", value=st.session_state[__name__ + ":x"])
    # # st.number_input(label="Testing state", key=st.session_state["_state_"][__name__ + ":x"])
    # st.write("\_state_")
    # # st.number_input(label="Testing state", value=st.session_state[__name__ + ":x"], key=state("x", 3))
    
    st.number_input(label="Testing shared state across pages page 1", key="testing")

    # # st.write(st.session_state["page_1"])
    # # st.write(st.session_state["page_2"])
    
    # state.save()

    return



# page_2.py
import streamlit as st
from multipage_streamlit import State

def app():
    # state = State("sharing")
    # state = State(__name__)
    
    st.header("Page 2")

    # # p1_text = st.number_input(label="Sharing state", value=st.session_state["page_1"], key="page_1")
    # p2_text = st.number_input(label="Indiv state", key=state("x", 1))
    # # p1_text = st.number_input(label="Sharing state", key=st.session_state[["_state_"]["page_1:x"]])
    
    # # st.write(__name__ + ":x")
    # # st.write(st.session_state[__name__ + ":x"])
    # # st.write(st.session_state)
    # st.write(state("x", 1))

    # # st.write(st.session_state["page_1"])
    
    st.number_input(label="Testing shared state across pages page 2", key="testing")


    # # if "page_2" not in st.session_state:
    # #     st.session_state["page_2"] = 12

    # # p2_text = st.number_input(label="Own state", value=st.session_state["page_2"], key="page_2")

    # # st.write(st.session_state["page_2"])
    
    # state.save()

    return



import streamlit as st
from multipage_streamlit import State

def app(case_x):
    state = State(__name__)
    
    st.header("Page 3")

    p3_text = st.number_input(label="Indiv state", key=state(str(case_x), 20 + case_x))
    p3_selbox = st.selectbox(label="Indiv state", options=[21, 22, 23], key=state(str(case_x) + "_select", 20 + case_x))
    
    state.save()

    return
import streamlit as st
from streamlit import session_state as ses

if "num_cases" not in ses:
    ses["num_cases"] = 3

delete_part = st.container()
        
if st.button("Add a row"):
    ses["num_cases"] += 1

cols = st.columns((1, 2))
for i in range(0, ses["num_cases"]):
    
    cols[1].write("")
    cols[1].write("")
    delete = cols[1].button(label="X", key="delete_" + str(i+1))
    
    with delete_part:
        st.write("delete")
        if delete:
            st.write("pressed")
            ses["num_cases"] -= 1
            st.write("text_" + str(i+1))
            cols[0].empty()
            cols[1].empty()
            del ses["text_" + str(i+1)]
    
    try:
        cols[0].text_input(label="Row " + str(i+1), key="text_" + str(i+1))
    except:
        pass


deletion = st.empty()
deletion.text_input(label="testing removability", key="removable")
if st.button("delete"):
    deletion.empty()
    del ses["removable"]



st.write(ses)
# ORRRRR save the inputs as "old" when submitting: ses["old_input"] = orig_input


import streamlit as st

st.set_page_config(page_title="PLAYGROUND", layout="wide")

# Init session states
if "num_changed" not in st.session_state:
    st.session_state["num_changed"] = False
if "select_changed" not in st.session_state:
    st.session_state["select_changed"] = False
if "old_res" not in st.session_state:
    st.session_state["old_res"] = 0
if "toggle_results" not in st.session_state:
    st.session_state["toggle_results"] = False

# on_change Changed fr selectbox, changed by selectbox is true so it can change the result input
def change_fr_select():
    st.write("Change fr select")
    st.session_state["select_changed"] = True
    st.session_state["num_changed"] = False

    st.session_state["toggle_results"] = False

    return

# on_change Changed fr num_input, changed by num_input is true to prevent result input from changing
def change_fr_num():
    st.write("Change fr num")
    st.session_state["num_changed"] = True
    st.session_state["select_changed"] = False

    st.session_state["toggle_results"] = True

    return

# Calc function
def calculate(num1, num2):
    st.write("num_changed", st.session_state["num_changed"])
    st.write("select_changed", st.session_state["select_changed"])
    st.write("toggle_results", st.session_state["toggle_results"])
    
    res = 0
    # selectbox has changed + we can calculate/overwrite input
    if st.session_state["select_changed"] == True:
        st.write("selectbox")
        res = num1 * num2
    # indep. num_input has changed + retain "old" answer result
    elif st.session_state["num_changed"]:
        st.write("num_input")
        res = st.session_state["old_res"]
    return res



# TODO checkbox to toggle between updated calculation or (manual) input

cols = st.columns((5, 5, 5, 5))

selection = cols[0].selectbox(label="Wheee", options=["one", "two", "three", "four"], on_change=change_fr_select)
assert selection is not None
list1 = {
    "one": 2,
    "two": 6,
    "three": 9,
    "four": 0
}
list2 = {
    "one": 1,
    "two": 8,
    "three": 4,
    "four": 3
}
num1 = cols[2].number_input(label="Num 1", value=list1[selection], on_change=change_fr_num)
num2 = cols[3].number_input(label="Num 2", value=list2[selection], on_change=change_fr_num)

together = calculate(num1, num2)
st.write(together)


result = cols[1].number_input(label="Result", value=together)
st.session_state["old_res"] = result
# TODO toggle b/w old and new results
if st.session_state["toggle_results"] == True:
    cols[1].checkbox("Different result detected!  Click to use new result", help="You changed one of the parameters used to estimate this value.  You can choose to use the estimation or keep your current value.")

st.write(st.session_state["select_changed"])
st.write(st.session_state["num_changed"])

st.markdown("---")






# Implementation
# num on_change Changed fr selectbox, changed by selectbox is true so it can change the num1 input
def change_fr_select(select_changed, num_changed, toggle_results):
    """ Change session state indicating that the selectbox has changed to determine if the num1 should be changed

        Arguments:
            select_changed {string} -- boolean session state indicating user changed selectbox value
            num_changed {string} -- boolean session state indicating user changed number_input value 
            toggle_results {string} -- boolean session state indicating we toggle option to switch between manual user input or recalculated modulus value
    """

    st.write("select")
    st.session_state[select_changed] = True     # user has changed selectbox value
    st.session_state[num_changed] = False       # thickness and density should not change modulus

    st.session_state[toggle_results] = False    # toggle whether recalculated modulus or manual input should not appear, selectbox should change the modulus 

    return



# select on_change
def select_on_change(select_changed, num_changed, old_result, toggle_results, index, case_n):
    st.write(select_changed, st.session_state[select_changed])
    st.write(num_changed, st.session_state[num_changed])
    st.write(toggle_results, st.session_state[toggle_results])

    res = 0
    # selectbox has changed + we can calculate/overwrite input
    if st.session_state[select_changed] == True:
        st.write("selectbox")
        st.session_state[old_result] = False
        res = 10**(31*st.session_state["num1_layer_" + str(index-1) + "_case_" + str(case_n)] - 1.89*((st.session_state["num2_layer_" + str(index-1) + "_case_" + str(case_n)]**29)))
    # indep. num_input has changed + retain "old" answer result
    elif st.session_state[num_changed] == True:
        st.write("num_input")
        st.session_state[old_result] = True

    return res


# num on_change Changed fr num_input, changed by number_input is true so it does NOT change the modulus input 
def change_fr_num(select_changed, num_changed, toggle_results):
    """ Change session state indicating that the bending stiffness thickness and/or density inputs have changed to determine if the modulus should be changed

        Arguments:
            select_changed {string} -- boolean session state indicating user changed selectbox value
            num_changed {string} -- boolean session state indicating user changed number_input value 
            toggle_results {string} -- boolean session state indicating we toggle option to switch between manual user input or recalculated modulus value
    """

    st.write("num")
    st.session_state[num_changed] = True        # num1 and num2 should change select
    st.session_state[select_changed] = False    # user has not changed selectbox value

    st.session_state[toggle_results] = True    # toggle whether recalculated modulus or manual input should appear, user can toggle between their own or recalculated value

    return
import streamlit as st
import pandas as pd

@st.cache(show_spinner=False)
def excel_init():
    # Use database like in Bending Stiffness model
    orig_database_path = "/path/to/file.xlsx"      # local copy of the Excel database used in Bending Stiffness & Permeability model
    read_orig_database = r"" + orig_database_path
    sheet_name = "Database"
    
    # Read in the Resin/Materials from Carol's Excel file for getting data by column
    ses["read_table"] = pd.read_excel(read_orig_database, sheet_name=sheet_name, engine='openpyxl', skiprows=3)   # skip first 3 rows since they are either empty space or extra headers

    # Excel column header names from original materials database for easily reading the database column values
    ses["col1"] = ses["read_table"].columns[0]      # "Column 1"
    ses["col3"] = ses["read_table"].columns[2]      # "Column 3"
    ses["col6"] = ses["read_table"].columns[5]      # "Column 6"
    
    # Setting up list of materials for dropdown
    col1_pandas = pd.DataFrame(ses["read_table"][ses["col1"]].values)  # get col1 column values as pandas dataframe
    customize_options = pd.DataFrame(["[Placeholder]"])                                              # "blank" placeholder for any item not in the database
    ses["list_streamlit"] = pd.concat([customize_options, col1_pandas], axis=0)                       # axis=0 --> concat by row, axis=1 --> concat by col

    # Assign "Excel indices" for easy data retrieval (same applies to col3, col6, etc.) after user selects a material (need to start range at 1 since Excel is 1-based index, not 0-based)
    # we access the item by
    ses["col1_prefill_index"] = {}                                                         # [material_name_key]: [index_0-based_val]
    for i in range(1, len(ses["read_table"][ses["col1"]]) + 1):      # loop through col1 pandas dataframe "list"
        ses["col1_prefill_index"][ses["read_table"][ses["col1"]][i-1]] = i-1
    
    return
# Num cases + in session state
num_cases = st.selectbox('Select the number of cases for comparison, maximum of 12', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], key="num_cases")


# Nav options: dynamically append/remove # of cases menu bar has
case_pages = {}
for x in range(1, st.session_state["num_cases"] + 1): case_pages["Case " + str(x)] = x

# "Slice" dictionary according to input for # of cases + case titles
# One-liner for iterating through dictionary for num_cases times to show both the case and the summary page names in the navigation "tabs"
case_pages_sliced = dict(itertools.islice(case_pages.items(), 0, st.session_state["num_cases"]))

# Add "Summary" option at end of options list
case_pages_sliced["Summary"] = 0
import streamlit as st
import multipage_streamlit as mt


# Check preserved session state if you need to replace value with user input or material has changed with the multipage ses state library
def old_persistent_ses_state(old_extracted_val_ses, current_extracted_val_ses, extracted_input):
	""" Determines if preserved inputs can have its value replaced or not, via user input or material change

        Args:
            old_extracted_val_ses (string): session state of old input value to determine if value gets replaced or not
            current_extracted_val_ses (string): session state of current input value
            extracted_input (int): input value for current input
    """    
    
    if old_extracted_val_ses in ses and ses[old_extracted_val_ses]!=extracted_input and current_extracted_val_ses in ses: ses[current_extracted_val_ses] = extracted_input
    
    return


# app.py
app = mt.MultiPage()
app.add("Page 1", page_1.app)	# no parentheses or else it will run even when not selected!
app.add("Page 2", page_2.app)

# page_1.py
def app():
	select = st.selectbox(label="Input 1 Page 1", options=[1, 2, 3], key=state("input_1_page_1"))	# don't need to init session state, will default to first item/0 for num_input
	value = st.number_input(label="Input 2 Page 1", key=state("input_2_page_1", select))
	
	# Save old session state to prevent overwriting
    
import streamlit as st

display = ("male", "female")
options = list(range(len(display)))
value = st.selectbox("gender", options, format_func=lambda x: display[x])
st.write(value)

# dropdown shows "male, female" but the value is 1 or 2
import streamlit as st
from multipage_streamlit import MultiPage

def app():
    return
import streamlit as st

# Helper function to init session states
def init_sess_state(sess_state_name, init_val):
	if sess_state_name not in st.session_state:         
       st.session_state[sess_state_name] = init_val
    return sess_state_name
star

Thu Jan 19 2023 21:10:26 GMT+0000 (Coordinated Universal Time)

#python #streamlit
star

Thu Jan 19 2023 20:14:15 GMT+0000 (Coordinated Universal Time)

#python #streamlit
star

Thu Jan 19 2023 20:12:13 GMT+0000 (Coordinated Universal Time)

#python #streamlit
star

Mon Jan 16 2023 05:37:32 GMT+0000 (Coordinated Universal Time)

#python #streamlit
star

Mon Jan 16 2023 02:42:55 GMT+0000 (Coordinated Universal Time)

#python #streamlit
star

Sat Jan 14 2023 00:42:50 GMT+0000 (Coordinated Universal Time)

#python #streamlit
star

Fri Jan 13 2023 17:53:12 GMT+0000 (Coordinated Universal Time)

#python #streamlit
star

Wed Jan 11 2023 16:30:17 GMT+0000 (Coordinated Universal Time) https://github.com/crxi/multipage_streamlit

#python #streamlit
star

Tue Dec 13 2022 06:18:43 GMT+0000 (Coordinated Universal Time) https://discuss.streamlit.io/t/label-and-values-in-in-selectbox/1436/4

#python #streamlit
star

Tue Dec 13 2022 06:05:40 GMT+0000 (Coordinated Universal Time)

#python #streamlit
star

Tue Dec 13 2022 06:04:43 GMT+0000 (Coordinated Universal Time)

#python #streamlit

Save snippets that work with our extensions

Available in the Chrome Web Store Get Firefox Add-on Get VS Code extension