Create a new text_input every time I click the button

Hello,

How can I create new text boxes (text_input) by clicking a button. As shown in the reference image, a new text box should get created every time I click the button (something like click to add new row functionality)

@Prabhat_Ratnala
Hi, I just made it come true:

here is the code:

import streamlit as st
import random
import string

if 'count' not in st.session_state:
	st.session_state.count = 0

def add_new_row():
	st.text_input("Please input something",key=random.choice(string.ascii_uppercase)+str(random.randint(0,999999)))

if st.button("Add new row"):
	st.session_state.count += 1
	add_new_row()
	if st.session_state.count>1:
		for i in range(st.session_state.count-1):
			add_new_row()

the most import thing is how to generate different key for the newest text_input
I used the

key=random.choice(string.ascii_uppercase)+str(random.randint(0,999999))

to ensue an unique key will be genreated when button be clicked every time.

How can I save state of each input in the above scenario?

2 Likes

This worked to generate the controls, but I couldnt save each of these inputs to an array or so. This is what worked for me (made some minor changes to your code, I have not tested the below code, but did something similar for myself)

import streamlit as st
import random
import string

if 'input_keys' not in st.session_state:
    st.session_state.input_keys= []

if st.button("Add new row"):
    st.session_state.input_keys.append(random.choice(string.ascii_uppercase)+str(random.randint(0,999999)))

input_values = []
for input_key in st.session_state.input_keys:
    input_value = st.text_input("Please input something", key=input_key)
    input_values.append(input_value)

Thanks @najeem for the update. @Prabhat_Ratnala I have worked on a new method if that’ll help you.

import streamlit as st
import random


if 'champs_dict' not in st.session_state:
    st.session_state['champs_dict'] = {}

def add_new_row(new_champ):
    st.session_state['champs_dict'][new_champ] = st.text_input(new_champ+'...',key=new_champ+str(random.randint(0,999999)))

new_champ = st.text_input("Please enter the new champ...", key = 'new_champ')
add_new = st.button("Add new row")
if add_new:
    if new_champ not in st.session_state['champs_dict']:
        st.session_state['champs_dict'][new_champ] = ''
        for key in st.session_state['champs_dict']:
            add_new_row(key)

    else:
        st.warning(str(new_champ)+" exists already!")
        for key in st.session_state['champs_dict']:
            add_new_row(key)

This is how I’ve done it, as the above replies were not working exactly for me.

features_list = []

# Display the text areas for each feature
for i in range(st.session_state.num_features):
    feature = st.text_area(
        f"What is the description of the feature {i + 1} and what type of users are involved in it?",
        placeholder=f"Feature {i + 1}:\n...",
        height=100,
        key=f'new_feature_{i}'
    )
    features_list.append(feature)

# Button to add more features
if st.button("Add Feature"):
    st.session_state.num_features += 1
    
# joining the input of features_list into a string.
answer3 = '\n'.join(features_list)