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]
关键修改点
- 初始化session_state:首次运行时创建需要持久化的变量,避免刷新后变量不存在
- 状态存储:点击「Losuj kategorię」时,将生成的分类、目标词等存入
st.session_state,而不是临时变量 - 基于状态渲染:页面内容从
st.session_state读取,而非每次重新生成 - 完善字母猜测逻辑:添加了字母匹配后更新显示列表的功能,让游戏流程更完整
内容的提问来源于stack exchange,提问作者mlodycezar
相关产品推荐
相关产品推荐

