You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现类似Snipping Tool的点击拖拽截图功能?

实现类似Snipping Tool的Python截图程序

嘿,我懂你想要做一个像Windows自带截图工具那样,能通过鼠标拖拽选择区域再保存的Python程序~你现在用的pyscreenshot代码只能截取全屏,没法满足选区需求,我给你整了个完整的实现方案,一起来看看吧!

实现思路

要实现鼠标拖拽选区域,我们需要一个GUI窗口来捕捉鼠标的按下、拖拽、释放事件,记录选区的坐标,再用截图库截取对应区域的内容并保存。这里我们用tkinter做交互界面(Python自带,不用额外装),pyscreenshot处理截图。

完整代码

import tkinter as tk
from tkinter import messagebox
import pyscreenshot as ImageGrab
import os

class SnippingTool:
    def __init__(self, root):
        self.root = root
        # 设置窗口为全屏、半透明、置顶
        self.root.attributes('-fullscreen', True)
        self.root.attributes('-alpha', 0.3)
        self.root.attributes('-topmost', True)
        
        # 初始化坐标变量
        self.start_x = None
        self.start_y = None
        self.current_x = None
        self.current_y = None
        
        # 创建画布用来绘制选区框
        self.canvas = tk.Canvas(root, cursor='cross', bg='gray')
        self.canvas.pack(fill=tk.BOTH, expand=True)
        
        # 绑定鼠标事件
        self.canvas.bind('<ButtonPress-1>', self.on_mouse_press)
        self.canvas.bind('<B1-Motion>', self.on_mouse_drag)
        self.canvas.bind('<ButtonRelease-1>', self.on_mouse_release)
        
    def on_mouse_press(self, event):
        # 记录鼠标按下的起始点
        self.start_x = event.x
        self.start_y = event.y
        # 清除之前的选区痕迹
        self.canvas.delete('selection')
        
    def on_mouse_drag(self, event):
        # 拖拽时实时更新选区框
        self.current_x = event.x
        self.current_y = event.y
        self.canvas.delete('selection')
        # 绘制红色边框的选区矩形
        self.canvas.create_rectangle(self.start_x, self.start_y, self.current_x, self.current_y, 
                                     outline='red', width=2, tags='selection')
        
    def on_mouse_release(self, event):
        # 计算选区的正确坐标(确保左上到右下)
        x1 = min(self.start_x, self.current_x)
        y1 = min(self.start_y, self.current_y)
        x2 = max(self.start_x, self.current_x)
        y2 = max(self.start_y, self.current_y)
        
        # 关闭半透明的选区窗口
        self.root.destroy()
        
        # 截取并保存有效选区
        if x2 > x1 and y2 > y1:
            im = ImageGrab.grab(bbox=(x1, y1, x2, y2))
            # 保存到当前目录,文件名可以自定义
            save_path = os.path.join(os.getcwd(), 'snipped_area.png')
            im.save(save_path)
            messagebox.showinfo('搞定啦', f'截图已经保存到:\n{save_path}')
        else:
            messagebox.showwarning('提示', '请选择一个有效的截图区域哦!')

if __name__ == '__main__':
    root = tk.Tk()
    app = SnippingTool(root)
    root.mainloop()

代码说明

  • 窗口设置:全屏半透明窗口让你能清晰看到后面的内容,方便精准选择区域;置顶属性确保窗口不会被其他程序挡住。
  • 鼠标事件绑定:
    • 鼠标按下时记录起始坐标,清除旧选区
    • 拖拽时实时绘制红色的选区边框
    • 释放时计算出正确的选区范围,关闭窗口后截取对应区域
  • 截图保存:用ImageGrab.grab(bbox=...)指定截取的区域,保存到当前目录,还会弹出提示告诉你保存路径。

依赖安装

只需要安装pyscreenshot就行,执行下面的命令:

pip install pyscreenshot

小技巧

  • 如果pyscreenshot在你的系统上有兼容性问题,可以换成PIL的ImageGrab,把开头的导入语句改成from PIL import ImageGrab就行(Windows上用PIL的ImageGrab更稳定,Linux/macOS可能需要额外处理)。
  • 可以调整窗口透明度:修改self.root.attributes('-alpha', 0.3)里的数值(0完全透明,1完全不透明)。
  • 选区框的样式也能改:把create_rectangle里的outline='red'换成你喜欢的颜色,width=2调整边框粗细。

内容的提问来源于stack exchange,提问作者ATP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:44:40