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

如何用PyAutoGUI实现类似ShareX的区域截图交互功能?

实现拖动选框式区域截图

要实现类似ShareX的拖动选框截图交互,需要结合鼠标事件监听和实时选框绘制,以下用Python内置的tkinter配合pyautogui完成,无需额外安装GUI库:

完整代码

import tkinter as tk
import pyautogui

class RegionSelector:
    def __init__(self):
        self.root = tk.Tk()
        # 配置全屏透明置顶窗口
        self.root.attributes('-fullscreen', True)
        self.root.attributes('-alpha', 0.3)
        self.root.attributes('-topmost', True)
        self.root.config(cursor='cross')

        self.start_x = None
        self.start_y = None
        self.rect = None

        # 创建画布用于绘制选框
        self.canvas = tk.Canvas(self.root, bg='gray')
        self.canvas.pack(fill=tk.BOTH, expand=True)

        # 绑定鼠标事件
        self.canvas.bind('<ButtonPress-1>', self.on_press)
        self.canvas.bind('<B1-Motion>', self.on_drag)
        self.canvas.bind('<ButtonRelease-1>', self.on_release)

        self.root.mainloop()

    def on_press(self, event):
        # 记录选框起始坐标
        self.start_x = event.x
        self.start_y = event.y
        # 清除旧选框并创建新选框
        if self.rect:
            self.canvas.delete(self.rect)
        self.rect = self.canvas.create_rectangle(self.start_x, self.start_y, self.start_x, self.start_y, outline='red', width=2)

    def on_drag(self, event):
        # 拖动时实时更新选框大小
        current_x, current_y = event.x, event.y
        # 自动调整选框坐标,适配任意拖动方向
        x1 = min(self.start_x, current_x)
        y1 = min(self.start_y, current_y)
        x2 = max(self.start_x, current_x)
        y2 = max(self.start_y, current_y)
        self.canvas.coords(self.rect, x1, y1, x2, y2)

    def on_release(self, event):
        # 释放鼠标后计算截图区域
        x1 = min(self.start_x, event.x)
        y1 = min(self.start_y, event.y)
        x2 = max(self.start_x, event.x)
        y2 = max(self.start_y, event.y)
        width = x2 - x1
        height = y2 - y1

        # 关闭选框窗口
        self.root.destroy()

        # 截取有效区域并保存
        if width > 0 and height > 0:
            screenshot = pyautogui.screenshot(region=(x1, y1, width, height))
            screenshot.save('screenshot.png')
            print(f"截图已保存:区域({x1}, {y1}),宽{width},高{height}")
        else:
            print("未选择有效区域,取消截图")

if __name__ == '__main__':
    RegionSelector()

关键逻辑说明

  1. 透明选框窗口:创建全屏、半透明、置顶的窗口,十字光标方便定位,不会遮挡屏幕内容。
  2. 鼠标事件处理:
    • 左键按下时记录选框起始点,初始化红色边框的矩形选框。
    • 鼠标拖动时,实时调整选框的坐标和大小,支持从任意方向拖动选框。
    • 左键释放时,计算选框的左上角坐标、宽度和高度,关闭选框窗口后执行截图。
  3. 截图与保存:调用pyautogui.screenshot()传入计算好的区域参数,将截图保存为本地文件。

使用方法

  1. 确保已安装pyautogui:pip install pyautogui
  2. 运行代码,屏幕会出现半透明灰色覆盖层
  3. 按住鼠标左键拖动,绘制要截取的区域,松开左键即可完成截图,图片保存为screenshot.png

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:05:15