Streamlit 在单击按钮时重新运行应用程序,延迟下载

问题描述 投票:0回答:1

问题:

我的 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 比较陌生,因此详细的解释会很有帮助。 如有必要,我愿意接受替代方法的建议。 预先感谢您的协助!

python-3.x qr-code streamlit
1个回答
0
投票

我也遇到了类似的问题。最近尝试了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")

截图

简单启动主页

© www.soinside.com 2019 - 2024. All rights reserved.