python(48) : 命名截图[Windows工具(3)]

1.说明

这是一个支持自定义文件名的截图工具,截图后会弹出置顶输入框让你输入文件名。

✨ 主要特点

  • 🎯 全局热键:Ctrl + Shift + X 随时启动截图

  • ✏️ 自定义命名:截图后弹出置顶输入框,输入你想要的文件名

  • 🖼️ 可视化选区:亮青色边框,清晰标识截图区域

  • 📁 专属文件夹:所有截图保存在 name_screenshots 文件夹

  • ⚠️ 重复检测:文件名重复时会提示是否覆盖

  • 🛡️ 安全命名:自动过滤非法文件名字符

🚀 使用方法

  1. 启动程序

    复制代码
    python 命名截图.py
  2. 开始截图

    • Ctrl + Shift + X 启动截图
  3. 框选区域

    • 鼠标拖拽选择要截图的区域
  4. 输入文件名

    • 松开鼠标后会弹出置顶输入框

    • 输入你想要的文件名(不需要输入 .png 后缀)

    • 点击确定保存,或取消放弃

  5. 查看截图

    • 截图保存在 name_screenshots/ 文件夹
  6. 退出程序

    • 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/ |
| 命名对话框 | ❌ | ✅ |
| 重复检测 | ❌ | ✅ |
| 适用场景 | 快速批量截图 | 需要有意义的文件名 |

💡 使用建议

  • 快速截图:适合大量截图,不需要记住每张图

    python 复制代码
    import 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("🔚 程序已退出")

    片的内容

  • 命名截图:适合需要管理和查找的重要截图,通过文件名快速识别内容

2.python代码

相关推荐
骁的小小站4 小时前
Learn C the Hardway学习笔记和拓展知识(一)
c语言·开发语言·c++·经验分享·笔记·学习·bash
花哥码天下4 小时前
Oracle下载JDK无需登录
java·开发语言
bestcxx4 小时前
0.2、AI Agent 开发中 ReAct 和 MAS 的概念
人工智能·python·dify·ai agent
早点.早点.5 小时前
QT登陆界面
开发语言·qt
楼田莉子5 小时前
C++学习:异常及其处理
开发语言·c++·学习·visual studio
fsnine5 小时前
Python Web框架对比与模型部署
开发语言·前端·python
海梨花5 小时前
【八股笔记】SSM
java·开发语言·笔记·后端·面试·框架
JAVA学习通5 小时前
OJ竞赛平台----C端题目列表
java·开发语言·jvm·vue.js·elasticsearch
B站计算机毕业设计之家5 小时前
深度学习实战:python动物识别分类检测系统 计算机视觉 Django框架 CNN算法 深度学习 卷积神经网络 TensorFlow 毕业设计(建议收藏)✅
python·深度学习·算法·计算机视觉·分类·毕业设计·动物识别