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

 更新时间:2025年05月19日 14:02:26   作者:winfredzhang  
这篇文章主要为大家详细介绍了如何使用Python实现一个图片浏览和选择工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

实现将截图预览,并按照顺序加入一个pdf文件中,实现照片管理尤其对于喜欢看教程截图做笔记的网友们。

界面展示

一、核心结构概述

主类 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 是显示缩略图的主要控件。

四、主要方法详解

1.on_open_dir():打开文件夹,调用 load_images()

2.load_images():遍历文件夹,筛选支持的图片扩展名并按字母排序

3.on_select_image1() 和 on_select_image2():从 ListBox1 或 ListBox2 中选取图片后调用 display_image() 进行预览

4.display_image(img_path)

使用 PIL 打开图片,根据最大尺寸 (480x580) 缩放显示

转为 wx.Image -> wx.Bitmap -> 显示在 img_preview 上

支持 RGB 和 RGBA 格式

5.on_move_to_listbox2():将 ListBox1 中双击的图片名称添加到 ListBox2,防止重复

6.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 = 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)

到此这篇关于Python实现图片浏览和选择工具的文章就介绍到这了,更多相关Python图片浏览内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python如何实现单链表的反转

    python如何实现单链表的反转

    这篇文章主要介绍了python如何实现单链表的反转,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • python利用ffmpeg进行录制屏幕的方法

    python利用ffmpeg进行录制屏幕的方法

    今天小编就为大家分享一篇python利用ffmpeg进行录制屏幕的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python递归法实现简易连连看小游戏

    python递归法实现简易连连看小游戏

    这篇文章主要为大家详细介绍了python递归法实现简易连连看小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • mac下pycharm设置python版本的图文教程

    mac下pycharm设置python版本的图文教程

    今天小编就为大家分享一篇mac下pycharm设置python版本的图文教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python+mysql实现学生信息查询系统

    python+mysql实现学生信息查询系统

    这篇文章主要为大家详细介绍了python+mysql实现学生信息查询系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Python处理和解析CLIXML数据的方法

    Python处理和解析CLIXML数据的方法

    在使用Windows的Windows Remote Management (WinRM)服务与PowerShell交互时,经常会遇到CLIXML(即CLI XML)格式的数据,本文将介绍如何在Python中处理和解析CLIXML数据,并提供一种方法来从数据中提取有效信息,需要的朋友可以参考下
    2024-04-04
  • Python使用multiprocessing模块实现多进程并发处理大数据量的示例代码

    Python使用multiprocessing模块实现多进程并发处理大数据量的示例代码

    这篇文章主要介绍了Python使用multiprocessing模块实现多进程并发处理大数据量的示例代码,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • 基于Numba提高python运行效率过程解析

    基于Numba提高python运行效率过程解析

    这篇文章主要介绍了基于Numba提高python运行效率过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 基于CUDA out of memory的一种神奇解决方式

    基于CUDA out of memory的一种神奇解决方式

    这篇文章主要介绍了基于CUDA out of memory的一种神奇解决方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • go和python变量赋值遇到的一个问题

    go和python变量赋值遇到的一个问题

    这篇文章主要介绍了go和python变量赋值遇到的一个问题的相关资料,需要的朋友可以参考下
    2017-08-08

最新评论