tkinter+pyautogui自动脚本工具制作截图工具

575 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

电脑截图工具现在确实不少,而且不得不说也很方便,但是其内部的实现原理又是怎样的呢!在自动化测试过程中发现pyautogui工具具有非常强大的功能,不仅能够在相应的指令下完成一些自动化的鼠标和键盘的模拟操作,而且具备了平时我们常用的很多便捷指令。

通过结合tkinter工具,利用pyautogui和鼠标事件,制作了一款截图工具,支持全屏截图和指定区域截图。下面直接上代码。

import time
import pyautogui
import tkinter as tk
from tkinter import *
from tkinter import messagebox, filedialog
import cv2
import numpy as np
from PIL import ImageGrab


# 创建屏幕控件
def CreateWidgets():
    labelattachmentEmail = Label(root, text="存储到 : ", font=('', 10, 'bold'),
                                 bg="darkslategrey")
    labelattachmentEmail.grid(row=1, column=0, pady=5, padx=5)
    root.entryattachmentEmail = Entry(root, width=30)
    root.entryattachmentEmail.grid(row=1, column=1, pady=5, padx=5)
    buttonattachmentEmail = Button(root, text="选择存放位置及名称", command=Browse, width=15)
    buttonattachmentEmail.grid(row=1, column=2, pady=5, padx=5)
    buttonattachmentEmail = Button(root, text="截图", command=Screenshot, width=10)
    buttonattachmentEmail.grid(row=2, column=1, pady=5, padx=5)
    buttonattachmentEmail = Button(root, text="指定区域截图", command=ScreenshotROI, width=10)
    buttonattachmentEmail.grid(row=2, column=2, pady=5, padx=5)


# 选择保存位置及名称
def Browse():
    root.fileName = filedialog.asksaveasfilename(title="SAVE AS",
                                initialdir="D:/",
                                defaultextension=".png",
                                filetypes=(("PNG Files", "*.png"), ("All Files", "*.*")))
    root.entryattachmentEmail.insert('1', root.fileName)


# 截取全屏图片
def Screenshot():
    # 最小化窗口
    root.state('icon')
    # 延时200毫秒
    time.sleep(0.2)
    # 创建截图
    screenshot = pyautogui.screenshot()
    # 保存截图
    screenshot.save(root.fileName)


# 截取指定区域图片
def ScreenshotROI():
    # 最小化窗口
    root.state('icon')
    # 延时200毫秒
    time.sleep(0.2)
    curScreen = ImageGrab.grab()  # 获取屏幕对象
    point1, point2 = select_roi(curScreen)
    # 创建截图
    screenshot = pyautogui.screenshot(region=(point1[0], point1[1], point2[0], point2[1]))
    # 保存截图
    screenshot.save(root.fileName)


# 鼠标事件
def on_mouse(event, x, y, flags, key):
    global img, point1, point2
    img2 = img.copy()
    if event == cv2.EVENT_LBUTTONDOWN:  # 左键点击
        point1 = (x, y)
        cv2.circle(img2, point1, 10, (0, 255, 0), thickness=2)
        cv2.imshow('image', img2)
    elif event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON):  # 按住左键拖曳
        cv2.rectangle(img2, point1, (x, y), (255, 0, 0), thickness=2)
        cv2.imshow('image', img2)
    elif event == cv2.EVENT_LBUTTONUP:  # 左键释放
        point2 = (x, y)
        cv2.rectangle(img2, point1, point2, (0, 0, 255), thickness=2)
        cv2.imshow('image', img2)


# 选择ROI区域
def select_roi(frame):
    global img, point1, point2
    img = cv2.cvtColor(np.array(frame), cv2.COLOR_RGB2BGR)
    winname = 'image'
    cv2.namedWindow(winname, cv2.WINDOW_NORMAL)
    cv2.setWindowProperty(winname, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
    cv2.setMouseCallback(winname, on_mouse)
    cv2.imshow(winname, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    return point1, point2


# 创建tkinter对象
root = tk.Tk()
root.title("全屏截图工具")
root.resizable(False, False)
# 设置背景颜色
root.config(background="darkslategrey")
# 创建界面控件
CreateWidgets()
# 事件循环
root.mainloop()

程序运行结果是这样子的

image.png

在截图之前,首先选择一个保存的位置,以及保存文件的名称。如下面过程

image.png

点击确定后,界面会出现保存的绝对地址

image.png

如果选择全屏截图,会首先隐藏程序主界面,然后自动截图,截图效果如下

image.png

也可以选择指定区域进行截图,截图效果如下

image.png

最后就是通过pyinstaller进行打包,放到桌面使用自己的成果进行截图了。