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

相关推荐
自由随风飘2 小时前
python 题目练习1~5
开发语言·python
Bony-3 小时前
Go语言完全学习指南 - 从基础到精通------语言基础篇
服务器·开发语言·golang
fl1768314 小时前
基于python的天气预报系统设计和可视化数据分析源码+报告
开发语言·python·数据分析
ACP广源盛139246256735 小时前
(ACP广源盛)GSV6172---MIPI/LVDS 信号转换为 Type-C/DisplayPort 1.4/HDMI 2.0 并集成嵌入式 MCU
c语言·开发语言·单片机·嵌入式硬件·音视频
不穿格子的程序员5 小时前
从零开始刷算法-栈-括号匹配
java·开发语言·
闲人编程5 小时前
Python与区块链:如何用Web3.py与以太坊交互
python·安全·区块链·web3.py·以太坊·codecapsule
雪域迷影5 小时前
C#中通过get请求获取api.open-meteo.com网站的天气数据
开发语言·http·c#·get
yue0085 小时前
C#类继承
java·开发语言·c#
Want5955 小时前
Python汤姆猫
开发语言·python
Larry_Yanan6 小时前
QML学习笔记(五十)QML与C++交互:QML中单例C++对象
开发语言·c++·笔记·qt·学习·ui·交互