使用 Streamlit 打造一个简单的照片墙应用
在现代 web 开发中,快速构建交互式应用是一项重要的技能。Streamlit 是一个强大的 Python 库,允许开发者以最小的代码量创建美观且功能丰富的 web 应用。今天,我们将通过分析一段简单的 Streamlit 代码,展示如何构建一个照片墙应用,让用户可以上传图片并以网格形式展示。
C:\pythoncode\new\output\Photo_Wall.py
代码分析
以下是我们将要分析的代码,这是一个基于 Streamlit 的照片墙应用:
import streamlit as st
from PIL import Image
import os# 页面标题
st.title("优美的照片墙")# 创建文件上传控件
uploaded_files = st.file_uploader("上传图片文件", type=["jpg", "jpeg", "png"], accept_multiple_files=True)# 显示照片墙
if uploaded_files:st.subheader("照片墙展示")cols = st.columns(4) # 设置列数,可根据需要调整# 遍历上传的图片文件for i, uploaded_file in enumerate(uploaded_files):# 使用 PIL 打开图片image = Image.open(uploaded_file)# 将图片显示在列中with cols[i % 4]: # 控制图片排列,每行显示4列st.image(image, use_column_width=True)
else:st.warning("请上传图片文件以生成照片墙!")
代码功能分解
-
导入必要的库:
streamlit as st
:Streamlit 库,用于构建交互式 web 界面。PIL.Image
:Python Imaging Library(Pillow),用于处理图片文件。os
:虽然代码中未直接使用os
,但导入它可能是为了后续可能的扩展(如文件路径操作)。
-
设置页面标题:
st.title("优美的照片墙")
:在页面顶部显示一个标题,简洁明了地告诉用户这是一个照片墙应用。
-
文件上传控件:
st.file_uploader
:创建一个文件上传控件,限制文件类型为常见的图片格式(jpg、jpeg、png),并允许用户一次上传多个文件(accept_multiple_files=True
)。
-
条件渲染照片墙:
- 如果用户上传了图片(
if uploaded_files
),则显示一个子标题“照片墙展示”并创建一个包含 4 列的网格布局(st.columns(4)
)。 - 如果没有上传图片,则显示警告信息(
st.warning
),提示用户上传图片。
- 如果用户上传了图片(
-
遍历并显示图片:
- 使用
enumerate
遍历上传的文件列表,获取索引i
和文件对象uploaded_file
。 - 使用
PIL.Image.open
打开图片文件。 - 通过
i % 4
将图片分配到 4 列中的一列,确保图片按顺序填充网格。 st.image(image, use_column_width=True)
:将图片显示在指定列中,并自动调整大小以适应列宽。
- 使用
代码的优点
- 简洁易懂:代码结构清晰,逻辑简单,适合初学者学习。
- 响应式设计:通过
use_column_width=True
,图片会自动适应列宽,确保在不同设备上显示良好。 - 用户友好:提供明确的提示信息(如警告),提升用户体验。
- 可扩展性:代码逻辑简单,可以轻松添加新功能,如调整列数、添加图片滤镜等。
代码的改进空间
-
错误处理:
- 当前代码未处理上传无效图片文件的情况(如损坏的图片文件)。可以添加
try-except
块来捕获异常并提示用户。 - 示例改进:
try:image = Image.open(uploaded_file)with cols[i % 4]:st.image(image, use_column_width=True) except Exception as e:st.error(f"无法加载图片 {uploaded_file.name}:{str(e)}")
- 当前代码未处理上传无效图片文件的情况(如损坏的图片文件)。可以添加
-
动态列数:
- 列数固定为 4,可能不适合所有场景。可以根据屏幕大小或用户输入动态调整列数。
- 示例改进:
num_cols = st.slider("选择列数", min_value=1, max_value=6, value=4) cols = st.columns(num_cols) with cols[i % num_cols]:st.image(image, use_column_width=True)
-
图片预览优化:
- 可以添加图片缩略图或限制上传文件大小,以提高性能。
- 示例改进:
image = Image.open(uploaded_file).resize((200, 200)) # 调整为缩略图
-
样式美化:
- Streamlit 支持自定义 CSS,可以为照片墙添加边框、阴影或动画效果,提升视觉吸引力。
- 示例改进:
st.markdown(""" <style> img {border-radius: 10px;box-shadow: 2px 2px 5px rgba(0,0,0,0.3); } </style> """, unsafe_allow_html=True)
如何运行这个应用
-
安装依赖:
确保已安装 Streamlit 和 Pillow:pip install streamlit pillow
-
保存代码:
将代码保存为app.py
。 -
运行应用:
在终端中运行以下命令:streamlit run app.py
-
访问应用:
浏览器会自动打开http://localhost:8501
,你就可以上传图片并查看照片墙了!
运行结果
相关文章:
使用 Streamlit 打造一个简单的照片墙应用
在现代 web 开发中,快速构建交互式应用是一项重要的技能。Streamlit 是一个强大的 Python 库,允许开发者以最小的代码量创建美观且功能丰富的 web 应用。今天,我们将通过分析一段简单的 Streamlit 代码,展示如何构建一个照片墙应用…...
深度学习优化器和调度器的选择和推荐
一、常用优化器对比 1. 随机梯度下降(SGD) 原理:每次迭代使用小批量数据计算梯度并更新参数。优点:实现简单,适合大规模数据集。缺点:收敛速度慢,容易陷入局部最优或鞍点。适用场景࿱…...
“时间”,在数据处理中的真身——弼马温一般『无所不能』(DeepSeek)
电子表格时间处理真理:数值存储最瘦身,真身闯关通四海。 笔记模板由python脚本于2025-04-23 22:25:59创建,本篇笔记适合喜欢在电子表格中探求时间格式的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验…...
为什么Spring中@Bean注解默认创建单例Bean
在Spring框架中,使用Bean注解定义的对象默认确实是单例的,这是由Spring容器的设计哲学和实际需求决定的。下面我从多个角度解释这一设计选择的原因和机制。 1. Spring Bean作用域基础 Spring定义了多种Bean作用域,其中默认是单例(Singleton…...
GPLT-2025年第十届团体程序设计天梯赛总决赛题解(2025天梯赛题解,共计266分)
今天偶然发现天梯赛的代码还保存着,于是决定写下这篇题解,也算是复盘一下了 L1本来是打算写的稳妥点,最后在L1-6又想省时间,又忘记了insert,replace这些方法怎么用,也不想花时间写一个文件测试,…...
JDK(Ubuntu 18.04.6 LTS)安装笔记
一、前言 本文与【MySQL 8(Ubuntu 18.04.6 LTS)安装笔记】同批次:先搭建数据库,再安装JDK,后面肯定就是部署Web应用:典型的单机部署。“麻雀虽小五脏俱全”,善始善终,还是记下来吧。…...
Java 拦截器完全指南:原理、实战与最佳实践
一、引言 拦截器的基本概念 在现代 Java Web 开发中,拦截器(Interceptor)是一种用于在请求处理前后插入自定义逻辑的机制。简单来说,它是一种“横切逻辑处理器”,可以用来对请求进行预处理、后处理,甚至终…...
2025.04.23华为机考第二题-200分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 魔法彩灯森林 问题描述 在卢小姐的魔法花园中,有一棵神奇的彩灯树。这棵树的每个节点都装有一盏魔法灯,灯有三种颜色状态:红色(用数字1表示)、绿色(用数字2表示)和蓝色(…...
【Leetcode 每日一题】1399. 统计最大组的数目
问题背景 给你一个整数 n n n。请你先求出从 1 1 1 到 n n n 的每个整数 10 10 10 进制表示下的数位和(每一位上的数字相加),然后把数位和相等的数字放到同一个组中。 请你统计每个组中的数字数目,并返回数字数目并列最多的组…...
系统重装——联想sharkbay主板电脑
上周给一台老电脑重装系统系统,型号是lenovo sharkbay主板的电脑,趁着最近固态便宜,入手了两块长城的固态,装上以后插上启动U盘,死活进不去boot系统。提示 bootmgr 缺失,上网查了许久,终于解决了…...
Python数据清洗笔记(上)
一、数据清洗概述 数据清洗是数据分析过程中至关重要的一步,约占整个数据分析过程的60%-80%的时间。主要包括处理缺失值、异常值、重复值、格式不一致等问题。 二、常用工具 主要使用Python的Pandas库进行数据清洗: import pandas as pd import nump…...
三、Python编程基础03
目录 一、debug 调试的使用1. 打断点2. 右键 Debug 运行代码3. 单步执行代码,查看过程 二、字符串1、定义与下标引用2、切片3、查找4、去除空白字符5、转换大小写与拆分6、其他方法-替换、连接、是否为纯数字7、登录案例优化 三、列表 list1、列表基础操作2、案例: …...
西门子S7-200SMART 控制Profinet闭环步进MD-4250-PN (1)电机及专栏介绍
一、前言 本系列是我继 《西门子S7-1200PLC 控制步进电机 MD-4240-PN》系列专栏后,新开的一篇专栏。 系列的主题围绕 S7-200SMART Profinet闭环步进(MD-4250-PN) 触摸屏的硬件,预计作四篇文章,分别为:专栏介绍、硬件介绍、PLC…...
NoSQL 简单讲解
目录 1. NoSQL 的背景与意义 1.1 数据库的演变 1.2 NoSQL 的兴起 2. NoSQL 数据库的分类 2.1 键值存储(Key-Value Stores) 2.2 文档数据库(Document Stores) 2.3 列族存储(Column-Family Stores) 2.…...
TCP 协议:原理、机制与应用
一、引言 在当今数字化的时代,网络通信无处不在,而 TCP(Transmission Control Protocol,传输控制协议)作为互联网协议栈中的核心协议之一,扮演着至关重要的角色。无论是浏览网页、发送电子邮件还是进行文件…...
C++23 新特性:令声明顺序决定非静态类数据成员的布局 (P1847R4)
文章目录 引言背景知识非静态类数据成员类的内存布局 P1847R4提案内容示例代码 影响和优势提高代码的可预测性与其他语言和库的交互更加方便简化代码调试和优化 编译器支持情况实际应用场景嵌入式系统开发跨语言编程内存优化 总结 引言 在C的发展历程中,每一个新版…...
Java 环境配置详解(Windows、macOS、Linux)
Java 环境配置是学习和开发 Java 程序的第一步,也是至关重要的一步。一个正确配置的 Java 环境能够保证你的 Java 程序能够顺利编译、运行和调试。本文将详细介绍在 Windows、macOS 和 Linux 三种主流操作系统上配置 Java 环境的步骤,力求详尽、易懂&…...
ChatBEV:一种理解 BEV 地图的可视化语言模型
25年3月来自上海交大、上海AI实验室、同济大学和MAGIC的论文“ChatBEV: A Visual Language Model that Understands BEV Maps”。 交通场景理解对于智能交通系统和自动驾驶至关重要,可确保车辆安全高效地运行。虽然 VLM 的最新进展已显示出整体场景理解的前景&…...
利用Python爬虫实现百度图片搜索的PNG图片下载
在图像识别、训练数据集构建等场景中,我们经常需要从互联网上批量下载图片素材。百度图片是中文搜索中最常用的来源之一。本文将介绍如何使用Python构建一个稳定、可扩展的百度图片爬虫,专门用于下载并保存高清PNG格式图片。 一、项目目标 本项目的目标…...
自主可控鸿道Intewell工业实时操作系统
鸿道Intewell工业实时操作系统是东土科技旗下科东软件自主研发的新一代智能工业操作系统,以下是相关介绍: 系统架构 -Intewell-C全实时构型:设备上只运行自研RTOS的全实时系统,适用于有功能安全认证需求的实时控制场景…...
【数据结构入门训练DAY-21】信息学奥赛一本通T1334-围圈报数
文章目录 前言一、题目二、解题思路结语 前言 本次训练内容 STL库中队列的使用练习。训练解题思维 一、题目 有n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数&am…...
【C语言】C语言中的字符函数和字符串函数全解析
前言 在C语言编程中,字符和字符串的处理是必不可少的。C语言标准库提供了丰富的字符和字符串函数,这些函数极大地简化了字符和字符串的操作。本文将详细介绍这些函数的使用方法、模拟实现以及一些实用的代码示例,帮助你更好地理解和掌握它们…...
声纹振动传感器在电力监测领域的应用
声纹振动传感器在电力监测领域有多种应用,主要包括以下几个方面: 变压器监测 故障诊断:变压器在运行过程中会产生特定的声纹和振动信号,当变压器内部出现故障,如绕组短路、铁芯松动、局部放电等,其声纹和振…...
配色之道:解码产品设计中的UI设计配色艺术
在数字化时代,用户界面(UI)作为产品与用户交互的桥梁,其设计质量直接影响着用户体验与产品成败。而配色,作为UI设计中最为直观且富有表现力的元素之一,不仅是视觉美学的体现,更是情感传递、信息…...
python基础语法测试
1. 关于Python语言数值操作符,以下选项中描述错误的是 A x%y表示x与y之商的余数,也称为模运算 B x/y表示x与y之商 C x**y表示x的y次幂,其中,y必须是整数 D x//y表示x与y之整数商,即不大于x与y之商的最大整数2. 下面代码…...
如何安装Visio(win10)
首先下载下面这些文件 HomeStudent2021Retail.img officedeploymenttool_17531-20046.exe office中文语言包.exe 确保这些文件都在一个文件夹内(我已经上传这些资源,这些资源都是官网下载的) 官网资源下载教程 1.下载Office镜像࿰…...
Sql刷题日志(day5)
面试: 1、从数据分析角度,推荐模块怎么用指标衡量? 推荐模块主要目的是将用户进行转化,所以其主指标是推荐的转化率推荐模块的指标一般都通过埋点去收集用户的行为并完成相应的计算而形成相应的指标数据,而这里的驱动…...
.NET、java、python语言连接SAP系统的方法
💡 本文会带给你 可用哪些技术与Sap系统连接怎样用Rfc技术连接SAP一. SAP系统与外部系统集成技术 SAP系统提供了多种方式供Java、.NET、Python等外部编程语言进行连接和集成。 1. RFC (Remote Function Call) 连接 适用语言:Java, .NET, Python, 其他支持RFC的编程语言 …...
C++ 容器查找效率
C 容器查找效率 只要选对容器,多写几行代码就能让程序“飞”起来。下面用生活化的比喻 足够多的带注释示例,帮你弄懂常用 STL 容器的查找特性。 读完你应该能快速判断:“我的场景该用哪一个?” 0. 先把“查找复杂度”聊明白 记号…...
汽车可变转向比系统的全面认识
一、什么是转向比? 转向比又叫转向传动比,是指方向盘转向角度与车轮转向角度之比。 例如,方向盘向左转动了60角,而车轮则向左转动了30角,转向比就是2:1。 转向比越大,意味着要使车轮转向达到指…...
知识储备-后仿
仿真环境设定 mem、constant input(scan/test)等设非x初值无复位ff通过force-release处理vcs timing_check、optconfigfile (自定义配置,如指定模块timing check与否)设置运行核数、仿真精度不要过小设置、根据测试目的选择性关闭、dump范围(时间/空间)…...
C# AutoResetEvent 详解
一、简介 AutoResetEvent 是 .NET 中一个重要的线程同步原语,用于线程间的信号通知。下面我将从多个方面详细讲解 AutoResetEvent。 AutoResetEvent 是 System.Threading 命名空间下的一个类,它表示一个线程同步事件,在等待线程被释放后会自…...
【水印图片文字识别】水印相机拍摄的照片提取重要的信息可以批量改名,批量识别水印文字内容批量给图片改名,基于QT和腾讯OCR的识别方案
应用场景 在日常工作和生活中,人们使用水印相机拍摄的照片往往包含重要的信息,如拍摄地点、时间、事件等。这些信息以水印的形式存在于照片中。当需要对大量照片进行管理时,手动为每张照片重命名是一项繁琐且容易出错的工作。通过批量识别水印文字内容并为图片改名,可以提…...
【架构】Armstrong公理系统通俗详解:数据库设计的基本法则
关系数据库就像一本精心设计的通讯录,而Armstrong公理系统则是帮我们整理这本通讯录的基本规则。本文将用简单易懂的语言和生活实例,带你理解这套看似复杂的理论。 1. 什么是函数依赖? 想象你有一个学生信息表,包含学号、姓名、…...
Redis高频核心面试题
1.阐述Redis的主要的特性和优势 ? 【Redis 的主要特性】 (1)Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库 (2)Redis 与其他 key - value 缓存产品有以下三个特点&a…...
Vue3-原始值的响应式方案ref
一、原始类型的值 原始类型的指的是: boolean、number、string、symbol、undefind和null等类型的值. 一、初识ref 为什么vue3需要对原始值的响应式做单独处理?因为Javascript中的Proxy只能代理对象类型的数据, 如普通对象、数组、Set、Map等。 为了解决Proxy不能代理原始类…...
VUE的创建
Vue Vue的创建脚手架创建Vue的解析setup函数:插值表达式数据响应式 ⽬录和⽂件解读指令 Vue的创建 下载VScode https://code.visualstudio.com/download 加入拓展包 点击 然后输入代码 <!DOCTYPE html> <html lang"en"><head><meta charset&…...
第51讲:AI在农业政策支持系统中的应用——用人工智能点亮科学决策的新范式
目录 🧠 开篇引导:农业决策,如何更科学? 🤖 什么是“AI驱动的农业政策支持系统”? 🧪 案例解析:AI如何助力农业政策? 🌾 案例一:政策补贴的智能匹配 🌍 案例二:土地利用规划支持 🛠 AI在农业政策建模中的常用技术 📈 可视化与接口建议 🌟 未来…...
开关电源LM5160-Q1 在 Fly-Buck 电路中的硬件设计与 PCB Layout 优化
一、LM5160-Q1 规格书深度解读与硬件设计参数提取 核心功能 宽输入范围:4.5V~65V,支持汽车级输入电压波动(AEC-Q100 标准,温度等级 1:-40C~125C)。 集成度:内置高侧 / 低侧 MOSFET,无需外部肖特基二极管,同步降压 / Fly-Buck 双模式。 控制架构:自适应恒定导通时间…...
面向 C# 初学者的完整教程
🧱 一、项目结构说明 你的项目大致结构如下: TaskManager/ ├── backend/ │ ├── TaskManager.Core/ // 实体类和接口 │ ├── TaskManager.Infrastructure/ // 数据库、服务实现 │ └── TaskManager.API/ // We…...
Python实现孔填充与坐标转换
一、问题背景 在工业自动化、材料加工等领域,常需要在图像识别的闭合区域内生成等间距的孔位坐标。本文基于OpenCV库,提出一种从图像边界提取到物理坐标生成的完整解决方案,实现以下核心功能: 像素坐标到实际尺寸的转换安全间距…...
精益数据分析(16/126):掌握关键方法,探寻创业真谛
精益数据分析(16/126):掌握关键方法,探寻创业真谛 大家好!在创业与数据分析的学习道路上,每一次的探索都让我们离成功更近一步。今天,我带着和大家共同进步的初心,继续深入解读《精…...
pytorch(gpu版本安装)
Pytorch官网下载很慢 选择以下方法,关于版本对应从pytorch官网查看 官网方法 pip install torch2.2.0 torchvision0.17.0 torchaudio2.2.0 --index-url https://download.pytorch.org/whl/cu121 其他方法 pip install torch2.2.0cu121 torchvision0.17.0cu121 t…...
day001
文章目录 1. 常用Linux发行版本2. 常用的Linux系统及版本3. Linux系统运行在哪?4. 安装kylin虚拟机4.1 环境准备4.2 新建虚拟机4.3 配置虚拟机参数4.4 同意系统使用协议4.5 登录系统,查看ip4.6 保存系统快照 5. 远程连接5.1 连接类型对比5.2 使用Xshell连…...
k8s 证书相关问题
1.重新生成新证书 kubeadm init phase certs apiserver-etcd-client --config ~/kubeadm.yaml这个命令表示生成 kube-apiserver 连接 etcd 使用的证书,生成后如下 -rw------- 1 root root 1.7K Apr 23 16:35 apiserver-etcd-client.key -rw-r--r-- 1 root root 1.2K Apr 23 …...
Spring JDBC 的开发步骤(注解方式)
Spring JDBC 的开发步骤主要包括以下关键环节,结合代码示例说明如下: 1. 添加依赖 在 pom.xml 中引入 Spring JDBC 和数据库驱动依赖(以 HikariCP 连接池和 MySQL 为例): <!-- Spring JDBC --> <dependency…...
蓝桥杯 15.小数第n位
小数第n位 原题目链接 题目描述 我们知道,整数做除法时,有时会得到有限小数,有时会得到无限循环小数。 如果我们把有限小数的末尾加上无限多个 0,它们就具有了统一的形式。 本题的任务是:在上述约定下,…...
[计算机科学#1]:计算机的前世今生,从算盘到IBM的演变之路
【核知坊】:释放青春想象,码动全新视野。 我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!! 内容摘要:在我们的日常生活中,计算机无处不在——…...
【LangChain4j】AI 第一弹:LangChain4j 的理解
一、LangChain4j 的简介 1.1 LangChain4j的背景 LangChain4j(LangChain for java) 的目标是简化将大语言模型(LLM - Large Language Model)集成到 Java 应用程序中的过程。 官网: https://docs.langchain4j.dev 202…...
深入解析C++ STL Stack:后进先出的数据结构
一、引言 在计算机科学中,栈(Stack)作为一种遵循后进先出(LIFO)原则的数据结构,是算法设计和程序开发的基础构件。C STL中的stack容器适配器以简洁的接口封装了底层容器的操作,为开发者提供了…...