Проблема с кнопкой приложения Streamlit (python): отображение предыдущего номера после нажатия кнопки вместо нового случPython

Программы на Python
Anonymous
Проблема с кнопкой приложения Streamlit (python): отображение предыдущего номера после нажатия кнопки вместо нового случ

Сообщение Anonymous »

Я создаю простое приложение Streamlit в качестве демонстрации более крупного проекта, над которым работаю. Цель состоит в том, чтобы отобразить случайное число от 0 до 100 и позволить пользователю выбрать, нравится ему это число или нет. После того, как пользователь нажмет «Да» или «Нет», приложение должно сохранить номер и ответ в формате JSON, а затем немедленно отобразить новое случайное число.
Однако после того, как пользователь нажимает кнопку, старое число по-прежнему отображается для следующего раунда выбора вместо отображения следующего случайного числа. Только после повторного нажатия кнопки появляется новый номер, но в конечном итоге ответ ассоциируется с новым номером, а не со старым. Ниже приведен упрощенный пример кода, который я использую:

Код: Выделить всё

import streamlit as st
import random
import json

# Initialize session state to store numbers and user responses in JSON format
if "data" not in st.session_state:
st.session_state.data = []

# Function to generate the next random number
def get_next_number():
return random.randint(0, 100)

# Initialize the first number when the app starts
if "current_number" not in st.session_state:
st.session_state.current_number = get_next_number()

# Function to handle the user response
def store_response(response):
current_number = st.session_state.current_number
st.session_state.data.append({"Number": current_number, "Response": response})
# Generate the next random number immediately after response
st.session_state.current_number = get_next_number()

st.title("Random Number Preference App")

# Display the current number
st.write(f"Do you like the number **{st.session_state.current_number}**?")

# Layout for the response buttons
col1, col2 = st.columns(2)

# Handling "Yes" button click
with col1:
if st.button("Yes"):
store_response("Yes")

# Handling "No" button click
with col2:
if st.button("No"):
store_response("No")

# Display the stored responses in JSON format
if len(st.session_state.data) > 0:
st.subheader("User Responses (JSON Format)")
st.json(st.session_state.data)

# Allow the user to download the results as a JSON file
json_data = json.dumps(st.session_state.data)
st.download_button(label="Download as JSON", data=json_data, file_name="responses.json", mime="application/json")
Проблема:
  • После отображения первого числа, если пользователь выбирает либо «Да» или «Нет», то же число отображается снова.
  • Когда в конечном итоге отображается следующее случайное число, ранее записанный ответ (например, «Да» или «Нет») применяется к вновь сгенерированному номеру, а не к номеру, который пользователь видел при выборе.
Шаги по воспроизведению проблемы (со снимками экрана) ):
  • Начальный экран:

    При запуске приложения он сразу показывает случайное число (например, 65). Пользователю предлагаются две кнопки: «Да» и «Нет», чтобы выбрать, нравится ли ему номер.
    [img]https://i.sstatic.net /9QeQ3ziK.png[/img]
  • После выбора «Да»:

    После нажатия кнопки «Да» приложение по-прежнему показывает тот же номер (65). Пользователь может еще раз нажать «Да» или «Нет», но кажется, что новое случайное число еще не появилось.
    Изображение
  • Появляется следующее случайное число с неправильным ответом :

    После повторного нажатия «Да» наконец отображается новое случайное число (в данном случае 44), но ответ (Да) из предыдущего выбора теперь связан с новый номер, поведение которого отличается от ожидаемого.
    Изображение
Чего я ожидаю:
  • Когда пользователь нажимает кнопку («Да» или «Нет»), должен немедленно появиться следующий номер, и ответ должен быть записан для текущего номера, а не для следующего.
Я пробовал управлять состоянием с помощью st.session_state и экспериментировал с st.experimental_rerun() (хотя моя версия Streamlit этого не делает). не поддерживаю), но мне не удается заставить приложение отображать новый номер сразу после нажатия кнопки.
Вопрос:
  • Как заставить приложение показывать следующее случайное число сразу после того, как пользователь выбирает свой ответ, при этом правильно связывая записанный ответ с отображаемым номером?
Буду очень признателен за любую информацию о том, чего мне не хватает, или об альтернативных подходах!

Подробнее здесь: https://stackoverflow.com/questions/790 ... tton-click

Вернуться в «Python»