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

相关推荐
ii_best7 分钟前
安卓/ios脚本开发辅助工具按键精灵横纵坐标转换教程
android·开发语言·ios·安卓
Cigaretter719 分钟前
Day 38 早停策略和模型权重的保存
python·深度学习·机器学习
a31582380619 分钟前
Android 大图显示策略优化显示(二)
android·java·开发语言·javascript·kotlin·glide·图片加载
月明长歌30 分钟前
Java多线程线程池ThreadPoolExecutor理解总结:6 个核心参数 + 4 种拒绝策略(附完整示例)
java·开发语言
sunywz33 分钟前
【JVM】(2)java类加载机制
java·jvm·python
Silence_Jy37 分钟前
GPU架构
python
学编程的小鬼37 分钟前
JVM 常见的问题
开发语言·jvm
故事不长丨40 分钟前
C#File文件操作全解析:从基础用法到异常处理
服务器·开发语言·visualstudio·c#·文件操作·io流·file
kwg12641 分钟前
本地搭建 OPC UA MCP 服务
python·agent·mcp
belldeep43 分钟前
python:mnist 数据集下载,parse
python·numpy·mnist