乐于分享
好东西不私藏

PyQt5截图工具

PyQt5截图工具

🔥Python+PyQt5打造专属截图工具:自定义区域截图+自动保存,零基础也能学会!

哈喽各位小伙伴们!👋 在日常办公、学习、写文章、做教程的过程中,截图绝对是我们高频使用的功能。无论是截取电脑屏幕的局部内容、保存重要信息、制作演示素材,一款好用的截图工具都能大幅提升我们的效率。

Windows自带的截图工具功能基础,第三方截图软件要么广告缠身,要么功能冗余,想要一款纯净、无广告、自定义区域精准截图、截图后自动保存到指定文件夹、完全属于自己的轻量截图工具,该怎么办呢?

今天就带大家用Python+PyQt5从零开发一款专属截图工具!这款工具完美实现自定义区域截图(鼠标拖拽自由选择截图范围)、实时预览截图区域一键自动保存图片(无需手动命名、手动选择保存路径),界面简洁美观,操作零门槛,代码轻量易修改,哪怕你是Python新手,跟着教程一步步操作,也能轻松打造出专属自己的实用工具。

整个开发过程不依赖复杂的第三方库,核心代码通俗易懂,还能顺便学习PyQt5界面开发、鼠标事件处理、屏幕图像捕获、文件自动保存等实用编程知识点,一举多得!话不多说,我们直接开始打造这款实用截图小工具吧!

一、核心功能与开发环境准备

1. 工具核心功能

  1. 自定义区域截图:鼠标左键拖拽,精准框选需要截图的区域,支持实时显示选区边框;
  2. 自动保存:截图完成后自动保存到电脑指定文件夹,自动命名不重复;
  3. 便捷操作:右键取消截图、ESC键退出工具、鼠标松开立即完成截图;
  4. 简洁界面:全屏透明遮罩,截图区域高亮显示,视觉体验极佳。

2. 开发环境

  • Python 3.x
  • PyQt5(GUI界面开发)
  • Pillow(图片处理,可选)
  • 安装命令:
pip install pyqt5 pillow

二、代码核心模块详解(三大部分)

第一部分:截图窗口核心类(透明遮罩+鼠标监听)

这是工具的核心模块,我们创建一个全屏透明窗口作为截图遮罩,通过重写PyQt5的鼠标事件(按下、移动、松开),实现拖拽选区的功能。

  • 全屏显示窗口,覆盖整个屏幕,实现无干扰截图;
  • 透明背景+半透明遮罩,区分截图区域和非截图区域;
  • 监听鼠标左键按下(记录起点)、鼠标移动(绘制选区)、鼠标松开(完成截图);
  • 监听右键和ESC键,支持取消操作,提升使用体验。

第二部分:截图绘制与区域捕获(实时显示+图像抓取)

这一模块负责实时绘制截图选区捕获屏幕图像,是实现可视化截图的关键:

  • 通过paintEvent实时绘制拖拽的矩形选区,蓝色边框清晰醒目;
  • 利用PyQt5的QPixmap.grabWindow捕获系统屏幕图像,精准提取选区内容;
  • 自动处理图像坐标,确保截取的区域和鼠标框选的区域完全一致。

第三部分:自动保存功能(路径设置+文件命名)

无需手动操作,截图完成后自动保存,解放双手:

  • 自定义保存路径(默认保存在桌面截图保存文件夹,自动创建不存在的文件夹);
  • 时间戳命名文件,保证每张截图名称唯一,不会覆盖历史截图;
  • 保存成功后自动关闭截图窗口,直接在文件夹中查看截图,流程极简。

三、完整可运行代码

直接复制以下代码,运行即可使用截图工具,无需额外修改!

import sysimport osfrom datetime import datetimefrom PyQt5.QtWidgets import QApplication, QMainWindowfrom PyQt5.QtCore import Qt, QRectfrom PyQt5.QtGui import QPainter, QColor, QPen, QPixmap# 截图工具主窗口类classScreenshotTool(QMainWindow):def__init__(self):        super().__init__()# 初始化变量:起点、终点、截图标志        self.start_point = None        self.end_point = None        self.is_screenshot = False# 窗口设置:全屏、无边框、置顶显示        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)        self.setStyleSheet("background-color: rgba(0, 0, 0, 0.1)")  # 半透明遮罩        self.showFullScreen()  # 全屏显示# 绘图事件:实时绘制截图选区defpaintEvent(self, event):        super().paintEvent(event)if self.start_point and self.end_point:            painter = QPainter(self)            painter.setPen(QPen(QColor(0150255), 2))  # 蓝色边框,宽度2# 获取选区矩形坐标            rect = QRect(self.start_point, self.end_point)            painter.drawRect(rect)# 鼠标左键按下:记录截图起点defmousePressEvent(self, event):if event.button() == Qt.LeftButton:            self.start_point = event.pos()            self.end_point = self.start_point            self.is_screenshot = True            self.update()# 鼠标移动:实时更新截图终点defmouseMoveEvent(self, event):if self.is_screenshot:            self.end_point = event.pos()            self.update()# 鼠标左键松开:完成截图并自动保存defmouseReleaseEvent(self, event):if event.button() == Qt.LeftButton and self.is_screenshot:            self.capture_screen()  # 执行截图保存            self.close()  # 保存后关闭截图窗口# 鼠标右键按下:取消截图defmouseRightClickEvent(self, event):        self.close()# 键盘事件:ESC键退出截图defkeyPressEvent(self, event):if event.key() == Qt.Key_Escape:            self.close()# 核心:屏幕捕获与自动保存defcapture_screen(self):# 标准化选区坐标(解决从右下往左上拖拽的问题)        x1 = min(self.start_point.x(), self.end_point.x())        y1 = min(self.start_point.y(), self.end_point.y())        x2 = max(self.start_point.x(), self.end_point.x())        y2 = max(self.start_point.y(), self.end_point.y())        width = x2 - x1        height = y2 - y1# 捕获屏幕指定区域图像        screen = QApplication.primaryScreen()        pixmap = screen.grabWindow(            QApplication.desktop().winId(),            x1, y1, width, height        )# ===================== 自动保存配置 =====================# 保存路径:桌面/截图保存 文件夹        save_path = os.path.join(os.path.expanduser("~"), "Desktop""截图保存")ifnot os.path.exists(save_path):            os.makedirs(save_path)  # 不存在则自动创建文件夹# 文件名:时间戳(精确到毫秒),保证不重复        now = datetime.now().strftime("%Y%m%d_%H%M%S_%f")        save_file = os.path.join(save_path, f"截图_{now}.png")# 保存图片        pixmap.save(save_file, "png")        print(f"✅ 截图已自动保存:{save_file}")# 程序入口if __name__ == "__main__":    app = QApplication(sys.argv)    window = ScreenshotTool()    print("🚀 截图工具已启动!")    print("👉 操作说明:鼠标拖拽选择区域 → 松开自动保存 | 右键/ESC取消")    sys.exit(app.exec_())

四、运行使用教程

  1. 复制代码到Python文件(如screenshot_tool.py);
  2. 安装依赖库后,直接运行代码;
  3. 屏幕会出现半透明遮罩,鼠标左键拖拽选择需要截图的区域;
  4. 松开鼠标左键,截图自动保存到桌面「截图保存」文件夹
  5. 不想截图时,按ESC键或点击鼠标右键即可退出。

五、知识点总结

通过这款截图工具,我们掌握了以下核心编程知识点:

  1. PyQt5窗口高级设置:全屏显示、无边框窗口、窗口置顶、透明背景设置;
  2. PyQt5事件机制:鼠标事件(按下/移动/松开)、键盘事件、绘图事件的重写与使用;
  3. 屏幕图像捕获:使用QPixmapgrabWindow实现屏幕区域图像抓取;
  4. 文件操作:自动创建文件夹、路径拼接、时间戳文件命名、图片自动保存;
  5. 坐标处理:标准化矩形选区坐标,兼容任意拖拽方向。

六、拓展场景与测试步骤

1. 拓展应用场景

  1. 办公辅助:对接微信/钉钉,实现截图后自动发送;
  2. 笔记工具:截图后自动插入到Markdown笔记、Word文档中;
  3. 标注功能:添加文字、箭头、矩形标注,升级为截图标注工具;
  4. 快捷启动:打包为exe文件,设置桌面快捷键,一键启动截图;
  5. 批量截图:添加延时截图、多区域连续截图功能,适配演示需求。

2. 测试步骤

  1. 基础功能测试:运行代码,拖拽不同大小区域,验证截图是否完整清晰;
  2. 自动保存测试:检查桌面是否生成「截图保存」文件夹,文件是否自动命名;
  3. 操作体验测试:测试ESC键、右键取消功能,验证是否正常退出;
  4. 兼容性测试:在不同分辨率屏幕、Windows/macOS系统下运行,验证适配性;
  5. 重复截图测试:连续截取多张图片,验证文件是否不覆盖、保存正常。

🔥升级版PyQt5截图工具:窗口化启动+自由选区+自动保存,告别全屏黑屏!

哈喽各位小伙伴们!👋 之前给大家分享了全屏遮罩版的PyQt5截图工具,很多同学反馈启动后全屏黑屏,操作不习惯,想要窗口化启动、小界面运行,手动选择截取区域,安排!

这次我直接给大家升级改造!全新版本默认窗口化启动(小尺寸界面,不遮挡屏幕),完全没有全屏黑屏效果,工具窗口可以随意拖动、缩放,你想截图的时候,直接在窗口里点击「启动截图」按钮,再用鼠标拖拽框选目标区域即可,用完即关,清爽无干扰!

升级后的工具保留了所有核心实用功能:鼠标拖拽自定义选区、截图自动保存到桌面文件夹、时间戳命名不重复、ESC/右键取消截图,同时大幅优化使用体验:窗口化启动、可视化按钮操作、非截图状态不占用全屏、适配所有场景,无论是办公、学习、写代码,都能随手截图,零学习成本!

话不多说,直接上升级版教程和代码,复制就能运行,体验直接拉满!

一、升级版核心功能(优化版)

  1. 窗口化启动:默认小窗口运行,无全屏黑屏,可拖动缩放,不影响操作电脑;
  2. 按钮触发截图:点击「开始截图」按钮后才进入截图模式,自由可控;
  3. 自定义区域截图:鼠标拖拽框选,支持任意方向选区,蓝色边框可视化;
  4. 自动保存:截图后自动保存到桌面,自动创建文件夹,自动命名不覆盖;
  5. 安全退出:截图时ESC/右键取消,主窗口正常关闭,操作极简。

开发环境

pip install pyqt5 pillow

二、三大核心代码模块详解

模块1:主窗口设计(按钮+布局,解决全屏黑屏问题)

这是升级版的核心优化!我们创建一个普通窗口(非全屏),里面放一个启动按钮,作为工具的入口。

  • 窗口默认小尺寸,可拖动、可关闭,完全不遮挡屏幕;
  • 使用PyQt5按钮组件,点击后才调用截图功能,按需使用;
  • 窗口样式美观,文字提示清晰,新手一看就会用。

模块2:截图遮罩窗口(透明选区+鼠标事件)

点击按钮后,才会弹出半透明截图层,这时候可以拖拽截图。

  • 截图层仅在需要时显示,不使用时无任何干扰;
  • 监听鼠标按下/移动/松开,实时绘制选区,精准框选目标;
  • 坐标自动修正,无论从哪个方向拖拽,都能正确截图。

模块3:自动保存逻辑(路径+命名+存储)

和原版一样稳定好用,无需手动操作。

  • 自动在桌面创建「截图保存」文件夹;
  • 用年月日时分秒毫秒命名,保证截图不重复;
  • 保存完成自动关闭截图层,返回主窗口。

三、完整升级版代码(无全屏黑屏,窗口启动)

直接复制运行,完美满足你的需求!

import sysimport osfrom datetime import datetimefrom PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget,                              QVBoxLayout, QPushButton, QLabel)from PyQt5.QtCore import Qt, QRectfrom PyQt5.QtGui import QPainter, QColor, QPen, QPixmap# ===================== 核心截图窗口(点击按钮后才显示) =====================classScreenshotMask(QMainWindow):def__init__(self):        super().__init__()# 截图变量        self.start_pos = None        self.end_pos = None        self.is_drawing = False# 截图层设置:全屏、半透明、无边框、置顶        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)        self.setAttribute(Qt.WA_TranslucentBackground)        self.setStyleSheet("background-color: rgba(0,0,0,0.1);")defpaintEvent(self, event):        super().paintEvent(event)if self.start_pos and self.end_pos:            painter = QPainter(self)            painter.setPen(QPen(QColor(30144255), 2))  # 蓝色选区框            rect = QRect(self.start_pos, self.end_pos)            painter.drawRect(rect)defmousePressEvent(self, event):if event.button() == Qt.LeftButton:            self.start_pos = event.pos()            self.end_pos = event.pos()            self.is_drawing = TruedefmouseMoveEvent(self, event):if self.is_drawing:            self.end_pos = event.pos()            self.update()defmouseReleaseEvent(self, event):if event.button() == Qt.LeftButton and self.is_drawing:            self.capture_and_save()            self.close()defkeyPressEvent(self, event):if event.key() == Qt.Key_Escape:            self.close()# 截图+自动保存defcapture_and_save(self):        x1 = min(self.start_pos.x(), self.end_pos.x())        y1 = min(self.start_pos.y(), self.end_pos.y())        x2 = max(self.start_pos.x(), self.end_pos.x())        y2 = max(self.start_pos.y(), self.end_pos.y())        w, h = x2-x1, y2-y1if w < 5or h < 5:return# 抓取屏幕        screen = QApplication.primaryScreen()        pix = screen.grabWindow(QApplication.desktop().winId(), x1, y1, w, h)# 保存路径        save_dir = os.path.join(os.path.expanduser("~"), "Desktop""截图保存")ifnot os.path.exists(save_dir):            os.makedirs(save_dir)# 自动命名        filename = f"截图_{datetime.now().strftime('%Y%m%d_%H%M%S_%f')}.png"        save_path = os.path.join(save_dir, filename)        pix.save(save_path, "png")        print(f"✅ 保存成功:{save_path}")# ===================== 主窗口(小窗口启动,无全屏黑屏) =====================classMainWindow(QWidget):def__init__(self):        super().__init__()        self.init_ui()definit_ui(self):        self.setWindowTitle("PyQt5截图工具(窗口版)")        self.setFixedSize(320160)  # 小窗口,不遮挡# 布局        layout = QVBoxLayout()        layout.setAlignment(Qt.AlignCenter)        layout.setSpacing(20)# 提示文字        tip_label = QLabel("💡 点击下方按钮开始截图\n支持拖拽选区 | 自动保存到桌面")        tip_label.setAlignment(Qt.AlignCenter)        tip_label.setStyleSheet("font-size:14px; color:#333;")# 截图按钮        self.btn = QPushButton("📸 点击开始截图")        self.btn.setStyleSheet("""            QPushButton{                background-color:#1E90FF;                color:white;                font-size:16px;                padding:12px 20px;                border-radius:8px;                border:none;            }            QPushButton:hover{                background-color:#1873CC;            }        """)        self.btn.clicked.connect(self.start_screenshot)        layout.addWidget(tip_label)        layout.addWidget(self.btn)        self.setLayout(layout)# 启动截图defstart_screenshot(self):        self.minimize_window()        self.screenshot = ScreenshotMask()        self.screenshot.showFullScreen()# 截图时最小化主窗口(不干扰截图)defminimize_window(self):        self.showMinimized()# ===================== 程序入口 =====================if __name__ == "__main__":    app = QApplication(sys.argv)    window = MainWindow()    window.show()    print("🚀 工具启动成功!")    print("👉 点击按钮截图 → 拖拽选区 → 松开自动保存 | ESC取消")    sys.exit(app.exec_())

四、使用方法(超简单)

  1. 运行代码,弹出小窗口(无黑屏、无全屏);
  2. 点击 【点击开始截图】 按钮;
  3. 屏幕出现淡蓝色遮罩,鼠标拖拽选择要截取的区域;
  4. 松开鼠标,自动保存到桌面「截图保存」文件夹
  5. 不想截图按 ESC键 退出。

五、核心知识点总结

  1. PyQt5双窗口设计:主窗口(控制入口)+ 截图窗口(功能实现),解耦更清晰;
  2. 窗口基础设置:固定尺寸、最小化、样式美化,实现美观小工具;
  3. 按钮信号与槽:点击按钮触发截图功能,实现按需调用;
  4. 透明遮罩实现:半透明背景+无边框窗口,不影响视觉;
  5. 鼠标/绘图/键盘事件:PyQt5三大核心事件,实现交互截图;
  6. 文件自动化处理:自动创建目录、自动命名、自动保存。

六、拓展场景 + 测试步骤

1. 拓展应用场景

  1. 添加快捷键:设置Ctrl+Shift+A一键截图,不用点击按钮;
  2. 截图预览:保存前弹出预览窗口,可重新截取;
  3. 复制到剪贴板:截图后自动复制,直接粘贴到微信/Word;
  4. 截图标注:添加箭头、文字、矩形标注功能;
  5. 打包EXE:打包成桌面软件,无Python环境也能用。

2. 标准测试步骤

  1. 启动测试:运行代码,正常弹出小窗口,无全屏黑屏;
  2. 截图测试:点击按钮,拖拽选区,松开后正确截图;
  3. 保存测试:桌面生成文件夹,截图文件自动命名;
  4. 取消测试:截图时按ESC,正常退出截图模式;
  5. 连续测试:多次截图,不覆盖、不报错、保存正常。

总结

这款窗口化升级版PyQt5截图工具,彻底解决了全屏黑屏的问题,采用主窗口+截图层分离设计,操作更符合日常使用习惯,功能完整、代码简洁、拓展性强。你不用再忍受全屏遮挡,想截图就点按钮,用完即关,非常适合日常使用!

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » PyQt5截图工具

猜你喜欢

  • 暂无文章