使用Streamlit构建批量二维码生成器

68 阅读5分钟

使用Streamlit构建批量二维码生成器

Streamlit是一个优秀的Python库,让数据科学家和开发者能够快速创建交互式Web应用。今天,我将展示如何使用Streamlit和qrcode库构建一个简单而实用的批量二维码生成器。 ## 技术栈

  • Python
  • Streamlit
  • qrcode库
  • BytesIO
  • zipfile

项目功能

  • 生成单个或批量二维码
  • 自定义每个二维码的内容
  • 将生成的二维码打包下载为ZIP文件
  • 美观的用户界面

实现步骤

1. 安装必要的库

pip install streamlit qrcode pillow

2. 创建二维码生成函数

首先,我们需要一个函数来生成二维码图像: ``` import qrcode from io import BytesIO

def generate_qr_code(data): """生成二维码并返回二进制流对象。""" qr = qrcode.QRCode( version=1, # 控制二维码大小(1到40,数字越大尺寸越大) error_correction=qrcode.constants.ERROR_CORRECT_H, # 容错级别 box_size=10, # 每个方块的像素大小 border=4, # 边框宽度,单位为方块 ) qr.add_data(data) qr.make(fit=True)

# 生成图片
img = qr.make_image(fill_color="black", back_color="white")

# 将图片保存到字节流中
buffer = BytesIO()
img.save(buffer, format="PNG")
buffer.seek(0)
return buffer
 这个函数接收文本数据,生成二维码,并将其作为字节流返回,而不是保存到磁盘上。 ### 3. 创建ZIP打包函数
 为了方便用户下载多个二维码,我们实现了一个ZIP打包功能: ```
import zipfile

def create_zip(qr_data_list):
    """将多个二维码图片打包成一个 ZIP 文件并返回二进制流对象。"""
    zip_buffer = BytesIO()
    with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED) as zip_file:
        for idx, (data, qr_buffer) in enumerate(qr_data_list):
            zip_file.writestr(f"qr_code_{idx + 1}.png", qr_buffer.getvalue())
    zip_buffer.seek(0)
    return zip_buffer

4. 构建Streamlit界面

import streamlit as st

# 使用Streamlit构建批量二维码生成器
st.set_page_config(page_title="二维码批量生成工具", page_icon="🔖", layout="centered")

# 使用Streamlit构建批量二维码生成器
st.markdown('<div class="title">🔖 在线二维码生成器</div>', unsafe_allow_html=True)
st.markdown('<div class="subtitle">选择数量并输入内容生成二维码</div>', unsafe_allow_html=True)

# 使用Streamlit构建批量二维码生成器
num_qr_codes = st.number_input("选择要生成的二维码数量:", min_value=1, max_value=20, step=1, value=1)

# 使用Streamlit构建批量二维码生成器
inputs = []
for i in range(num_qr_codes):
   user_input = st.text_input(f"输入内容 {i + 1}:", placeholder=f"输入第 {i + 1} 个二维码的内容")
   inputs.append(user_input)

5. 处理生成和显示逻辑

# 使用Streamlit构建批量二维码生成器
if st.button("生成二维码"):
   qr_data_list = []
   for i, input_data in enumerate(inputs):
       if input_data.strip():
           qr_data_list.append((input_data, generate_qr_code(input_data)))
       else:
           st.warning(f"第 {i + 1} 个输入框为空,跳过生成!")

   if qr_data_list:
       # 显示二维码,每行显示 3 个
       num_per_row = 3
       rows = (len(qr_data_list) + num_per_row - 1) // num_per_row
       for row_idx in range(rows):
           cols = st.columns(num_per_row)
           for col_idx, (data, qr_buffer) in enumerate(
               qr_data_list[row_idx * num_per_row : (row_idx + 1) * num_per_row]
           ):
               with cols[col_idx]:
                   st.image(qr_buffer, caption=f"二维码 {row_idx * num_per_row + col_idx + 1}", width=200)

       # 提供 ZIP 下载按钮
       zip_file = create_zip(qr_data_list)
       st.download_button(
           label="下载所有二维码(ZIP 文件)",
           data=zip_file,
           file_name="qrcodes.zip",
           mime="application/zip",
           help="点击下载生成的所有二维码图片",
       )
   else:
       st.warning("请至少填写一个输入框的内容!")

6. 添加自定义CSS样式

为了美化应用界面,添加以下CSS样式: ``` st.markdown( """ .title { text-align: center; font-size: 3rem; color: #4CAF50; font-weight: bold; margin-bottom: 20px; } .subtitle { text-align: center; font-size: 1.2rem; color: #888; margin-bottom: 40px; } /* 更多样式... */ """, unsafe_allow_html=True, )

 ### 7. 完整代码如下

import streamlit as st import qrcode from io import BytesIO import zipfile

def generate_qr_code(data): """生成二维码并返回二进制流对象。""" qr = qrcode.QRCode( version=1, # 控制二维码大小(1到40,数字越大尺寸越大) error_correction=qrcode.constants.ERROR_CORRECT_H, # 容错级别 box_size=10, # 每个方块的像素大小 border=4, # 边框宽度,单位为方块 ) qr.add_data(data) qr.make(fit=True)

# 生成图片
img = qr.make_image(fill_color="black", back_color="white")

# 将图片保存到字节流中
buffer = BytesIO()
img.save(buffer, format="PNG")
buffer.seek(0)
return buffer

def create_zip(qr_data_list): """将多个二维码图片打包成一个 ZIP 文件并返回二进制流对象。""" zip_buffer = BytesIO() with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED) as zip_file: for idx, (data, qr_buffer) in enumerate(qr_data_list): zip_file.writestr(f"qr_code_{idx + 1}.png", qr_buffer.getvalue()) zip_buffer.seek(0) return zip_buffer

使用Streamlit构建批量二维码生成器

st.set_page_config(page_title="二维码批量生成工具", page_icon="🔖", layout="centered")

使用Streamlit构建批量二维码生成器

st.markdown( """ .title { text-align: center; font-size: 3rem; color: #4CAF50; font-weight: bold; margin-bottom: 20px; } .subtitle { text-align: center; font-size: 1.2rem; color: #888; margin-bottom: 40px; } .input-box { margin: 20px auto; padding: 20px; border-radius: 10px; background-color: #f9f9f9; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); max-width: 600px; } .qr-image { display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; margin-top: 30px; } .qr-container { display: flex; flex-direction: column; align-items: center; margin-bottom: 20px; } .download-btn { margin-bottom: 10px; padding: 10px 20px; font-size: 1rem; font-weight: bold; color: white; background: linear-gradient(90deg, #4CAF50, #2E8B57); border: none; border-radius: 5px; cursor: pointer; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); transition: all 0.3s ease; } .download-btn:hover { background: linear-gradient(90deg, #2E8B57, #4CAF50); box-shadow: 0 6px 8px rgba(0, 0, 0, 0.2); } .char-limit-warning { color: red; font-size: 0.9rem; margin-top: 5px; text-align: right; } """, unsafe_allow_html=True, )

使用Streamlit构建批量二维码生成器

st.markdown('

🔖 在线二维码生成器
', unsafe_allow_html=True) st.markdown('
选择数量并输入内容生成二维码
', unsafe_allow_html=True)

使用Streamlit构建批量二维码生成器

num_qr_codes = st.number_input("选择要生成的二维码数量:", min_value=1, max_value=20, step=1, value=1)

使用Streamlit构建批量二维码生成器

inputs = [] for i in range(num_qr_codes): user_input = st.text_input(f"输入内容 {i + 1}:", placeholder=f"输入第 {i + 1} 个二维码的内容") inputs.append(user_input)

使用Streamlit构建批量二维码生成器

if st.button("生成二维码"): qr_data_list = [] for i, input_data in enumerate(inputs): if input_data.strip(): qr_data_list.append((input_data, generate_qr_code(input_data))) else: st.warning(f"第 {i + 1} 个输入框为空,跳过生成!")

if qr_data_list:
    # 显示二维码,每行显示 3 个
    num_per_row = 3
    rows = (len(qr_data_list) + num_per_row - 1) // num_per_row  # 计算需要的行数
    for row_idx in range(rows):
        cols = st.columns(num_per_row)  # 每行创建 3 个列
        for col_idx, (data, qr_buffer) in enumerate(
            qr_data_list[row_idx * num_per_row : (row_idx + 1) * num_per_row]
        ):
            with cols[col_idx]:
                st.image(qr_buffer, caption=f"二维码 {row_idx * num_per_row + col_idx + 1}", width=200)

    # 打包成 ZIP 文件
    zip_file = create_zip(qr_data_list)

    # 提供 ZIP 下载按钮
    st.download_button(
        label="下载所有二维码(ZIP 文件)",
        data=zip_file,
        file_name="qrcodes.zip",
        mime="application/zip",
        help="点击下载生成的所有二维码图片",
    )
else:
    st.warning("请至少填写一个输入框的内容!")
 ## 项目亮点
 1. 动态输入框 :根据用户选择的数量动态生成输入框
2. 响应式布局 :使用列布局实现美观的多行多列显示
3. 批量下载 :支持将所有生成的二维码打包下载
4. 错误处理 :提供空输入验证和警告信息
5. 美观UI :使用自定义CSS美化界面
 ## 运行应用
 将上述代码保存为 `batch_barcode.py` ,然后运行: ```
streamlit run batch_barcode.py

访问浏览器中显示的本地URL(通常是 http://localhost:8501 )即可使用应用。 ## 扩展思路

  • 添加更多二维码自定义选项(颜色、大小、纠错级别)
  • 支持批量导入数据(CSV文件上传)
  • 添加条形码生成功能
  • 实现二维码内容预览功能
  • 支持生成带Logo的二维码

结论

通过Streamlit,我们能够快速构建一个功能齐全的二维码生成Web应用,无需编写HTML、CSS或JavaScript代码。这种开发方式非常适合原型设计和内部工具开发,大大提高了开发效率。 希望这个项目能为你提供参考,帮助你构建自己的Streamlit应用!

原文链接: www.cnblogs.com/1314520xh/p…