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

相关推荐
guodingdingh30 分钟前
软件开发工作问题总结0718
java·开发语言·数据库
优橙教育2 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
想会飞的蒲公英3 小时前
计算机怎样读取中文文本:编码、清洗与标准化
人工智能·python·自然语言处理
SeaTunnel4 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
深度研习笔记4 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
碎光拾影4 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
CCPC不拿奖不改名5 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github
Marst Code5 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
databook5 小时前
当散点图不够用时:用 t-SNE 可视化多维数据
python·数据分析·数据可视化
Miao121315 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言