Python 使用 PyQt5 实现截图

这篇具有很好参考价值的文章主要介绍了Python 使用 PyQt5 实现截图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原文链接:https://www.cpweb.top/2566

使用 PyQt5 实现截图功能,功能点:
• 选框截图:鼠标左键选择区域双击截屏,右击重新截图。
• 全屏截图:不选区域,直接鼠标双击截全屏。文章来源地址https://www.toymoban.com/news/detail-621399.html

# Author: cp

import sys, time, logging
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import QPen, QPainter, QColor, QGuiApplication
from PyQt5.QtWidgets import QApplication, QWidget, QFileDialog


class Screenshot(QWidget):
    """截图"""

    # 初始化变量
    fullScreenImage = None
    captureImage = None
    isMousePressLeft = None
    beginPosition = None
    endPosition = None

    # 创建 QPainter 对象
    painter = QPainter()

    def __init__(self):
        super().__init__()
        self.initWindow()             # 初始化窗口
        self.captureFullScreen()      # 捕获全屏

    def initWindow(self):
        """初始化窗口"""
        self.setCursor(Qt.CrossCursor)               # 设置光标
        self.setWindowFlag(Qt.FramelessWindowHint)   # 产生无边框窗口,用户不能通过窗口系统移动或调整无边界窗口的大小
        self.setWindowState(Qt.WindowFullScreen)     # 窗口全屏无边框

    def captureFullScreen(self):
        """捕获全屏"""
        # 捕获当前屏幕,返回像素图
        self.fullScreenImage = QGuiApplication.primaryScreen().grabWindow(QApplication.desktop().winId())

    def mousePressEvent(self, event):
        """鼠标按下事件"""
        # 如果鼠标事件为左键,则记录起始鼠标光标相对于窗口的位置
        if event.button() == Qt.LeftButton:
            self.beginPosition = event.pos()
            self.isMousePressLeft = True
        # 如果鼠标事件为右键,如果已经截图了则重新开始截图,如果没有截图就退出
        if event.button() == Qt.RightButton:
            if self.captureImage is not None:
                self.captureImage = None
                self.update()    # 更新,会擦除之前的选框
            else:
                self.close()

    def mouseMoveEvent(self, event):
        """鼠标移动事件"""
        if self.isMousePressLeft is True:
            self.endPosition = event.pos()
            self.update()

    def mouseReleaseEvent(self, event):
        """鼠标释放事件"""
        self.endPosition = event.pos()
        self.isMousePressLeft = False

    def mouseDoubleClickEvent(self, event):
        """鼠标双击事件"""
        self.saveImage()
        self.close()

    def paintBackgroundImage(self):
        """绘制背景图"""
        # 填充颜色,黑色半透明
        fillColor = QColor(0, 0, 0, 100)
        # 加载显示捕获的图片到窗口
        self.painter.drawPixmap(0, 0, self.fullScreenImage)
        # 填充颜色到给定的矩形
        self.painter.fillRect(self.fullScreenImage.rect(), fillColor)

    def getRectangle(self, beginPoint, endPoint):
        """获取矩形选框"""
        # 计算矩形宽和高
        rectWidth = int(abs(beginPoint.x() - endPoint.x()))
        rectHeight = int(abs(beginPoint.y() - endPoint.y()))
        # 计算矩形左上角 x 和 y
        rectTopleftX = beginPoint.x() if beginPoint.x() < endPoint.x() else endPoint.x()
        rectTopleftY = beginPoint.y() if beginPoint.y() < endPoint.y() else endPoint.y()
        # 构造一个以(x,y)为左上角,给定宽度和高度的矩形
        pickRect = QRect(rectTopleftX, rectTopleftY, rectWidth, rectHeight)
        # 调试日志
        # logging.info('开始坐标:%s,%s', beginPoint.x(),beginPoint.y())
        # logging.info('结束坐标:%s,%s', endPoint.x(), endPoint.y())
        return pickRect

    def paintSelectBox(self):
        """绘制选框"""
        # 画笔颜色,蓝色
        penColor = QColor(30, 150, 255)  # 画笔颜色
        # 设置画笔属性,蓝色、2px大小、实线
        self.painter.setPen(QPen(penColor, 2, Qt.SolidLine))
        if self.isMousePressLeft is True:
            pickRect = self.getRectangle(self.beginPosition, self.endPosition)  # 获得要截图的矩形框
            self.captureImage = self.fullScreenImage.copy(pickRect)             # 捕获截图矩形框内的图片
            self.painter.drawPixmap(pickRect.topLeft(), self.captureImage)      # 填充截图的图片
            self.painter.drawRect(pickRect)     # 绘制矩形边框

    def paintEvent(self,event):
        """接收绘制事件开始绘制"""
        self.painter.begin(self)        # 开始绘制
        self.paintBackgroundImage()     # 绘制背景
        self.paintSelectBox()           # 绘制选框
        self.painter.end()              # 结束绘制

    def saveImage(self):
        """保存图片"""
        # 获取用户选择的文件名的完整路径
        fileName = QFileDialog.getSaveFileName(self, '保存图片', time.strftime("%Y%m%d%H%M%S"), ".png")
        # 保存用户选择的文件。如果选取了区域,就保存区域图片;如果没有选取区域,就保存全屏图片
        if self.captureImage is not None:
            self.captureImage.save(fileName[0] + fileName[1])
        else:
            self.fullScreenImage.save(fileName[0] + fileName[1])

    def keyPressEvent(self, event):
        """按键事件"""
        # 如果按下 ESC 键,则退出截图
        if event.key() == Qt.Key_Escape:
            self.close()
        # 如果按下 Enter 键,并且已经选取了区域,就截图选区图片
        if event.key() == Qt.Key_Enter or event.key() == Qt.Key_Return:
            if self.captureImage is not None:
                self.saveImage()
                self.close()


if __name__ == '__main__':
    # 调试日志
    # logger = logging.getLogger()
    # logger.setLevel(logging.DEBUG)
    # sh = logging.StreamHandler()
    # formatter = logging.Formatter('%(message)s')
    # sh.setFormatter(formatter)
    # logger.addHandler(sh)

    app = QApplication(sys.argv)    # 创建 QApplication 对象
    windows = Screenshot()          # 创建 Screenshot 对象
    windows.show()                  # 显示窗口
    sys.exit(app.exec_())           # 进入主事件循环并等待直到 exit() 被调用

到了这里,关于Python 使用 PyQt5 实现截图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python、pyqt5实现人脸检测、性别和年龄预测

    摘要:这篇博文介绍基于opencv:DNN模块自带的残差网络的人脸、性别、年龄识别系统,系统程序由OpenCv, PyQt5的库实现。如图系统可通过摄像头获取实时画面并识别其中的人脸表情,也可以通过读取图片识别,本文提供完整的程序文件并详细介绍其实现过程。博文要点如下:

    2024年02月07日
    浏览(94)
  • Python PyQt5——QThread使用方法与代码实践

    在 GUI 程序中,如果想要让程序执行一项耗时的工作,例如下载文件、I/O 存取等,深度学习模型推理,直接在 UI 线程中进行这些操作会导致整个界面卡住,出现无响应的状态。为了避免这种情况,可以将这些耗时任务放在另一个线程中执行。在 PyQt 中,可以使用 QThread 来实现

    2024年04月27日
    浏览(30)
  • 使用python和pyqt5轻松上手人脸识别系统(含代码)

    最近在做一个人脸识别考勤系统,已经总结和记录了大部分内容,算是比较完善啦!后续把剩下的搞完,感兴趣的同学可以关注一下哦~ 文末给出了代码获取方式,请自行获取食用~ B站:马上就更!!!_bilibili CSDN:使用python和pyqt5轻松上手人脸识别系统(含代码)_百年后封笔

    2024年02月11日
    浏览(85)
  • 【Python进阶-PyQt5】00搭建PyQt5环境

    我们编写的程序,有时用到的Python库是不一样的,比如说开发桌面应用程序我们主要用到PyQt5相关的Python库、开发Web应用程序我们主要用到Django相关的Python库等等。假设我们在开发桌面应用程序的时候除了PyQt5相关的Python库外,还附加了其他的Python库,比如有关Django的Python库。

    2024年02月08日
    浏览(41)
  • [Python GUI PyQt] PyQt5快速入门

    本文为博主个人对自己学习 PyQt5 GUI技术的纲要式的总结,主要的目的是以比较宏观的视角再次对 PyQt5 这一项技术作一次总结,通过该文可以快速让读者建立起 PyQt5 最基本的知识体系,了解 PyQt5 的 基本界面的设计 、 信号与槽 和 多线程 等知识,并简单学会使用 Qt Designer 工

    2024年04月15日
    浏览(52)
  • python pyqt5与opencv 遇到的那些坑,pyqt5页面搭建,设置pyqt5设置背景图

    设置pyqt5的背景图片,可以设置一个lable控件,将控件至于底层,然后设置他的背景图 注意路径 解决代码 使用Qt Desiggnei 绘制界面后转换成py代码后 最好不要在生成的py页面代码添加 信号槽,到时候页面改动比较麻烦 转换代码 pyuic5 -o 【转换后的.py】 【UI界面的.ui】 推荐的方

    2024年02月09日
    浏览(56)
  • [python]使用pyqt5搭建yolov8 竹签计数一次性筷子计数系统

    【官方框架地址】 github地址:https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8是一种先进的深度学习算法,用于目标检测任务,特别是针对图像中物体的实时检测。它是Yolov3和Yolov4之后的又一重要迭代,带来了诸多改进和新特性。本文将详细介绍Yolov8算法的原理、特点、

    2024年04月10日
    浏览(53)
  • 【Python】PyQt5入门

      最近接了一个小项目,主要任务是完成一个界面的设计,而且是基于Python,我第一反应就是使用大名鼎鼎的Qt来设计。Qt最早是用C语言开发的,但是后来也有了基于Python的第三方包,目前最新版是PyQt6.3,但是这个项目中使用的还是普及度更高的PyQt5。正好我也比较喜欢P

    2024年02月07日
    浏览(45)
  • 【python】软件开发——PyQt5、Qt Designer、信号与槽机制、计算器实现

    PyQt5 是一个基于 Python 的 GUI 框架,用于创建跨平台的桌面应用程序。它是 Qt 库的 Python 绑定,结合了 Python 的简洁和易用性以及 Qt 框架的强大功能。 Qt 是一个流行的 C++ 跨平台应用程序开发框架,提供了丰富的图形界面组件、网络通信、数据库访问、多线程等功能。PyQt5 允许

    2024年02月04日
    浏览(42)
  • PyQt5:窗口大小根据屏幕大小自适应调整

     

    2024年02月12日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包