pyqt5按选择顺序多选图并显示缩略图

2024-08-21 11:36

本文主要是介绍pyqt5按选择顺序多选图并显示缩略图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为了实现用户在选择图片时可以看到缩略图,并且按点击顺序显示最终的选择,我们可以自定义一个对话框,展示所有可选图片的缩略图,用户点击图片后会将其记录到列表中,并最终按顺序显示选择的缩略图。

解决方案思路:

  1. 自定义选择对话框:展示所有图片的缩略图,用户可以点击选择图片。
  2. 按点击顺序记录选择:记录用户点击图片的顺序。
  3. 显示选择结果:在主窗口中按点击顺序显示最终选择的图片缩略图。

实现步骤:

  1. 创建一个自定义对话框,加载文件夹内的图片,并显示为缩略图。
  2. 用户点击缩略图时,记录下点击的顺序。
  3. 用户确认选择后,按顺序在主窗口中显示缩略图。

完整示例代码: 

import sys
import os
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QScrollArea, QGridLayout, QFileDialog, QDialog, QHBoxLayout
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qtclass ThumbnailDialog(QDialog):def __init__(self, folder_path, parent=None):super().__init__(parent)self.setWindowTitle("Select Images")self.selected_files = []# 创建主布局self.layout = QVBoxLayout()self.grid_layout = QGridLayout()self.layout.addLayout(self.grid_layout)# 加载文件夹中的所有图片并显示为缩略图self.load_images(folder_path)# 确认按钮self.confirm_button = QPushButton('Confirm Selection')self.confirm_button.clicked.connect(self.accept)self.layout.addWidget(self.confirm_button)self.setLayout(self.layout)def load_images(self, folder_path):images = [f for f in os.listdir(folder_path) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif'))]row, col = 0, 0for image_file in images:image_path = os.path.join(folder_path, image_file)pixmap = QPixmap(image_path).scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation)label = QLabel()label.setPixmap(pixmap)label.setAlignment(Qt.AlignCenter)label.mousePressEvent = lambda event, path=image_path: self.select_image(path)self.grid_layout.addWidget(label, row, col)col += 1if col > 3:  # 每行4个缩略图col = 0row += 1def select_image(self, image_path):if image_path not in self.selected_files:self.selected_files.append(image_path)print(f"Selected: {image_path}")def exec_(self):super().exec_()return self.selected_filesclass ImageSelector(QWidget):def __init__(self):super().__init__()# 设置窗口标题和大小self.setWindowTitle("Image Selector")self.setGeometry(100, 100, 800, 600)# 创建布局self.layout = QVBoxLayout()# 创建一个按钮用于选择图片self.select_button = QPushButton('Select Images')self.select_button.clicked.connect(self.open_folder_dialog)self.layout.addWidget(self.select_button)# 创建一个滚动区域来显示图片self.scroll_area = QScrollArea()self.scroll_area_widget = QWidget()self.grid_layout = QGridLayout(self.scroll_area_widget)self.scroll_area.setWidgetResizable(True)self.scroll_area.setWidget(self.scroll_area_widget)self.layout.addWidget(self.scroll_area)# 设置主布局self.setLayout(self.layout)def open_folder_dialog(self):# 打开文件夹对话框,用户选择一个文件夹folder_path = QFileDialog.getExistingDirectory(self, "Select Folder")if folder_path:# 打开自定义对话框,显示缩略图dialog = ThumbnailDialog(folder_path, self)selected_files = dialog.exec_()if selected_files:self.display_images(selected_files)def display_images(self, files):# 清除之前的布局内容for i in reversed(range(self.grid_layout.count())):widget_to_remove = self.grid_layout.itemAt(i).widget()self.grid_layout.removeWidget(widget_to_remove)widget_to_remove.setParent(None)# 按选择顺序显示缩略图for index, file in enumerate(files):pixmap = QPixmap(file).scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation)label = QLabel()label.setPixmap(pixmap)label.setAlignment(Qt.AlignCenter)self.grid_layout.addWidget(label, index // 4, index % 4)if __name__ == '__main__':app = QApplication(sys.argv)window = ImageSelector()window.show()sys.exit(app.exec_())

代码解释:

  1. ThumbnailDialog:自定义对话框,用于显示指定文件夹中的所有图片缩略图。

    • load_images() 方法会加载并显示文件夹中的图片。
    • select_image() 方法记录用户点击的图片顺序。
    • exec_() 方法返回用户按点击顺序选择的图片列表。
  2. ImageSelector:主窗口类。

    • open_folder_dialog() 打开文件夹选择对话框,并显示 ThumbnailDialog 对话框,供用户选择图片。
    • display_images() 按选择顺序显示图片缩略图。

运行效果:

用户选择一个文件夹后,自定义的 ThumbnailDialog 会显示文件夹中的所有图片缩略图。用户可以点击选择图片,点击顺序将被记录,并在主窗口中按顺序显示这些图片的缩略图。

 

这篇关于pyqt5按选择顺序多选图并显示缩略图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093050

相关文章

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄