Getting multiple inputs from the loop

The key is to remember that a streamlit app just runs as a script from top to bottom. In your case, it doesn’t stop to wait for input, it just keeps adding widgets where you told it to, so if you tell it to loop 3 times, it will write over the food_type_widget three times, and only show the last one.

One way to solve this is to use st.session_state to keep track of what’s been entered, and add a submit button that updates the list of foods, and then reruns the app again for the next entry.

import streamlit as st

def load_food_data():
    food_dataset = {
        "Food_Name": ["Apple", "Banana", "Orange", "Mango", "Pineapple"],
        "Carbohydrates": [25, 27, 21, 30, 22],
        "Protein": [1, 1, 1, 1, 1],
        "Fat": [0, 0, 0, 0, 0],
        "Fiber": [4, 3, 3, 4, 2],
    }

    return food_dataset

if "num_entered" not in st.session_state:
    st.session_state.num_entered = 0

if "food_items" not in st.session_state:
    st.session_state.food_items = []

def calorie_counter():

    food_dataset = load_food_data()
    drop_down_column = food_dataset["Food_Name"]

    ft = []
    fpw = []
    tpd = []
    quan = []

    num_food_items = st.number_input("Enter the number of food items: ", step = 1)

    # Create widgets outside the loop
    food_type_widget = st.empty()
    frequency_per_week_widget = st.empty()
    times_per_day_widget = st.empty()
    quantity_widget = st.empty()


    counter = 0
    if st.session_state["num_entered"] < num_food_items:
        food_type = food_type_widget.selectbox("Select the type of food:", drop_down_column, key=f"food_type_input_{len(ft)}")
        frequency_per_week = frequency_per_week_widget.number_input("Enter the frequency per week for food:", key=f"frequency_per_week_input_{len(fpw)}", step=1)
        times_per_day = times_per_day_widget.number_input("Enter how many times per day for food:", key=f"times_per_day_input_{len(tpd)}", step=1)
        quantity = quantity_widget.number_input("Enter the quantity in grams for food:", key=f"quantity_input_{len(quan)}", step=1)

        if st.button("Submit"):

            st.session_state.food_items.append({
                'food_type': food_type,
                'frequency_per_week': frequency_per_week,
                'times_per_day': times_per_day,
                'quantity': quantity
            })

            ft.append(food_type)
            fpw.append(frequency_per_week)
            tpd.append(times_per_day)
            quan.append(quantity)

            st.session_state["num_entered"] += 1

            st.rerun()
    else:
        st.write("No more food to enter")

    st.write("Food items entered")
    st.write(st.session_state.food_items)

calorie_counter()