Multiselect reloads the page

Hi everyone,

I am facing an issue that when I select any items from the st.multiselect, the page is reloaded, and the selected item is also reset.

I tried to add st.session_state, but it did not help much. Can anyone have experience in this case? or any comment would be highly appreciated.

Below is my code

def load_data(self, db_result):
	# Load full dataset of RecordSet
	df_record_set, count_record_set = self.load_record_set_data(record_set_col)
	st.write('### Full RecordSet', df_record_set)
	st.info('Total items: ' + str(count_record_set))
	
	record_set_selected_indices = st.selectbox('Select rows:', df_record_set.index)
	record_set_selected_rows = df_record_set.loc[record_set_selected_indices]
	st.write('### Selected Rows', record_set_selected_rows)
		
	# Load full dataset of Exporting Template
	df_exp_tem, count_exp_tem = self.load_exp_tem_data(exp_tem_col)
	st.write('### Full Exporting Template', df_exp_tem)
	st.info('Total items: ' + str(count_exp_tem))
	
	exp_tem_selected_indices = st.selectbox('Select rows:', df_exp_tem.index)
	exp_tem_selected_rows = df_exp_tem.loc[exp_tem_selected_indices]
	st.write('### Selected Rows', exp_tem_selected_rows)
	
	# Add a 'Generate channel' button
	generate_clicked = st.button('Generate channel')

	if generate_clicked or st.session_state.generate_channel:
		st.session_state.generate_channel = True
		
		# Get RecordSet Id to find related ECG with channels
		record_set_id=ObjectId(record_set_selected_rows[cons.HEADER_ID])
		
		# Query to get list of ECG channels based on RecordSet Id
		result = self.load_channel_list_from_record_set(ecg_col, record_set_col, record_set_id)
		
		# Nested For Loop
		ecg_data = [
			ECG(id=y[cons.ECG_ID_SHORT],
				file_name=y[cons.ECG_FILE_NAME],
				channel=y[cons.ECG_CHANNEL])
			for x in result for y in x[ecg_col.name]
		]

		# Get text of channels based on selected exporting template
		list_channels_str = 'Channel ' + exp_tem_selected_rows[cons.HEADER_CHANNEL]
		
		# Widgets will be genrated by the number of ECG records
		# This is used for mapping channel between ECG record and Exporting template
		for x in ecg_data:
			st.write(list_channels_str + ' from selected exporting template')
			st.multiselect('Record: ' + x.file_name, x.channel, key=str(x))
					
		st.success('Clicked!')
		map_clicked = st.button('Extract data')

		if map_clicked:
			st.write('test - ''Extract data'' button is clicked')

Screenshot:

  • Current: When ‘V5’ is selected, the page is reloaded and no item is selected.
  • Expectation: When ‘V5’ is selected, the page remains stable (no reload), and the item is added to the multiselect widget. Then, other items are also can be added.

Open question: Is that possible to have 2 different st.session_state to handle 2 different business processes in a function? If not, which is the best practice?

Thanks for your reading.

Check out forms

That could help with the page reloading as soon as you select something.

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.