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代码

相关推荐
似水明俊德3 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
qq_417695053 小时前
机器学习与人工智能
jvm·数据库·python
漫随流水3 小时前
旅游推荐系统(view.py)
前端·数据库·python·旅游
Thera7774 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
yy我不解释4 小时前
关于comfyui的mmaudio音频生成插件时时间不一致问题(一)
python·ai作画·音视频·comfyui
炘爚4 小时前
C语言(文件操作)
c语言·开发语言
阿蒙Amon4 小时前
C#常用类库-详解SerialPort
开发语言·c#
凸头5 小时前
CompletableFuture 与 Future 对比与实战示例
java·开发语言
wuqingshun3141595 小时前
线程安全需要保证几个基本特征
java·开发语言·jvm
Moksha2625 小时前
5G、VoNR基本概念
开发语言·5g·php