You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Streamlit点击按钮后生成的密码消失问题求助

解决Streamlit幸运轮盘应用中页面刷新丢失状态的问题

问题说明

开发的幸运轮盘应用中,点击「Losuj kategorię」生成目标词后,再点击其他按钮(比如「Kręć kołem」「Podaje spółgłoskę」)会触发页面刷新,导致生成的目标词、分类等内容消失。尝试用单选框替代按钮也没用,每次点击都会重新生成内容。

核心原因

Streamlit的交互逻辑是每次用户操作都会重新运行整个脚本,如果不做状态持久化,临时生成的变量会在刷新后被重置。

解决方案

用st.session_state持久化关键状态(比如选中的分类、目标词、显示的下划线列表等),让数据在页面刷新后依然保留。

修改后的完整代码

import streamlit as st
import random

# 创建包含单词字母的列表
def lista_slowo(slowo):
    slowo = slowo.lower()
    lista_slowo = []
    for litera in slowo:
        lista_slowo.append(litera)
    return lista_slowo

# 创建用于显示的空下划线列表
def pusta_lista_na_tablicy(slowo):
    pusta_lista_na_tablicy = []
    for litera in slowo:
        pusta_lista_na_tablicy.append("_")
    return pusta_lista_na_tablicy

# 将列表转为字符串
def zamien_na_stringa(lista_na_tablicy):
    napis = ""
    for x in lista_na_tablicy:
        napis = napis + x + " "
    return napis

# 初始化session_state变量,确保首次运行时状态存在
if 'kategoria' not in st.session_state:
    st.session_state.kategoria = ""
if 'slowo' not in st.session_state:
    st.session_state.slowo = ""
if 'lista_na_tablicy' not in st.session_state:
    st.session_state.lista_na_tablicy = []
if 'wartosc' not in st.session_state:
    st.session_state.wartosc = 0

st.sidebar.title("Koło fortuny")
st.sidebar.text("Witamy w grze Koło Fortuny.")
st.sidebar.text("Wybierz liczbę graczy.\nNastępnie kliknij przycisk 'Losuj kategorię'.")

slownik_kategorii = {"Zwierzęta":["Krowa","Kura","Koń"],
             "Owoce":["Mandarynka","Pomarańcza","Truskawka"],
             "Warzywa":["Ogórek","Marchewka","Sałata"],
             "Ubrania":["Spodnie","Koszulka","Koszula"],
            "Pojazdy":["Samochód","Motocykl","Samolot"]}

slownik_wartosci = [100,200,300,400,500,600,700,800,900,1000,1500,0]

ilosc_graczy = st.sidebar.selectbox("Wybierz ilość graczy",[1,2])

losuj = st.sidebar.button("Losuj kategorię")

if losuj:
    # 把生成的内容存入session_state,避免刷新丢失
    st.session_state.kategoria = random.choice(list(slownik_kategorii))
    st.session_state.slowo = random.choice(slownik_kategorii[st.session_state.kategoria])
    st.session_state.lista_na_tablicy = pusta_lista_na_tablicy(st.session_state.slowo)

# 从session_state读取数据渲染页面,确保刷新后内容保留
if st.session_state.kategoria:
    st.subheader(f"Kategoria: {st.session_state.kategoria}")
    napis = zamien_na_stringa(st.session_state.lista_na_tablicy)
    st.title(napis)
    st.text("Słowo do odgadnięcia " + st.session_state.slowo)

odgaduj = st.sidebar.button("Odgadnij hasło")
krec = st.sidebar.button("Kręć kołem")
podaj_litere = st.sidebar.button("Podaje spółgłoskę")

if krec:
    st.session_state.wartosc = random.choice(slownik_wartosci)
    st.sidebar.text(f"Wartość spółgłoski: {st.session_state.wartosc} zł")

if podaj_litere:
    podana_litera = st.sidebar.text_input("Wpisz spółgłoskę")
    st.sidebar.text(podana_litera)
    # 新增:检查字母是否在目标词中,更新显示的下划线列表
    if podana_litera and st.session_state.slowo:
        podana_litera = podana_litera.lower()
        for idx, litera in enumerate(st.session_state.slowo.lower()):
            if litera == podana_litera:
                # 保持原单词的大小写
                st.session_state.lista_na_tablicy[idx] = st.session_state.slowo[idx]

关键修改点

  1. 初始化session_state:首次运行时创建需要持久化的变量,避免刷新后变量不存在
  2. 状态存储:点击「Losuj kategorię」时,将生成的分类、目标词等存入st.session_state,而不是临时变量
  3. 基于状态渲染:页面内容从st.session_state读取,而非每次重新生成
  4. 完善字母猜测逻辑:添加了字母匹配后更新显示列表的功能,让游戏流程更完整

内容的提问来源于stack exchange,提问作者mlodycezar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:34:59