Python 实现图片浏览和选择工具
实现将截图预览,并按照顺序加入一个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()
该方法虽然绑定了按钮,但代码未贴出。预期功能:
- 获取
ListBox2
中图片完整路径; - 使用
reportlab
创建 PDF 页面; - 每页插入一张图片(需缩放到 A4 页面);
- 保存到文件。
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 = A4for 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.sizescale = min(width / img_w, height / img_h)new_w = img_w * scalenew_h = img_h * scalec.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)