告别前端焦虑!用 Streamlit 10 分钟把 Python 脚本变成可交互网页

作为一名 Python 开发者,你是否曾遇到过这样的场景:花了 3 天写好一个图片处理脚本、数据分析工具或 AI 推理程序,想分享给同事或朋友使用,对方却一脸为难 ——“我不会装 Python 环境啊”“命令行怎么用?”。

以前,解决这个问题需要你额外学习 HTML、CSS、JavaScript,搭建 Flask/Django 后端,才能把 Python 功能包装成网页。但现在,有了Streamlit,这一切都变得简单了 —— 你只需要会写 Python,就能在 10 分钟内把脚本变成带交互界面的网页,全程无需一行前端代码。

这篇博客会从基础到实战,带你掌握 Streamlit 的核心用法,最后还会教你如何把网页部署到云端,让全世界都能访问你的工具。

一、认识 Streamlit:Python 开发者的网页神器

在开始动手前,我们先搞懂一个问题:Streamlit 到底是什么?

Streamlit 是 2019 年推出的一个 Python 库,核心定位是 “快速构建数据应用的网页框架”。它的设计理念非常简单 ——“Write once, run anywhere”:你写的 Python 代码,运行后自动变成网页,代码修改后网页还能实时刷新。

举个直观的例子:你写一行st.title("我的工具"),运行后网页上就会出现一个标题;你写st.button("点击我"),网页上就会生成一个可点击的按钮。这种 “代码即界面” 的模式,彻底消除了 Python 开发者做网页的门槛。

为什么选择 Streamlit?

对比传统的 Flask/Django 和前端框架,Streamlit 的优势非常明显:

特性

Streamlit

Flask/Django + 前端框架

开发效率

10 分钟出原型

至少几小时甚至几天

技术栈要求

仅需 Python

Python + HTML + CSS + JavaScript

交互逻辑编写

纯 Python 代码(同步执行)

需要前后端通信(异步 /ajax)

实时刷新

自动支持(修改代码即更新)

需要手动配置热重载

部署难度

一键部署到 Streamlit Cloud

需要配置服务器、Nginx 等

简单来说,如果你需要快速把 Python 功能(数据分析、AI 模型、工具脚本)变成可交互网页,Streamlit 是目前最优解。

二、环境搭建:3 步搞定 Streamlit 安装

Streamlit 的安装非常简单,无论你用 Windows、Mac 还是 Linux,都能在 5 分钟内完成。

1. 确保 Python 环境正常

首先,你需要有 Python 3.8 及以上版本(Streamlit 对 Python 版本有要求,老版本可能不兼容)。打开终端,输入以下命令检查 Python 版本:

python --version # Windows

# 或

python3 --version # Mac/Linux

如果显示Python 3.8.x或更高版本,就可以继续;如果版本过低,建议先升级 Python(推荐用 Anaconda 管理环境)。

2. 安装 Streamlit

直接用 pip 安装即可,命令如下:

pip install streamlit

如果你用 Anaconda 环境,也可以用 conda 安装:

conda install -c conda-forge streamlit

3. 验证安装成功

安装完成后,运行 Streamlit 的官方示例程序,测试是否能正常工作:

streamlit hello

执行命令后,终端会显示启动日志,同时自动打开浏览器,显示 Streamlit 的示例网页(默认地址是http://localhost:8501)。

如果浏览器能正常显示以下界面,说明安装成功:

  • 顶部有 “Welcome to Streamlit!” 的标题
  • 中间有几个示例应用(如 “DataFrame Demo”“Plotting Demo”)
  • 左侧有侧边栏,右侧有交互按钮

至此,你的 Streamlit 环境已经搭建完成,接下来就可以开始写自己的网页了。

三、基础入门:用 Python 代码 “画” 网页

Streamlit 的核心思想是 “代码即界面”—— 你写的每一行 Python 代码,都会对应网页上的一个元素。我们从最简单的文本、按钮、输入框开始,逐步掌握基础组件的用法。

3.1 第一个 Streamlit 脚本:Hello World

新建一个名为first_app.py的 Python 文件,写入以下代码:

# 导入Streamlit库,约定俗成简称为st

import streamlit as st

# 1. 页面标题(一级标题)

st.title("我的第一个Streamlit网页")

# 2. 二级标题

st.subheader("这是二级标题")

# 3. 普通文本(支持Markdown格式)

st.write("这是一段普通文本,Streamlit会自动渲染它。")

st.write("你还可以用**Markdown语法**,比如加粗、斜体(*这样*)、列表:")

st.write("""

- 第一项

- 第二项

- 第三项

""")

# 4. 显示变量或计算结果

num1 = 10

num2 = 20

st.write(f"计算结果:{num1} + {num2} = {num1 + num2}")

# 5. 显示图片(本地图片或网络图片)

# 网络图片(直接传URL)

st.image("https://streamlit.io/images/brand/streamlit-logo-secondary-colormark-darktext.png",

caption="Streamlit Logo", # 图片标题

use_column_width=True) # 图片宽度适应网页列宽

# 本地图片(需要图片在当前文件夹,或写完整路径)

# st.image("local_image.jpg", caption="本地图片")

3.2 运行网页并实时刷新

在终端中,进入first_app.py所在的文件夹,执行以下命令运行网页:

streamlit run first_app.py

此时会出现以下日志:

You can now view your Streamlit app in your browser.

Local URL: http://localhost:8501

Network URL: http://192.168.1.100:8501

External URL: http://203.0.113.100:8501(如果有公网IP)

浏览器会自动打开http://localhost:8501,你会看到代码对应的网页界面。

实时刷新功能:如果你修改了first_app.py的代码(比如改标题为 “我的 Streamlit 工具”),保存后网页会自动刷新,无需重启程序。这个功能对开发非常友好,你可以边写代码边看效果。

3.3 核心交互组件:让网页 “活” 起来

单纯显示内容还不够,网页需要交互功能。Streamlit 提供了几十种交互组件,全部用 Python 代码调用,下面介绍最常用的几种。

(1)按钮(Button):触发操作

按钮是最基础的交互组件,点击后可以执行特定代码。示例代码:

import streamlit as st

st.title("按钮交互示例")

# 创建一个按钮,按钮文字是“点击我”

if st.button("点击我,显示隐藏内容"):

# 按钮被点击时,执行以下代码

st.success("按钮被点击啦!🎉") # 绿色成功提示

st.write("这是点击按钮后显示的隐藏内容~")

else:

# 按钮未被点击时,显示的内容(可选)

st.info("点击上方按钮,查看隐藏内容") # 蓝色信息提示
(2)输入框(Text Input):获取用户文本

输入框用于获取用户输入的字符串(如名字、邮箱、关键词等)。示例代码:

import streamlit as st

st.title("输入框示例")

# 创建输入框,参数分别是:提示文字、默认值(可选)

name = st.text_input("请输入你的名字", value="张三")

# 创建密码输入框(输入内容会隐藏)

password = st.text_input("请输入密码", type="password")

# 创建多行文本输入框(用于大段文字)

comment = st.text_area("请输入备注", height=100) # height设置输入框高度

# 当用户输入后,显示结果

if name and password:

st.write(f"你好,{name}!你的密码是:{password}(已隐藏,实际开发中不要显示密码!)")

if comment:

st.write(f"你的备注:{comment}")
(3)下拉选择框(Selectbox):从列表选选项

如果用户需要从固定选项中选择(比如选择城市、类型、模型等),用下拉选择框更合适。示例代码:

import streamlit as st

st.title("下拉选择框示例")

# 1. 普通下拉框

city = st.selectbox(

"请选择你所在的城市", # 提示文字

["北京", "上海", "广州", "深圳", "其他"] # 选项列表

)

# 2. 带默认值的下拉框(默认选第2个选项,索引从0开始)

fruit = st.selectbox(

"请选择你喜欢的水果",

["苹果", "香蕉", "橙子", "葡萄"],

index=1 # 默认选“香蕉”

)

# 3. 多选下拉框(用st.multiselect)

hobbies = st.multiselect(

"请选择你的爱好(可多选)",

["读书", "运动", "看电影", "编程", "旅行"],

default=["编程", "旅行"] # 默认选中的选项

)

# 显示选择结果

st.write(f"你所在的城市:{city}")

st.write(f"你喜欢的水果:{fruit}")

st.write(f"你的爱好:{hobbies}")
(4)滑块(Slider):选择数值范围

滑块用于让用户选择数值(如年龄、分数、比例等),支持整数、浮点数和日期。示例代码:

import streamlit as st

import datetime

st.title("滑块示例")

# 1. 整数滑块(最小值、最大值、默认值)

age = st.slider("请选择你的年龄", min_value=0, max_value=120, value=25)

# 2. 浮点数滑块(支持小数)

height = st.slider("请选择你的身高(米)", min_value=0.5, max_value=2.5, value=1.75, step=0.01)

# 3. 范围滑块(选择一个区间)

score_range = st.slider("请选择分数范围", min_value=0, max_value=100, value=(60, 80))

# 4. 日期滑块

date_range = st.slider(

"请选择日期范围",

min_value=datetime.date(2024, 1, 1),

max_value=datetime.date(2024, 12, 31),

value=(datetime.date(2024, 5, 1), datetime.date(2024, 5, 31))

)

# 显示选择结果

st.write(f"你的年龄:{age}岁")

st.write(f"你的身高:{height}米")

st.write(f"分数范围:{score_range[0]} - {score_range[1]}分")

st.write(f"日期范围:{date_range[0]} 到 {date_range[1]}")
(5)文件上传(File Uploader):接收用户文件

文件上传组件非常实用,比如让用户上传图片、Excel 表格、CSV 数据等,然后用 Python 处理。示例代码:

import streamlit as st

import pandas as pd # 用于处理Excel/CSV文件

st.title("文件上传示例")

# 1. 上传Excel/CSV文件(用于数据分析)

data_file = st.file_uploader(

"上传Excel或CSV文件",

type=["xlsx", "csv"], # 支持的文件类型

accept_multiple_files=False # 是否允许上传多个文件

)

if data_file is not None:

# 根据文件类型读取数据

if data_file.name.endswith(".csv"):

df = pd.read_csv(data_file)

else: # xlsx

df = pd.read_excel(data_file)

# 显示数据基本信息

st.subheader("数据预览")

st.dataframe(df.head(10)) # 显示前10行数据(交互式表格)

st.subheader("数据统计信息")

st.write(f"数据行数:{len(df)}")

st.write(f"数据列数:{len(df.columns)}")

st.write("列名:", list(df.columns))

# 2. 上传图片文件(后续可以用PIL/OpenCV处理)

image_file = st.file_uploader(

"上传图片",

type=["jpg", "png", "jpeg"],

accept_multiple_files=False

)

if image_file is not None:

# 显示图片

st.subheader("上传的图片")

st.image(

image_file,

caption=f"图片名称:{image_file.name},大小:{image_file.size}字节",

use_column_width=True

)

3.4 布局调整:让网页更美观

默认情况下,Streamlit 的组件是从上到下依次排列的。如果需要更灵活的布局(比如左右分栏、侧边栏),可以用 Streamlit 提供的布局功能。

(1)侧边栏(Sidebar):把组件放在左侧

侧边栏适合放次要的交互组件(如参数设置、筛选条件),不占用主内容区域。示例代码:

import streamlit as st

st.title("侧边栏示例")

# 1. 在侧边栏添加组件(用st.sidebar.xxx)

st.sidebar.title("侧边栏设置")

# 侧边栏的下拉框

model = st.sidebar.selectbox("选择模型", ["模型A", "模型B", "模型C"])

# 侧边栏的滑块

confidence = st.sidebar.slider("置信度阈值", 0.0, 1.0, 0.5)

# 侧边栏的按钮

if st.sidebar.button("应用设置"):

st.success(f"已应用设置:模型={model},置信度={confidence}")

# 2. 主内容区域显示结果

st.subheader("主内容区域")

st.write(f"当前选择的模型:{model}")

st.write(f"当前置信度阈值:{confidence}")
(2)分栏(Columns):左右 / 多栏布局

如果需要在同一行显示多个组件(比如两个图片、两个按钮),可以用st.columns()创建分栏。示例代码:

import streamlit as st

st.title("分栏布局示例")

# 1. 创建2个等宽的分栏

col1, col2 = st.columns(2) # 参数2表示2个分栏,默认等宽

# 在col1中添加内容

with col1:

st.subheader("左栏")

st.image("https://picsum.photos/id/237/400/300", use_column_width=True)

st.button("左栏按钮")

# 在col2中添加内容

with col2:

st.subheader("右栏")

st.image("https://picsum.photos/id/238/400/300", use_column_width=True)

st.button("右栏按钮")

# 2. 创建不等宽的分栏(按比例分配宽度)

col3, col4, col5 = st.columns([1, 2, 1]) # 宽度比例1:2:1

with col3:

st.subheader("窄栏1")

st.write("宽度比例1")

with col4:

st.subheader("宽栏")

st.write("宽度比例2(中间栏最宽)")

with col5:

st.subheader("窄栏2")

st.write("宽度比例1")
(3)容器(Container):分组管理组件

容器可以把多个组件分组,方便控制它们的显示 / 隐藏,或调整位置。示例代码:

import streamlit as st

st.title("容器示例")

# 创建一个容器

container = st.container()

# 向容器中添加组件

with container:

st.subheader("这是一个容器")

st.write("容器内的文本")

st.button("容器内的按钮")

# 容器外的组件

st.write("这是容器外的文本")

# 条件显示容器(比如点击按钮后显示)

st.subheader("条件显示容器")

show_container = st.button("显示隐藏的容器")

if show_container:

# 创建一个临时容器

temp_container = st.container(border=True) # border=True显示边框

with temp_container:

st.success("这是点击按钮后显示的容器")

st.write("容器内的内容可以分组管理")

四、实战案例:把 Python 图片处理脚本变成网页

学完基础组件后,我们来做一个实战案例:把一个 “图片风格转换” 的 Python 脚本,用 Streamlit 包装成可交互网页。

4.1 准备工作:现有 Python 脚本

假设我们已经有一个图片风格转换的脚本(style_transfer.py),核心功能是用预训练模型把普通图片转换成动漫风格(这里简化逻辑,用 PIL 模拟风格转换):

# style_transfer.py

from PIL import Image, ImageFilter

def convert_to_anime_style(image: Image.Image) -> Image.Image:

"""

把普通图片转换成动漫风格(模拟实现)

:param image: 输入PIL图片

:return: 动漫风格图片

"""

# 步骤1:调整尺寸(缩小图片,模拟动漫的简洁感)

max_size = 512

image.thumbnail((max_size, max_size))

# 步骤2:边缘增强(模拟动漫的线条感)

image = image.filter(ImageFilter.EDGE_ENHANCE_MORE)

# 步骤3:颜色调整(增加饱和度,模拟动漫的鲜艳色彩)

enhancer = ImageEnhance.Color(image)

image = enhancer.enhance(1.5) # 饱和度增加50%

# 步骤4:对比度调整

enhancer = ImageEnhance.Contrast(image)

image = enhancer.enhance(1.2) # 对比度增加20%

return image

(注:实际的动漫风格转换需要用 AI 模型,这里用 PIL 模拟是为了简化案例,你可以替换成真实的模型推理代码。)

4.2 用 Streamlit 包装成网页

新建一个anime_style_app.py文件,写入以下代码,把上面的 Python 功能包装成网页:

import streamlit as st

from PIL import Image, ImageEnhance

import os

# 导入现有的图片风格转换功能

from style_transfer import convert_to_anime_style

# ---------------------- 页面配置 ----------------------

# 设置页面标题、图标和布局(必须放在所有其他Streamlit代码之前)

st.set_page_config(

page_title="动漫风格转换工具", # 网页标题(浏览器标签显示)

page_icon="🎨", # 网页图标(浏览器标签显示,支持emoji或本地图片路径)

layout="wide" # 网页布局:"centered"(居中)或"wide"(宽屏)

)

# ---------------------- 页面内容 ----------------------

# 1. 标题和介绍

st.title("🎨 动漫风格转换工具")

st.markdown("""

上传一张普通图片,一键转换成动漫风格!

支持格式:JPG、PNG、JPEG

""")

# 2. 分栏布局:左栏上传图片,右栏显示结果

col_upload, col_result = st.columns(2, gap="large") # gap设置两栏之间的间距

# 3. 左栏:上传图片

with col_upload:

st.subheader("上传原图")

# 创建文件上传组件

uploaded_file = st.file_uploader(

"点击上传图片",

type=["jpg", "png", "jpeg"],

accept_multiple_files=False

)

# 显示上传的原图

if uploaded_file is not None:

# 读取上传的图片(PIL格式)

original_image = Image.open(uploaded_file)

# 显示原图

st.image(

original_image,

caption=f"原图(尺寸:{original_image.size[0]}x{original_image.size[1]})",

use_column_width=True

)

# 保存原图到临时文件夹(可选,方便后续处理)

original_image.save("temp_original.jpg")

st.success("图片上传成功!点击下方按钮开始转换~")

# 转换按钮

convert_btn = st.button("开始转换为动漫风格", key="convert_btn")

else:

st.info("请上传一张图片")

convert_btn = False

# 4. 右栏:显示转换结果

with col_result:

st.subheader("动漫风格结果")

# 如果点击了转换按钮且有上传的图片

if convert_btn and uploaded_file is not None:

# 显示加载状态(处理耗时操作时很有用)

with st.spinner("正在转换中...请稍候"):

# 调用现有功能进行风格转换

anime_image = convert_to_anime_style(original_image)

# 显示转换后的图片

st.image(

anime_image,

caption=f"动漫风格图(尺寸:{anime_image.size[0]}x{anime_image.size[1]})",

use_column_width=True

)

# 保存结果图片(用于下载)

anime_image.save("temp_anime.jpg")

# 提供下载按钮

with open("temp_anime.jpg", "rb") as f:

st.download_button(

label="下载动漫风格图",

data=f,

file_name=f"anime_style_{uploaded_file.name}", # 下载文件名

mime="image/jpeg" # 文件类型

)

else:

st.info("转换后的图片将显示在这里")

# 5. 底部提示

st.markdown("""

---

**注意事项**:

1. 图片越大,转换时间越长(建议图片尺寸不超过1024x1024)

2. 转换效果因原图内容而异,人像和风景效果最佳

3. 本工具仅为演示,实际效果可替换为AI模型(如AnimeGAN2)

""")

4.3 运行网页并测试

在终端中执行以下命令,运行网页:

streamlit run anime_style_app.py

浏览器打开http://localhost:8501后,你可以:

  1. 点击 “上传图片”,选择一张本地图片
  1. 点击 “开始转换为动漫风格”,等待几秒
  1. 查看转换后的动漫风格图片
  1. 点击 “下载动漫风格图”,保存结果到本地

至此,你已经成功把一个 Python 脚本变成了可交互的网页工具!如果要提升效果,只需要把convert_to_anime_style函数替换成真实的 AI 模型推理代码(如 AnimeGAN2、StyleGAN 等),网页的其他部分完全不用改。

五、进阶技巧:让你的网页更专业

5.1 缓存优化:加速耗时操作

如果你的网页中有耗时操作(如加载大型 AI 模型、处理大文件),每次刷新网页都会重新执行这些操作,导致速度很慢。Streamlit 提供了缓存装饰器@st.cache_data,可以缓存这些操作的结果,相同输入下不再重复执行。

示例:缓存 AI 模型加载

import streamlit as st

import torch

from model import Generator # 假设这是你的AI模型

# 用缓存装饰器缓存模型加载(只加载一次)

@st.cache_data(show_spinner="正在加载模型...") # show_spinner显示加载提示

def load_anime_model(model_path: str):

"""加载动漫风格转换模型"""

model = Generator()

model.load_state_dict(torch.load(model_path, map_location="cpu"))

model.eval()

return model

# 加载模型(第一次运行会加载,后续刷新网页直接用缓存的模型)

model = load_anime_model("anime_model.pt")

# 后续使用model进行推理,无需重复加载

5.2 主题定制:修改网页样式

Streamlit 默认提供了浅色和深色两种主题,你还可以自定义主题(如颜色、字体、圆角等)。

方法 1:通过网页设置临时修改

在网页的右上角,点击 “☰”(菜单)→“Settings”→“Theme”,可以选择 “Light”“Dark” 或 “Custom”(自定义),调整主色调、文本颜色、背景色等。

方法 2:通过配置文件永久修改

在项目文件夹中创建一个.streamlit文件夹,在里面新建config.toml文件,写入以下内容(示例):

# .streamlit/config.toml

[theme]

primaryColor = "#2E86AB" # 主色调(按钮、标题等)

backgroundColor = "#F5F5F5" # 背景色

secondaryBackgroundColor = "#E8E8E8" # 次要背景色(分栏、容器)

textColor = "#262730" # 文本颜色

font = "sans serif" # 字体("sans serif"、"serif"、"monospace")

保存后,运行网页会自动应用这些主题设置。

5.3 错误处理:让网页更健壮

在实际使用中,用户可能会上传错误格式的文件、输入非法值,或者程序运行中出现异常。需要添加错误处理,避免网页崩溃。

示例:处理文件上传错误

import streamlit as st

from PIL import UnidentifiedImageError

st.title("错误处理示例")

uploaded_file = st.file_uploader("上传图片", type=["jpg", "png"])

if uploaded_file is not None:

try:

# 尝试读取图片(可能会抛出异常)

image = Image.open(uploaded_file)

st.image(image, use_column_width=True)

except UnidentifiedImageError:

# 处理“不是图片文件”的错误

st.error("上传的文件不是有效的图片,请重新选择!")

except Exception as e:

# 处理其他未知错误

st.error(f"处理图片时出错:{str(e)}")

六、部署上线:让全世界访问你的网页

写好网页后,如何让其他人访问?Streamlit 提供了多种部署方式,从本地共享到云端部署都支持。

6.1 本地共享(同一局域网)

如果你的同事或朋友和你在同一 WiFi 下,可以通过 “Network URL” 访问你的网页。

运行网页时,终端会显示:

Local URL: http://localhost:8501

Network URL: http://192.168.1.100:8501

把Network URL(如http://192.168.1.100:8501)发给对方,对方在浏览器中输入这个地址,就能访问你的网页。

6.2 部署到 Streamlit Cloud(免费,推荐)

Streamlit 官方提供了免费的云端部署服务 “Streamlit Community Cloud”,适合部署小型网页(每月有一定的访问额度,个人使用完全足够)。

部署步骤:
  1. 准备 GitHub 仓库
    • 必须创建requirements.txt文件,列出所有依赖包及其版本(如streamlit==1.32.0、pillow==10.2.0、torch==2.2.1),否则云端无法安装依赖。
  1. 登录 Streamlit Cloud
  1. 创建新应用
    • 点击右上角 “New app”→“From existing repo”。
    • 选择你的 GitHub 仓库、分支(默认是main)、主文件(如anime_style_app.py)。
    • 点击 “Deploy”,开始部署。
  1. 等待部署完成
    • 部署过程中,会显示 “Building app”“Installing dependencies” 等日志。

6.3 部署到其他云端平台

如果 Streamlit Cloud 满足不了你的需求(如需要更大的存储空间、更高的访问量),还可以部署到其他云端平台,如:

  • Heroku:支持 Python 应用部署,免费计划适合小型项目。
  • AWS EC2:需要自己配置服务器,适合有一定运维经验的用户。
  • Google Colab:可以把 Streamlit 网页运行在 Colab 上,通过隧道工具(如ngrok)分享。

七、总结:Streamlit 能做什么?

通过这篇博客,你应该已经掌握了 Streamlit 的核心用法。最后,我们来总结一下 Streamlit 的适用场景:

适合用 Streamlit 的场景:

  1. 快速原型开发:把 Python 功能(数据分析、AI 模型、工具脚本)快速变成网页原型。
  1. 内部工具共享:给团队写数据看板、自动化工具、模型测试界面。
  1. 教学演示:展示 Python 代码的运行结果,或教别人使用你的工具。
  1. 个人项目展示:把你的 AI 项目、数据分析成果部署到云端,作为作品集。

不适合用 Streamlit 的场景:

  1. 高并发商业应用:Streamlit 是单线程的,不适合处理大量并发请求(如电商网站)。
  1. 复杂的前端交互:如果需要复杂的前端动画、实时聊天等,建议用专业前端框架(如 React、Vue)。

Streamlit 的核心价值在于 “降低门槛,提升效率”—— 它让 Python 开发者不用学习前端技术,就能专注于核心功能,快速产出可交互的网页工具。无论是个人使用、团队协作还是项目展示,Streamlit 都是一个值得尝试的神器。

现在,就去把你之前写的 Python 脚本变成网页吧! 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遗憾是什么.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值