1.说明
这是一个支持自定义文件名的截图工具,截图后会弹出置顶输入框让你输入文件名。
✨ 主要特点
-
🎯 全局热键:
Ctrl + Shift + X
随时启动截图 -
✏️ 自定义命名:截图后弹出置顶输入框,输入你想要的文件名
-
🖼️ 可视化选区:亮青色边框,清晰标识截图区域
-
📁 专属文件夹:所有截图保存在
name_screenshots
文件夹 -
⚠️ 重复检测:文件名重复时会提示是否覆盖
-
🛡️ 安全命名:自动过滤非法文件名字符
🚀 使用方法
-
启动程序
python 命名截图.py
-
开始截图
- 按
Ctrl + Shift + X
启动截图
- 按
-
框选区域
- 鼠标拖拽选择要截图的区域
-
输入文件名
-
松开鼠标后会弹出置顶输入框
-
输入你想要的文件名(不需要输入 .png 后缀)
-
点击确定保存,或取消放弃
-
-
查看截图
- 截图保存在
name_screenshots/
文件夹
- 截图保存在
-
退出程序
- 按
Esc
键退出
- 按
📦 依赖库
pip install mss PyQt5 keyboard
💡 使用示例
假设你截取了一张图片,输入文件名为 "会议记录",文件会保存为:
name_screenshots/会议记录.png
🎨 视觉效果
-
边框颜色:亮青色(非常醒目)
-
边框宽度:4像素实线
-
背景遮罩:30%透明度黑色遮罩
-
输入框:置顶显示,不会被其他窗口遮挡
⚙️ 自定义配置
可以在代码顶部修改配置:
-
BORDER_COLOR
:边框颜色 -
BORDER_WIDTH
:边框宽度 -
SELECTION_OPACITY
:遮罩透明度 -
SAVE_DIR
:保存目录(默认:name_screenshots)
🔐 文件名安全处理
程序会自动过滤以下非法字符,替换为下划线:
< > : " / \ | ? *
例如:输入 "文件:测试" 会保存为 "文件_测试.png"
📂 文件结构
截图/
├── 命名截图.py # 主程序
├── 命名截图说明.md # 本说明文档
└── name_screenshots/ # 截图保存文件夹(自动创建)
├── 会议记录.png
├── 重要内容.png
└── ...
🆚 与快速截图的区别
|-------|-----------------------|-------------------|
| 功能 | 快速截图.py | 命名截图.py |
| 文件命名 | 自动编号(1.png, 2.png...) | 手动输入名称 |
| 保存位置 | screenshots/ | name_screenshots/ |
| 命名对话框 | ❌ | ✅ |
| 重复检测 | ❌ | ✅ |
| 适用场景 | 快速批量截图 | 需要有意义的文件名 |
💡 使用建议
-
快速截图:适合大量截图,不需要记住每张图
pythonimport mss import sys import os from PyQt5.QtWidgets import QApplication, QWidget, QInputDialog, QMessageBox from PyQt5.QtCore import Qt, QRect, QPoint from PyQt5.QtGui import QPainter, QPen, QBrush, QColor import keyboard # ================== 配置区 ================== SAVE_DIR = "name_screenshots" os.makedirs(SAVE_DIR, exist_ok=True) # ✅ 自定义样式 BORDER_COLOR = QColor(0, 255, 255) # 亮青色,非常醒目 BORDER_WIDTH = 4 # 线宽(增加到4像素) SELECTION_OPACITY = 0.3 # 选中区域外部的遮罩透明度 (0.0~1.0),稍微提高对比度 # ========================================== class CaptureWindow(QWidget): def __init__(self): super().__init__() # 全屏无边框窗口,置顶 self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) self.setGeometry(QApplication.desktop().availableGeometry()) # 设置遮罩背景(半透明) self.setStyleSheet(f"background-color: black;") self.setWindowOpacity(SELECTION_OPACITY) self.begin = QPoint() self.end = QPoint() self.screenshot_data = None def paintEvent(self, event): if self.begin == self.end: return painter = QPainter(self) # 设置边框 pen = QPen(BORDER_COLOR) pen.setWidth(BORDER_WIDTH) pen.setStyle(Qt.SolidLine) # 实线效果(更清晰) painter.setPen(pen) # 去除填充,只画边框 painter.setBrush(QBrush(Qt.NoBrush)) # 绘制矩形 rect = QRect(self.begin, self.end) painter.drawRect(rect) def mousePressEvent(self, event): self.begin = event.pos() self.end = event.pos() self.update() def mouseMoveEvent(self, event): self.end = event.pos() self.update() def mouseReleaseEvent(self, event): self.end = event.pos() self.close() # 关闭选择窗口 # 获取矩形坐标 x1 = min(self.begin.x(), self.end.x()) y1 = min(self.begin.y(), self.end.y()) x2 = max(self.begin.x(), self.end.x()) y2 = max(self.begin.y(), self.end.y()) width = x2 - x1 height = y2 - y1 if width < 5 or height < 5: # 防止误触 return # 使用 mss 截图 with mss.mss() as sct: monitor = { "top": y1, "left": x1, "width": width, "height": height } img = sct.grab(monitor) self.screenshot_data = (img.rgb, img.size) # 弹出命名对话框 self.show_name_dialog() def show_name_dialog(self): """显示命名对话框""" if not self.screenshot_data: return # 创建输入对话框 name, ok = QInputDialog.getText( None, '保存截图', '请输入文件名(不需要输入.png后缀):', flags=Qt.WindowStaysOnTopHint # 置顶显示 ) if ok and name.strip(): # 清理文件名,移除不合法字符 name = name.strip() invalid_chars = ['<', '>', ':', '"', '/', '\\', '|', '?', '*'] for char in invalid_chars: name = name.replace(char, '_') # 保存文件 filename = os.path.join(SAVE_DIR, f"{name}.png") # 如果文件已存在,询问是否覆盖 # if os.path.exists(filename): # reply = QMessageBox.question( # None, # '文件已存在', # f'文件 "{name}.png" 已存在,是否覆盖?', # QMessageBox.Yes | QMessageBox.No, # QMessageBox.No # ) # if reply == QMessageBox.No: # # 重新询问文件名 # self.show_name_dialog() # return # 保存截图 mss.tools.to_png(self.screenshot_data[0], self.screenshot_data[1], output=filename) print(f"✅ 截图已保存: {filename}") # 显示成功提示 # msg = QMessageBox() # msg.setWindowTitle('保存成功') # msg.setText(f'截图已保存为: {name}.png') # msg.setIcon(QMessageBox.Information) # msg.setWindowFlags(Qt.WindowStaysOnTopHint) # msg.exec_() else: print("❌ 取消保存截图") def start_capture(): app = QApplication.instance() or QApplication(sys.argv) window = CaptureWindow() window.show() app.exec_() # 注册快捷键 keyboard.add_hotkey('ctrl+shift+x', start_capture) print("📸 命名截图工具已启动!") print(f" 🔑 快捷键:Ctrl + Shift + X 开始截图") print(f" 📁 保存路径:{os.path.abspath(SAVE_DIR)}") print(f" 💾 截图后会弹出命名对话框") print(f" 🚪 按 Esc 退出程序") # 保持运行,直到按下 Esc keyboard.wait('esc') print("🔚 程序已退出")
片的内容
-
命名截图:适合需要管理和查找的重要截图,通过文件名快速识别内容