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()
1143

被折叠的 条评论
为什么被折叠?



