问题:
我的 Streamlit 应用程序的下载功能遇到问题。当我单击“下载二维码”按钮时,应用程序意外地从头开始重新运行,生成重复的按钮。实际下载仅在单击第二个按钮时启动。 这是我的代码
import streamlit as st
import qrcode
from io import BytesIO
from PIL import Image
def generate_qr_code(link): # Generate QR Code
qr = qrcode.QRCode(
version=1.00,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=2,
)
qr.add_data(link)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
return img
def download_qr_code(img): # Convert PIL image to bytes
img_bytes = BytesIO()
img.save(img_bytes, format='PNG')
img_bytes.seek(0)
return img_bytes
st.title("QR Code Generator")
link = st.text_input("Enter a link:")
if link:
qr_img = generate_qr_code(link)
img = download_qr_code(qr_img)
st.image(img, caption='Generated QR Code', width=300)
if st.button('Download QR Code'):
qr_bytes = download_qr_code(qr_img)
st.download_button(label="Download QR Code", data=qr_bytes, file_name='qr_code.png', mime='image/png')
故障排除尝试:
我还探索过使用 st.session_state 在重新运行时存储变量,但我不确定此特定场景的正确实现。 在这里:
if "qr_bytes" not in st.session_state:
if link:
qr_img = generate_qr_code(link)
qr_bytes = download_qr_code(qr_img)
st.session_state.qr_bytes = qr_bytes
和
if st.button('Download QR Code'):
if "qr_bytes" in st.session_state:
data = st.session_state.qr_bytes
else:
# Fallback in case session data is missing
qr_img = generate_qr_code(link)
data = download_qr_code(qr_img)
st.session_state.qr_bytes = data
st.download_button(label="Download QR Code", data=data, file_name='qr_code.png', mime='image/png')
但是还没有解决。 我希望在单击第一个“下载二维码”按钮后立即启动下载,而不需要重新运行任何应用程序或生成重复的按钮。 我对 Streamlit 比较陌生,因此详细的解释会很有帮助。 如有必要,我愿意接受替代方法的建议。 预先感谢您的协助!
我也遇到了类似的问题。最近尝试了SimpleStart这个类似Streamlit的工具,完全没有遇到这个问题。代码几乎是一样的。由于 SimpleStart 基于事件处理,因此单击按钮时它不会刷新整个页面。
import simplestart as ss
import qrcode
from io import BytesIO
from PIL import Image
#api
def generate_qr_code(link): # Generate QR Code
qr = qrcode.QRCode(
version=1.00,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=2,
)
qr.add_data(link)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
return img
def download_qr_code(img): # Convert PIL image to bytes
img_bytes = BytesIO()
img.save(img_bytes, format='PNG')
img_bytes.seek(0)
return img_bytes
#event handler
def text_change(event):
generate_img()
def generate_img():
link = link_text.value
qr_img = generate_qr_code(link)
img = download_qr_code(qr_img)
myimg.image = img
#ui
ss.write("# QR Code Generator")
link_text = ss.text_input("http://www.simplestart.cc", label = "Enter a link:", onchange = text_change, max_width = 600)
myimg = ss.image("", title='Generated QR Code', width=300, border= True)
generate_img()
ss.link("Download QR Code", myimg.image, file_name = "qr_code.png", mime = "image/png")