PyQt5截图工具
🔥Python+PyQt5打造专属截图工具:自定义区域截图+自动保存,零基础也能学会!
哈喽各位小伙伴们!👋 在日常办公、学习、写文章、做教程的过程中,截图绝对是我们高频使用的功能。无论是截取电脑屏幕的局部内容、保存重要信息、制作演示素材,一款好用的截图工具都能大幅提升我们的效率。
Windows自带的截图工具功能基础,第三方截图软件要么广告缠身,要么功能冗余,想要一款纯净、无广告、自定义区域精准截图、截图后自动保存到指定文件夹、完全属于自己的轻量截图工具,该怎么办呢?
今天就带大家用Python+PyQt5从零开发一款专属截图工具!这款工具完美实现自定义区域截图(鼠标拖拽自由选择截图范围)、实时预览截图区域、一键自动保存图片(无需手动命名、手动选择保存路径),界面简洁美观,操作零门槛,代码轻量易修改,哪怕你是Python新手,跟着教程一步步操作,也能轻松打造出专属自己的实用工具。
整个开发过程不依赖复杂的第三方库,核心代码通俗易懂,还能顺便学习PyQt5界面开发、鼠标事件处理、屏幕图像捕获、文件自动保存等实用编程知识点,一举多得!话不多说,我们直接开始打造这款实用截图小工具吧!
一、核心功能与开发环境准备
1. 工具核心功能
-
自定义区域截图:鼠标左键拖拽,精准框选需要截图的区域,支持实时显示选区边框; -
自动保存:截图完成后自动保存到电脑指定文件夹,自动命名不重复; -
便捷操作:右键取消截图、ESC键退出工具、鼠标松开立即完成截图; -
简洁界面:全屏透明遮罩,截图区域高亮显示,视觉体验极佳。
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(0, 150, 255), 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_())
四、运行使用教程
-
复制代码到Python文件(如 screenshot_tool.py); -
安装依赖库后,直接运行代码; -
屏幕会出现半透明遮罩,鼠标左键拖拽选择需要截图的区域; -
松开鼠标左键,截图自动保存到桌面「截图保存」文件夹; -
不想截图时,按ESC键或点击鼠标右键即可退出。
五、知识点总结
通过这款截图工具,我们掌握了以下核心编程知识点:
-
PyQt5窗口高级设置:全屏显示、无边框窗口、窗口置顶、透明背景设置; -
PyQt5事件机制:鼠标事件(按下/移动/松开)、键盘事件、绘图事件的重写与使用; -
屏幕图像捕获:使用 QPixmap和grabWindow实现屏幕区域图像抓取; -
文件操作:自动创建文件夹、路径拼接、时间戳文件命名、图片自动保存; -
坐标处理:标准化矩形选区坐标,兼容任意拖拽方向。
六、拓展场景与测试步骤
1. 拓展应用场景
-
办公辅助:对接微信/钉钉,实现截图后自动发送; -
笔记工具:截图后自动插入到Markdown笔记、Word文档中; -
标注功能:添加文字、箭头、矩形标注,升级为截图标注工具; -
快捷启动:打包为exe文件,设置桌面快捷键,一键启动截图; -
批量截图:添加延时截图、多区域连续截图功能,适配演示需求。
2. 测试步骤
-
基础功能测试:运行代码,拖拽不同大小区域,验证截图是否完整清晰; -
自动保存测试:检查桌面是否生成「截图保存」文件夹,文件是否自动命名; -
操作体验测试:测试ESC键、右键取消功能,验证是否正常退出; -
兼容性测试:在不同分辨率屏幕、Windows/macOS系统下运行,验证适配性; -
重复截图测试:连续截取多张图片,验证文件是否不覆盖、保存正常。
🔥升级版PyQt5截图工具:窗口化启动+自由选区+自动保存,告别全屏黑屏!
哈喽各位小伙伴们!👋 之前给大家分享了全屏遮罩版的PyQt5截图工具,很多同学反馈启动后全屏黑屏,操作不习惯,想要窗口化启动、小界面运行,手动选择截取区域,安排!
这次我直接给大家升级改造!全新版本默认窗口化启动(小尺寸界面,不遮挡屏幕),完全没有全屏黑屏效果,工具窗口可以随意拖动、缩放,你想截图的时候,直接在窗口里点击「启动截图」按钮,再用鼠标拖拽框选目标区域即可,用完即关,清爽无干扰!
升级后的工具保留了所有核心实用功能:鼠标拖拽自定义选区、截图自动保存到桌面文件夹、时间戳命名不重复、ESC/右键取消截图,同时大幅优化使用体验:窗口化启动、可视化按钮操作、非截图状态不占用全屏、适配所有场景,无论是办公、学习、写代码,都能随手截图,零学习成本!
话不多说,直接上升级版教程和代码,复制就能运行,体验直接拉满!
一、升级版核心功能(优化版)
-
窗口化启动:默认小窗口运行,无全屏黑屏,可拖动缩放,不影响操作电脑; -
按钮触发截图:点击「开始截图」按钮后才进入截图模式,自由可控; -
自定义区域截图:鼠标拖拽框选,支持任意方向选区,蓝色边框可视化; -
自动保存:截图后自动保存到桌面,自动创建文件夹,自动命名不覆盖; -
安全退出:截图时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(30, 144, 255), 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(320, 160) # 小窗口,不遮挡# 布局 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_())
四、使用方法(超简单)
-
运行代码,弹出小窗口(无黑屏、无全屏); -
点击 【点击开始截图】 按钮; -
屏幕出现淡蓝色遮罩,鼠标拖拽选择要截取的区域; -
松开鼠标,自动保存到桌面「截图保存」文件夹; -
不想截图按 ESC键 退出。
五、核心知识点总结
-
PyQt5双窗口设计:主窗口(控制入口)+ 截图窗口(功能实现),解耦更清晰; -
窗口基础设置:固定尺寸、最小化、样式美化,实现美观小工具; -
按钮信号与槽:点击按钮触发截图功能,实现按需调用; -
透明遮罩实现:半透明背景+无边框窗口,不影响视觉; -
鼠标/绘图/键盘事件:PyQt5三大核心事件,实现交互截图; -
文件自动化处理:自动创建目录、自动命名、自动保存。
六、拓展场景 + 测试步骤
1. 拓展应用场景
-
添加快捷键:设置 Ctrl+Shift+A一键截图,不用点击按钮; -
截图预览:保存前弹出预览窗口,可重新截取; -
复制到剪贴板:截图后自动复制,直接粘贴到微信/Word; -
截图标注:添加箭头、文字、矩形标注功能; -
打包EXE:打包成桌面软件,无Python环境也能用。
2. 标准测试步骤
-
启动测试:运行代码,正常弹出小窗口,无全屏黑屏; -
截图测试:点击按钮,拖拽选区,松开后正确截图; -
保存测试:桌面生成文件夹,截图文件自动命名; -
取消测试:截图时按ESC,正常退出截图模式; -
连续测试:多次截图,不覆盖、不报错、保存正常。
总结
这款窗口化升级版PyQt5截图工具,彻底解决了全屏黑屏的问题,采用主窗口+截图层分离设计,操作更符合日常使用习惯,功能完整、代码简洁、拓展性强。你不用再忍受全屏遮挡,想截图就点按钮,用完即关,非常适合日常使用!
夜雨聆风