【GUI】使用 PySide6 开发图片左右切换软件

news2024/11/25 13:27:38

使用 PySide6 开发图片左右切换软件

前言

在现代软件开发中,使用 Python 开发跨平台的 GUI 应用程序变得非常普遍。今天,我们将使用 PySide6 来开发一个简单的图片浏览器,它可以实现图片左右切换的功能,并自适应按钮布局。本教程适合那些对 PySide6 和 Qt 库有一定了解,但想进一步实践图像处理和界面布局的开发者。

项目需求

我们的目标是开发一个全屏应用,用户可以:

  1. 左右切换图片:通过点击“Previous”和“Next”按钮。
  2. 关闭应用:通过点击一个较大的“Close”按钮。
  3. 自适应布局:左右按钮位于图片两侧,并且按钮和图片都可以自适应窗口大小。
  4. 图片统一大小:即使图片分辨率不同,它们也会显示在相同的固定区域内。

开发环境

  1. Python 版本:3.12
  2. PySide6:跨平台的 Python 绑定,基于 Qt 库的 UI 开发框架。
  3. 开发工具:可以使用任何支持 Python 开发的 IDE,例如 PyCharm、VSCode。

安装 PySide6

首先,我们需要安装 PySide6:

pip install PySide6

核心功能实现

1. 创建基础的 GUI 应用

首先,我们需要创建一个窗口,并设置标题和默认大小。为了使用户可以方便地切换图片,我们将通过 QPushButton 控件创建按钮。

import sys
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel
from PySide6.QtGui import QPixmap
from PySide6.QtCore import Qt

class ImageSwitcher(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Image Switcher")
        self.setGeometry(0, 0, 1920, 1080)  # 设置初始窗口大小

2. 显示图片

为了显示图片,我们使用 QLabelQPixmap 结合。图片的大小会被缩放到固定的区域内。

self.image_label = QLabel()
self.image_label.setFixedSize(800, 600)  # 设置固定大小
self.image_label.setAlignment(Qt.AlignCenter)
self.layout.addWidget(self.image_label)

3. 创建左右切换按钮

左右切换按钮用于前后切换图片。我们将按钮放置在图片两侧,通过 QHBoxLayout 来排列按钮和图片。

# 创建按钮和图像的水平布局
self.image_layout = QHBoxLayout()

# 创建左按钮
self.previous_button = QPushButton("Previous")
self.previous_button.setFixedSize(100, 50)  # 设置按钮大小
self.image_layout.addWidget(self.previous_button)

# 显示图片的标签
self.image_layout.addWidget(self.image_label)

# 创建右按钮
self.next_button = QPushButton("Next")
self.next_button.setFixedSize(100, 50)
self.image_layout.addWidget(self.next_button)

# 将布局添加到主布局中
self.layout.addLayout(self.image_layout)

4. 添加关闭按钮

关闭按钮位于图片下方,并且会设置为较大的按钮,以方便用户点击退出。

self.close_button = QPushButton("Close")
self.close_button.setFixedSize(200, 70)
self.layout.addWidget(self.close_button, alignment=Qt.AlignCenter)

5. 图片切换逻辑

为了在按钮点击时切换图片,我们创建一个图像列表,并通过按钮点击事件来更新显示的图片。

self.images = ["image1.jpg", "image2.jpg", "image3.jpg"]
self.current_index = 0

def update_image(self):
    pixmap = QPixmap(self.images[self.current_index])
    self.image_label.setPixmap(pixmap.scaled(800, 600, Qt.KeepAspectRatio))

def show_previous_image(self):
    self.current_index = (self.current_index - 1) % len(self.images)
    self.update_image()

def show_next_image(self):
    self.current_index = (self.current_index + 1) % len(self.images)
    self.update_image()

# 连接按钮点击事件
self.previous_button.clicked.connect(self.show_previous_image)
self.next_button.clicked.connect(self.show_next_image)
self.close_button.clicked.connect(self.close_application)

6. 使应用全屏显示

为了让应用更具视觉冲击力,用户体验更加流畅,我们可以使窗口在启动时全屏显示。

def show_full_screen(self):
    self.showFullScreen()

# 在初始化时调用全屏
self.show_full_screen()

图片左右切换软件

7. 完整代码

结合以上各个部分,下面是完整的代码:

import sys
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QSizePolicy
from PySide6.QtGui import QPixmap
from PySide6.QtCore import Qt

class ImageSwitcher(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Image Switcher")
        self.setGeometry(0, 0, 1920, 1080)

        self.layout = QVBoxLayout()

        self.image_layout = QHBoxLayout()

        self.previous_button = QPushButton("Previous")
        self.previous_button.setFixedSize(100, 50)
        self.image_layout.addWidget(self.previous_button)

        self.image_label = QLabel()
        self.image_label.setFixedSize(800, 600)
        self.image_label.setAlignment(Qt.AlignCenter)
        self.image_layout.addWidget(self.image_label)

        self.next_button = QPushButton("Next")
        self.next_button.setFixedSize(100, 50)
        self.image_layout.addWidget(self.next_button)

        self.layout.addLayout(self.image_layout)

        self.close_button = QPushButton("Close")
        self.close_button.setFixedSize(200, 70)
        self.layout.addWidget(self.close_button, alignment=Qt.AlignCenter)

        self.setLayout(self.layout)

        self.images = ["image1.jpg", "image2.jpg", "image3.jpg"]
        self.current_index = 0
        self.update_image()

        self.previous_button.clicked.connect(self.show_previous_image)
        self.next_button.clicked.connect(self.show_next_image)
        self.close_button.clicked.connect(self.close_application)

        self.show_full_screen()

    def update_image(self):
        pixmap = QPixmap(self.images[self.current_index])
        self.image_label.setPixmap(pixmap.scaled(800, 600, Qt.KeepAspectRatio))

    def show_previous_image(self):
        self.current_index = (self.current_index - 1) % len(self.images)
        self.update_image()

    def show_next_image(self):
        self.current_index = (self.current_index + 1) % len(self.images)
        self.update_image()

    def close_application(self):
        self.close()

    def show_full_screen(self):
        self.showFullScreen()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = ImageSwitcher()
    window.show()
    sys.exit(app.exec())

总结

通过本文的学习,我们使用 PySide6 成功开发了一个简单的图片浏览器。这个应用展示了如何使用按钮和标签创建一个易于操作、界面自适应的图片切换程序。你可以根据自己的需求进一步扩展此项目,例如添加更多图像处理功能或优化界面设计。

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

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

相关文章

闭着眼学机器学习——朴素贝叶斯分类

引言: 在正文开始之前,首先给大家介绍一个不错的人工智能学习教程:https://www.captainbed.cn/bbs。其中包含了机器学习、深度学习、强化学习等系列教程,感兴趣的读者可以自行查阅。 1. 算法介绍 朴素贝叶斯是一种基于贝叶斯定理…

c++应用网络编程之十一Linux下的epoll模式基础

一、epoll模式 在前面分析了select和poll两种IO多路复用的模式,但总体给人的感觉有一种力不从心的感觉。尤其是刚刚接触底层网络开发的程序员,被很多双十一千万并发,游戏百万并发等等已经给唬的一楞一楞的。一听说只支持一两千个并发&#x…

YOLOv9分割改进 ,YOLOv9分割改进主干网络为华为EfficientNet,助力涨点

YOLOv9 分割改进前训练结果: YOLOv9 分割改进后训练结果: 摘要 卷积神经网络(ConvNets)通常在固定的资源预算下开发,然后在有更多资源时进行扩展以提高准确性。在本文中,我们系统地研究了模型扩展,并发现仔细平衡网络深度、宽度和分辨率可以带来更好的性能。基于这一…

【Python库安装】Python环境安装wrf-python库

【Python库安装】Python环境安装wrf-python库 wrf-python库概述Python中安装wrf-python库方式1:使用pip安装方式2:离线安装,使用whl文件安装另:报错 方式3:使用conda安装wrf-python另:报错 参考 wrf-python…

教育培训系统小程序的设计

教师账户功能包括:系统首页,个人中心,课后习题测试管理,观看进度管理,论坛管理,网课信息管理,公告信息管理,学生管理,试卷管理,测试管理 微信端账号功能包括…

RK3568学习之Nginx移植+RTMP推流

1.下载 Nginx 源码 进入到 Ubuntu 系统的某个目录下,下载 Nginx 源码: wget http://nginx.org/download/nginx-1.20.0.tar.gz这里我们下载的是 1.20 版本,这是比较新的版本了。下载完成之后将得到一个名为 nginx-1.20.0.tar.gz的压缩包文件…

嵌入式中数据库sqlit3基本使用方法与现象

大家好,今天主要给大家分享一下,数据库的使用方法,观察对应的效果。 第一:数据库sqlit3基本安装方法 sqlite3 安装 使用 Ubuntu # 安装软件 sudo apt-get install sqlite3# 查看版本 sqlite3 -version# 安装编译工具包 sudo apt-get install sqlite3-dev# 安装可视化工具…

为何2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者?

近日,2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者,这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家,如今却将全球范围内对机器学习和神经网络的研究和开发作为了一种能…

html css js 生成随机颜色

起因&#xff0c; 目的: 整理文件&#xff0c;发现之前写的一个小工具。 效果图 点击按钮会生成新的格子。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"wi…

3.计算机网络_端口号

端口号的由来 运输层的作用&#xff1a; 在计算机网络中&#xff0c;运输层处在用户功能的最底层、通信部分的最高层的位置&#xff0c;也就是说运输层是用户数据和实际网络通信的桥梁。因此运输层屏蔽了网络的实现部分&#xff0c;以协议的方式向用户层提供了接口&#xff…

结构体 超详解

目录 1. 结构体的声明与创建 1.1 结构体类型的定义声明&#xff08;类型&#xff09; 1.2 结构体变量的创建和初始化&#xff08;变量&#xff09; 1.3 结构体变量的特殊声明&#xff08;类型和变量&#xff09; 1.3.1 定义时创建变量 1.3.2 结构体的不完全声明&#xff…

SpaceWire原理介绍及FPGA实现

SpaceWire原理及介绍 spacewire特点 SpaceWire 总线具有高速、全双工、点对点、串行传输的特点。它由欧洲航 空局&#xff08;European Space Agency&#xff0c;简称 ESA&#xff09;联合欧洲航空公司等共同发起&#xff0c;由 Dundee 大学制定&#xff0c;以 IEEE-1355 接口…

大数据治理:挑战与实践

目录 大数据治理&#xff1a;挑战与实践 1. 大数据治理的基本概念 2. 大数据治理的关键要素 3. 大数据治理实施框架 3.1 策略与目标制定 3.2 数据治理工具 3.3 数据生命周期管理 4. 大数据治理的挑战与解决方案 5. 大数据治理的价值与未来趋势 5.1 提升决策质量 5.2…

MySQL初识

在了解什么是MySQL前&#xff0c;我们先了解一下什么是数据库&#xff1f;&#xff1f; 1. 数据库简介 1.1 什么是数据库 数据库是20世纪60年代末发展起来的⼀项重要技术&#xff0c;已经成为计算机科学与技术的⼀个重要分⽀。数据库技术主要是⽤来解决数据处理的⾮数值计算问…

【MATLAB代码,带TDOA数据导入】TDOA最小二乘求三维下的位置(1主锚点、3副锚点),多个时间点、输出位置图像

此TDOA&#xff08;Time Difference of Arrival&#xff09;最小二乘法三维定位 MATLAB 工具是一个先进的定位解决方案&#xff0c;专为需要高精度位置计算的工程师、研究人员和开发者设计。此工具可以通过多个时间点的测量数据&#xff0c;结合主锚点和副锚点的配合&#xff0…

Hi3061M——不定长串口接收实现

这里写目录标题 前言串口接收流程串口中断函数ReadITCallBack1中断接收函数 补充结果展示 前言 Hi3061M给了很多相关的串口案例&#xff0c;但大多数是定长的&#xff0c;指定长度进行接收读取&#xff0c;而实际需求往往需要用到不定长的接收。 串口接收流程 首先介绍下Hi3…

Android终端GB28181音视频实时回传设计探讨

技术背景 好多开发者&#xff0c;在调研Android平台GB28181实时回传的时候&#xff0c;对这块整体的流程&#xff0c;没有个整体的了解&#xff0c;本文以大牛直播SDK的SmartGBD设计开发为例&#xff0c;聊下如何在Android终端实现GB28181音视频数据实时回传。 技术实现 Andr…

C++——红黑树(带头结点)

红黑树 红黑树的概念红黑树的定义红黑树的性质红黑树的优点操作原理例图&#xff1a; 红黑树的实现红黑树的框架红黑树的插入实现头结点的作用红黑树的插入步骤&#xff08;简易理解版带图&#xff09; 红黑树的插入具体代码详解红黑树的旋转代码红黑树的查验 红黑树的概念 红…

基于矢量瓦片技术的GIS引擎

矢量地图是通过对点线面坐标信息集合的管理和渲染实现优于栅格画面质量的一种gis展示技术&#xff0c;涉及不同坐标系变换&#xff0c;视窗比例尺换算等。当你遇到海量坐标数据和属性信息需要管理时你就不得不在有限内存和庞大数据间左右为难&#xff0c;将地图矢量数据进行分块…

LabVIEW提高开发效率技巧----时序分析

一、什么是时序分析&#xff1f; 时序分析是优化LabVIEW程序性能的重要步骤。它通过分析程序各个部分的执行时间&#xff0c;帮助开发者找到程序运行中的瓶颈&#xff0c;并进行有针对性的优化。在LabVIEW中&#xff0c;Profile Performance and Memory工具是进行时序分析的关…