My project uses tables to display data, with 50 records per page and multiple buttons per row to trigger dialog to edit or delete the record. However, after the first dialog appears, clicking the buttons later, the dialog will most likely not display, how to avoid this issue? thanks.
you can reproduce the issue with the following code:
import streamlit as st
COLUMN_TITLE = ['col1' ,'col2' ,'col3' ,'col4' ,'col5' ,'col6' ,'col7']
COLUMN_SPEC=[1 ,1 ,1 ,1 ,1 ,1 ,1]
@st.dialog(title="test")
def show_media_play_dialog():
st.write("hello world!")
with st.container():
for x in range(50):
for col, field_name in zip(st.columns(COLUMN_SPEC), COLUMN_TITLE):
col.button(f"show dialog",key=f"{field_name}_test_{x}", on_click=show_media_play_dialog)
fix it with : (but it’s not so much compact, the callback is doing a weird thing)
COLUMN_TITLE = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7']
COLUMN_SPEC = [1, 1, 1, 1, 1, 1, 1]
@st.experimental_dialog('test')
def show_media_play_dialog():
st.write("hello world!")
# Initialize state
if 'dialog_shown' not in st.session_state:
st.session_state['dialog_shown'] = False
def on_button_click():
st.session_state['dialog_shown'] = True
with st.container():
for x in range(50):
for col, field_name in zip(st.columns(COLUMN_SPEC), COLUMN_TITLE):
col.button(f"show dialog", key=f"{field_name}_test_{x}", on_click=on_button_click)
# Show the dialog if the state is True
if st.session_state['dialog_shown']:
show_media_play_dialog()
st.session_state['dialog_shown'] = False