如何用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()
关键逻辑说明
- 透明选框窗口:创建全屏、半透明、置顶的窗口,十字光标方便定位,不会遮挡屏幕内容。
- 鼠标事件处理:
- 左键按下时记录选框起始点,初始化红色边框的矩形选框。
- 鼠标拖动时,实时调整选框的坐标和大小,支持从任意方向拖动选框。
- 左键释放时,计算选框的左上角坐标、宽度和高度,关闭选框窗口后执行截图。
- 截图与保存:调用
pyautogui.screenshot()传入计算好的区域参数,将截图保存为本地文件。
使用方法
- 确保已安装
pyautogui:pip install pyautogui - 运行代码,屏幕会出现半透明灰色覆盖层
- 按住鼠标左键拖动,绘制要截取的区域,松开左键即可完成截图,图片保存为
screenshot.png
内容的提问来源于stack exchange,提问作者NCSKepler
相关产品推荐
相关产品推荐

