Python 实现图片浏览和选择工具

news2025/7/14 9:24:18

实现将截图预览,并按照顺序加入一个pdf文件中,实现照片管理尤其对于喜欢看教程截图做笔记的网友们。
C:\pythoncode\new\python-image-pdf-processor.py

界面展示

在这里插入图片描述

🧱 一、核心结构概述

主类 ImageViewer(wx.Frame)

  • 是主窗口类,继承自 wx.Frame
  • 包括左侧文件浏览和图片列表、右侧图片预览区域。
  • 支持的图片格式:['.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff']

📁 二、左侧区域(图片选择与操作)

1. 打开文件夹按钮

self.btn_open = wx.Button(self.panel, label="打开文件夹")
self.btn_open.Bind(wx.EVT_BUTTON, self.on_open_dir)
  • 打开目录,绑定 on_open_dir() 函数。
  • 使用 wx.DirDialog 选择目录,读取支持格式的图片,显示到 ListBox1

2. 当前路径显示

self.path_text = wx.StaticText(self.panel, label="当前路径: ")
  • 显示当前选择的图片文件夹路径。

3. ListBox1 — 图片列表

self.listbox1 = wx.ListBox(...)
self.listbox1.Bind(wx.EVT_LISTBOX, self.on_select_image1)
self.listbox1.Bind(wx.EVT_LISTBOX_DCLICK, self.on_move_to_listbox2)
  • 单击:预览该图片。
  • 双击:将图片添加到 ListBox2

4. ListBox2 — 已选图片

self.listbox2 = wx.ListBox(...)
self.listbox2.Bind(wx.EVT_LISTBOX, self.on_select_image2)
  • 单击:预览。
  • 存放用户选择的用于合并 PDF 的图片。

5. 移动按钮(上下移动排序)

self.btn_up.Bind(wx.EVT_BUTTON, self.on_move_up)
self.btn_down.Bind(wx.EVT_BUTTON, self.on_move_down)
  • 可重新排列 ListBox2 中的图片顺序(影响 PDF 顺序)。

6. 合并PDF按钮

self.btn_pdf = wx.Button(...)
self.btn_pdf.Bind(wx.EVT_BUTTON, self.on_create_pdf)
  • 用于触发将 ListBox2 中图片合并生成 PDF 的逻辑(on_create_pdf() 需要你提供或补全)。

🖼 三、右侧区域(图片预览)

使用 ScrolledPanel 可滚动区域显示图片

self.scroll_panel = scrolled.ScrolledPanel(...)
self.img_preview = wx.StaticBitmap(...)
  • ScrolledPanel 允许在图片较大时滚动查看。
  • img_preview 是显示缩略图的主要控件。

🔁 四、主要方法详解

on_open_dir()

# 打开文件夹,调用 load_images()

load_images()

# 遍历文件夹,筛选支持的图片扩展名并按字母排序

on_select_image1()on_select_image2()

# 从 ListBox1 或 ListBox2 中选取图片后调用 display_image() 进行预览

display_image(img_path)

# 使用 PIL 打开图片,根据最大尺寸 (480x580) 缩放显示
# 转为 wx.Image -> wx.Bitmap -> 显示在 img_preview 上
# 支持 RGB 和 RGBA 格式

on_move_to_listbox2()

# 将 ListBox1 中双击的图片名称添加到 ListBox2,防止重复

on_move_up() / on_move_down()

# 更改 ListBox2 中图片顺序,影响 PDF 合并顺序

📌 五、缺失但预期存在的方法

on_create_pdf()

该方法虽然绑定了按钮,但代码未贴出。预期功能:

  1. 获取 ListBox2 中图片完整路径;
  2. 使用 reportlab 创建 PDF 页面;
  3. 每页插入一张图片(需缩放到 A4 页面);
  4. 保存到文件。
def on_create_pdf(self, event):
    output_path = os.path.join(self.current_dir, "output.pdf")
    c = canvas.Canvas(output_path, pagesize=A4)
    width, height = A4
    
    for i in range(self.listbox2.GetCount()):
        filename = self.listbox2.GetString(i)
        img_path = os.path.join(self.current_dir, filename)
        
        try:
            pil_img = Image.open(img_path)
            img_w, img_h = pil_img.size
            scale = min(width / img_w, height / img_h)
            new_w = img_w * scale
            new_h = img_h * scale
            
            c.drawImage(img_path, (width - new_w) / 2, (height - new_h) / 2, new_w, new_h)
            c.showPage()
        except Exception as e:
            wx.MessageBox(f"无法添加图片:{filename}\n{str(e)}", "错误", wx.ICON_ERROR)
    
    c.save()
    wx.MessageBox("PDF合并完成!", "成功", wx.ICON_INFORMATION)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2379928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实现的在线词典学习工具

Python实现的在线词典学习工具 源码最初来自网络,根据实际情况进行了修改。 主要功能: 单词查询 通过Bing词典在线获取单词释义(正则提取网页meta描述),支持回车键快速查询 内置网络请求重试和异常处理机制 在线网页…

BGP综合实验(2)

一、实验需求 1、实验拓扑图 2、实验需求 使用 PreVal 策略,让 R4 经 R2 到达 192.168.10.0/24 。 使用 AS_Path 策略,让 R4 经 R3 到达 192.168.11.0/24 。 配置 MED 策略,让 R4 经 R3 到达 192.168.12.0/24 。 使用 Local Preference 策…

代码随想录算法训练营 Day51 图论Ⅱ岛屿问题Ⅰ

图论 题目 99. 岛屿数量 使用 DFS 实现方法 判断岛屿方法 1. 遍历图,若遍历到了陆地 grid[i][j] 1 并且陆地没有被访问,在这个陆地的基础上进行 DFS 方法,或者是 BFS 方法 2. 对陆地进行 DFS 的时候时刻注意以访问的元素添加访问标记 //…

【占融数科-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

【CF】Day62——Codeforces Round 948 (Div. 2) CD (思维 + LCM + 枚举因数 | 思维 + 哈希)

C. Nikita and LCM 题目: 思路: 非常好的思维题,顺便复习了一下快速枚举因数和lcm的性质 我们先来看答案的上界,即全选,此时说明 lcm(a1,a2,a3,...) > a_max 其中 a_max 为 a 中最大的数,那么如果答案不…

基于requests_html的python爬虫

前言:今天介绍一个相对性能更高的爬虫库requests_html,会不会感觉和requests有点联系?是的。为什么开始不直接介绍呢?因为我觉得requests是最基本入门的东西,并且在学习过程中也能学到很多东西。我的python老师在介绍这…

STM32:按键模块 传感器模块 以及 相关C语言知识(详细讲解)

目录 按键 传感器模块 C语言知识 C语言数据类型 C语言宏定义 C语言typedef C语言结构体 C语言枚举 按键 常见的输入设备,按下导通,松手断开 按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬…

C++23 std::mdspan:多维数组处理新利器

文章目录 引言C23简介std::mdspan的定义与特点定义特点 std::mdspan的优势零成本抽象的多维数据访问减少内存开销提高代码灵活性 std::mdspan的应用场景科学计算图形学 相关提案示例代码使用动态扩展使用静态和动态扩展 总结 引言 在C的发展历程中,每一个新版本都带…

基于高德MCP2.0的智能旅游攻略系统设计与实现

前言:旅游规划的技术革命 在数字化旅游时代,MCP2.0(Map-based Collaborative Planning)系统代表着旅游攻略技术的最新演进。作为对1.0版本的全面升级,MCP2.0通过深度整合高德地图API和智能算法,实现了从静…

【时时三省】(C语言基础)用函数实现模块化程序设计

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 为什么要用函数? 已经能够编写一些简单的C程序,但是如果程序的功能比较多,规模比较大,把所有的程序代码都写在一个主函数(main函数)中&#x…

Flink流处理:实时计算URL访问量TopN(基于时间窗口)

目录 代码分析 背景知识拓展 代码调优 1. 性能优化 1.1 使用 KeyedStream 和 ProcessWindowFunction 替代 windowAll 1.2 使用 ReduceFunction 优化聚合 2. 功能扩展 2.1 支持动态窗口大小 2.2 支持多维度统计 2.3 支持持久化存储 3. 代码可读性 3.1 提取公共逻辑 …

华为OD机试真题——考勤信息(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

Go语言测试用例的执行与分析

在软件开发过程中,测试用例是确保代码质量的关键环节。Go语言作为一种现代的编程语言,它内置了强大的测试框架,可以帮助开发者轻松编写和执行测试用例。本文将介绍如何在 Go 语言中编写、执行测试用例,并对测试结果进行分析。 ## …

MyBatis:动态SQL

文章目录 动态SQLif标签trim标签where标签set标签foreach标签include标签和sql标签 Mybatis动态SQL的官方文档: https://mybatis.net.cn/dynamic-sql.html 动态SQL 动态SQL是 MyBatis的强大特性之一,如果是使用JDBC根据不同条件拼接sql很麻烦,例如拼接…

游戏引擎学习第280天:精简化的流式实体sim

回顾并为今天的内容做铺垫 今天的任务是让之前关于实体存储方式的改动真正运行起来。我们现在希望让实体系统变得更加真实和实用,能够支撑我们游戏实际所需的功能。这就要求我们对它进行更合理的实现和调试。 昨天我们基本让代码编译通过了,但实际上还…

王树森推荐系统公开课 排序03:预估分数融合

融合预估分数 p c l i c k ⋅ p l i k e p_{click} \cdot p_{like} pclick​⋅plike​ 有实际意义,等于在曝光中点赞的概率。 p c l i c k ⋅ p c o l l e c t p_{click} \cdot p_{collect} pclick​⋅pcollect​ 同理。 按多种排名做 ensemble sort。 某电商的融…

网络I/O学习-poll(三)

一、为什么要用Poll 由于select参数太多,较于复杂,调用起来较为麻烦;poll对其进行了优化 二、poll机制 poll也是一个系统调用,每次调用都会将所有客户端的fd拷贝到内核空间,然后进行轮询,判断IO是否就绪…

k8s(12) — 版本控制和滚动更新(金丝雀部署理念)

金丝雀部署简介: 1、基本概念 金丝雀部署是一种软件开发中的渐进式发布策略,其核心思想是通过将新版本应用逐步发布给一小部分用户(即 “金丝雀” 用户),在真实环境中验证功能稳定性和性能表现,再逐步扩大发…

Google设置app-ads.txt

问题: 应用上架后admob后台显示应用广告投放量受限,需要设置app-ads.txt才行。 如何解决: 官方教程: 看了下感觉不难,创建一个txt,将第二条的代码复制进行就得到app-ads.txt了。 然后就是要把这个txt放到哪才可以…

docker安装rockerMQ

参考Docker部署RocketMQ5.x (单机部署配置参数详解不使用docker-compose直接部署)_rocketmq不推荐用docker部署-CSDN博客 镜像拉取 镜像地址: https://hub.docker.com/r/apache/rocketmq/tags 我在部署的时候最新发行版是5.1.0可以根据需求自行选择一个5.x的版本&a…