python(46) : 延时截图[Windows工具(1)]

1.说明

延时选中指定区域截图, 延时秒数为命令行参数: --delay=3 , 单位秒, 默认0秒

2.安装依赖

pip install Pillow>=10.0.0 pywin32>=306 -i https://mirrors.aliyun.com/pypi/simple/ requests

3.代码

"""
屏幕截图工具 - 鼠标选择区域并复制到剪贴板
使用方法:运行脚本,用鼠标拖动选择区域,释放鼠标后自动复制到剪贴板
"""
import tkinter as tk
from PIL import ImageGrab, Image
import io


class ScreenshotTool:
    def __init__(self):
        self.root = tk.Tk()
        self.root.attributes('-fullscreen', True)
        self.root.attributes('-alpha', 0.3)  # 半透明效果
        self.root.configure(bg='grey')
        self.root.attributes('-topmost', True)
        
        self.canvas = tk.Canvas(self.root, cursor="cross", bg='grey')
        self.canvas.pack(fill=tk.BOTH, expand=True)
        
        self.start_x = None
        self.start_y = None
        self.rect = None
        
        # 绑定鼠标事件
        self.canvas.bind("<ButtonPress-1>", self.on_mouse_down)
        self.canvas.bind("<B1-Motion>", self.on_mouse_drag)
        self.canvas.bind("<ButtonRelease-1>", self.on_mouse_up)
        self.canvas.bind("<ButtonPress-3>", self.on_cancel)  # 右键取消
        
        # 绑定键盘事件到 root 窗口(重要!)
        self.root.bind("<Escape>", self.on_cancel)
        self.root.bind("<Key-Escape>", self.on_cancel)
        
        # 确保窗口获得焦点
        self.root.focus_force()
        
        # 显示提示信息
        self.canvas.create_text(
            self.root.winfo_screenwidth() // 2,
            50,
            text="拖动鼠标选择区域 | 按ESC或右键取消",
            fill="white",
            font=("Arial", 16, "bold")
        )
    
    def on_cancel(self, event=None):
        """取消截图"""
        print("已取消截图")
        self.root.destroy()
        
    def on_mouse_down(self, event):
        """鼠标按下"""
        self.start_x = event.x
        self.start_y = event.y
        
        # 删除之前的矩形
        if self.rect:
            self.canvas.delete(self.rect)
            
    def on_mouse_drag(self, event):
        """鼠标拖动"""
        if self.rect:
            self.canvas.delete(self.rect)
            
        # 绘制选择矩形
        self.rect = self.canvas.create_rectangle(
            self.start_x, self.start_y, event.x, event.y,
            outline='cyan', width=3
        )
        
    def on_mouse_up(self, event):
        """鼠标释放 - 截图并复制到剪贴板"""
        end_x = event.x
        end_y = event.y
        
        # 确保坐标正确(左上到右下)
        x1 = min(self.start_x, end_x)
        y1 = min(self.start_y, end_y)
        x2 = max(self.start_x, end_x)
        y2 = max(self.start_y, end_y)
        
        # 关闭选择窗口
        self.root.destroy()
        
        # 等待窗口完全关闭
        self.root.update()
        
        # 截取屏幕区域
        if x2 - x1 > 0 and y2 - y1 > 0:
            screenshot = ImageGrab.grab(bbox=(x1, y1, x2, y2))
            
            # 复制到剪贴板
            self.copy_to_clipboard(screenshot)
            print(f"截图成功!区域: ({x1}, {y1}) -> ({x2}, {y2})")
            print("图片已复制到剪贴板")
        else:
            print("选择区域太小,已取消")
            
    def copy_to_clipboard(self, image):
        """将图片复制到剪贴板 (Windows)"""
        try:
            # Windows 剪贴板方法
            import win32clipboard
            from io import BytesIO
            
            output = BytesIO()
            image.convert('RGB').save(output, 'BMP')
            data = output.getvalue()[14:]  # BMP文件头是14字节,剪贴板不需要
            output.close()
            
            win32clipboard.OpenClipboard()
            win32clipboard.EmptyClipboard()
            win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
            win32clipboard.CloseClipboard()
        except ImportError:
            # 如果没有 win32clipboard,尝试使用 PIL 的方法
            try:
                # 保存到临时文件然后使用系统命令
                import tempfile
                import os
                
                temp_path = os.path.join(tempfile.gettempdir(), 'screenshot_temp.png')
                image.save(temp_path)
                
                # 使用 tkinter 的剪贴板(仅支持文本,所以这个方法有限制)
                # 更好的方法是安装 pyperclip 或 win32clipboard
                print("警告:需要安装 pywin32 库以支持图片复制")
                print("请运行: pip install pywin32")
                print(f"截图已保存到: {temp_path}")
            except Exception as e:
                print(f"复制到剪贴板失败: {e}")
                
    def run(self):
        """运行工具"""
        self.root.mainloop()


if __name__ == "__main__":
    import argparse
    import time

    parser = argparse.ArgumentParser(description="截图工具")
    parser.add_argument(
        "--delay", "-d", type=int, default=0,
        help="延迟秒数,延时后开始截图(默认0秒)"
    )
    args = parser.parse_args()

    print("启动截图工具...")
    print("使用说明:")
    print("1. 用鼠标拖动选择要截取的区域")
    print("2. 释放鼠标后,截图将自动复制到剪贴板")
    print("3. 按 ESC 键或鼠标右键取消")
    print("-" * 50)
    if args.delay > 0:
        print(f"将在 {args.delay} 秒后启动截图...")
        time.sleep(args.delay)

    app = ScreenshotTool()
    app.run()

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值