【GUI】自动化办公

目录

一、GUI介绍

二、环境安装

三、鼠标移动操作

四、鼠标点击操作

五、拖动鼠标

六、鼠标滚动操作

七、屏幕快照&图像识别基础

[7.1 屏幕快照(截图)](#7.1 屏幕快照(截图))

[7.2 图像识别](#7.2 图像识别)

八、键盘控制


一、GUI介绍

  • GUI自动化就是写程序直接控制键盘和鼠标。这些程序可以控制其它应用,向它们发送虚拟的基键和鼠标点击,就像你自己坐在计算机前与应用交互一样。这种技术被称为"图形用户界面自动化",或简称为"GUI自动化"。有了GUI自动化,你的程序就像活人用户坐在计算机前一样,能做任何事情,除了将咖啡泼在键盘上。
  • 也可以将GUI自动化看成是堆一个机械臂编程。你可以对机械臂编程,让它敲键盘或移动鼠标。对于涉及许多无脑点击或填表的任务,这种技术特别有用。

二、环境安装

bash 复制代码
pip install pyautogui

三、鼠标移动操作

我们主要学习如何利用pyautogui移动鼠标,追踪它在屏幕上的位置,但首先需要理解pyautogui如何处理坐标。

  • pyautogui坐标的处理
    • pyautogui的鼠标函数使用x、y坐标。原点的x、y都是零,在屏幕的左上角。向右x坐标增加,向下y坐标增加。所有坐标都是正整数,没有负数坐标。
  • 分辨率
    • 分辨率是屏幕的宽和高有多少像素。如果屏幕的分辨率设置为1920 x 1080,那么左上角的坐标是(0,0),右下角的坐标是(1919,1079)。
  • 编程获取电脑屏幕的宽和高的像素数
    • pyautogui.size() 函数返回两个整数的元组,包含屏幕的宽和高的像素数。
python 复制代码
import pyautogui

width, height = pyautogui.size()
print(width, height) # 1920 1080
  • 移动鼠标
    • pyautogui.moveTo() 函数将鼠标立即移动到屏幕的指定位置
      • 表示x、y坐标的整数值分别构成了函数的第一个和第二个参数。
      • 可选的duration整数或浮点数关键字参数,指定了将鼠标移到目的位置所需的秒数。如果不指定,默认值是零,表示立即移动(在PyAutoGUI函数中,所有的duration关键字参数都是可选的)。
python 复制代码
import pyautogui

# 鼠标自动画个矩形移动,循环5次
for i in range(5):
    pyautogui.moveTo(100, 100, duration=0.25)
    pyautogui.moveTo(200, 100, duration=0.25)
    pyautogui.moveTo(200, 200, duration=0.25)
    pyautogui.moveTo(100, 200, duration=0.25)
  • pyautogui.moveRel() 函数相对于当前的位置移动鼠标
    • 该函数可以接受3个参数:向右水平移动多少个像素,向下垂直移动多少个像素,以及(可选的)花多少时间完成移动。为第一第二个参数提供负整数,鼠标将向左或向上移动。
python 复制代码
import pyautogui

# 鼠标自动画个矩形移动,循环5次
for i in range(5):
    pyautogui.moveRel(100, 0, duration=0.25)
    pyautogui.moveRel(0, 100, duration=0.25)
    pyautogui.moveRel(-100, 0, duration=0.25)
    pyautogui.moveRel(0, -100, duration=0.25)
  • 获取鼠标位置
    • 通过调用pyautogui.position() 函数,可以确定鼠标当前的位置。它将返回函数调用时,鼠标x、y坐标的元组。
python 复制代码
import pyautogui

print(pyautogui.position()) # Point(x=784, y=554)

四、鼠标点击操作

python 复制代码
import pyautogui

# 鼠标移动到屏幕左上角的位置,并点击一次。完整的"点击"是指按下鼠标按键,然后放开,同时不移动位置
pyautogui.click(10, 5)

**指定鼠标按键:**如果向指定鼠标按键,就加入 button 关键字参数,值分别为left、middle或right。例如:pyautogui.click(100, 150, button='left') 将在坐标(100,150)处点击鼠标左键。

python 复制代码
import pyautogui

# 鼠标右键点击
pyautogui.click(600, 500, button='right')

实现点击的其它方法:

  • mouseDown():只是按下鼠标按键
  • mouseUp():只是释放鼠标按键
  • doubleClick():执行双击鼠标左键
  • rightClick()、middleClick():分别执行双击右键和双击中键

五、拖动鼠标

"拖动" 意味着移动鼠标,同时按住一个按键不放。例如:可以通过拖动文件图标,在文件夹之间移动文件等。

PyAutoGUI提供了 pyautogui.dragTo() 和 pyautogui.dragRel()函数,将鼠标拖动到一个新的位置,或相对当前位置的位置。dragTo() 和 dragRel() 的参数与moveTo() 和 moveRel() 相同:x坐标/水平移动,y坐标/垂直移动,以及可选的时间间隔。

注意:测试这个功能我们可以打开windows的画图工具。

python 复制代码
import pyautogui, time

time.sleep(2)
pyautogui.click()
distance = 200
while distance > 0:
    pyautogui.dragRel(distance, 0, duration=0.2, button='left')
    distance = distance - 5
    pyautogui.dragRel(0, distance, duration=0.2, button='left')
    pyautogui.dragRel(-distance, 0, duration=0.2, button='left')
    distance = distance - 5
    pyautogui.dragRel(0, -distance, duration=0.2, button='left')

六、鼠标滚动操作

滚动操作函数是scroll()。你向它提供一个整型参数,说明向上或向下滚动多少单位,滚动发生在鼠标的当前位置。

python 复制代码
import pyautogui, time

time.sleep(2)
pyautogui.scroll(800)

七、屏幕快照&图像识别基础

你的 GUI 自动化程序没有必要盲目地点击和输入。pyautogui拥有屏幕快照的功能,可以根据当前屏幕的内容创建图形文件。

**注意:**在Linux计算机上,需要安装scrot程序,才能在pyautogui中使用屏幕快照功能。在终端窗口中,执行sudo apt-get install scrot,安装该程序。如果你使用Windows或OS X,就跳过这一步。

7.1 屏幕快照(截图)

要在python中获取屏幕快照,就调用pyautogui.screenshot() 函数,函数将返回包含一个屏幕快照的Image对象。

python 复制代码
import pyautogui

im = pyautogui.screenshot()
im.save('./test.png')

Image对象getpixel()

  • getpixel() 函数传入坐标元组它将告诉你图像中这些坐标处的像素颜色。getpixel() 函数的返回值是一个RGB元组,包含4个整数,表示像素的红绿蓝值和透明度。
  • 这就是你的程序"看到"当前屏幕上内容的方法。
python 复制代码
import pyautogui

im = pyautogui.screenshot()
im.getpixel((23, 56))

举个例子:

  • 假设你的 GUI 自动化程序中,有一步是点击灰色按钮。在调用 click()方法之前,你可以获取屏幕快照,查看脚本要点击处的像素。如果它的颜色和灰色按钮不一样,那么程序就知道出问题了。也许窗口发生了意外的移动,或者弹出式对话框挡住了该按钮。这时,不应该继续(可能会点击到错误的东西,造成严重破坏),程序可以"看到"它没有点击在正确的东西上,并自行停止。
  • pixelMatchesColor() 函数
    • 参数:
      • 第一和第二个参数是整数,对应 x 和 y 坐标。第三个参数是一个元组,包含3个整数,是屏幕像素必须匹配的RGB颜色
    • 返回值:
      • 如果屏幕上指定的 x、y坐标处的像素与指定的颜色匹配,PyAutoGUI的pixelMatchesColor()函数将返回True。
python 复制代码
import pyautogui

im = pyautogui.screenshot()
print(im.getpixel((500, 200))) # (48, 49, 54)
result = pyautogui.pixelMatchesColor(500, 200, (248, 248, 248))
print(result) # False 说明不匹配

7.2 图像识别

opencv简介

  • opencv 是一个基于开源发行的跨平台计算机视觉库,它实现了图像处理和计算机视觉方面的很多通用算法,已成为计算机视觉领域最有力的研究工具。
  • 在这里我们要区分两个概念:图像处理和计算机视觉的区别:
    • 图像处理侧重于"处理"图像--如增强、还原、去噪、分隔等等;
    • 而计算机视觉重点在于计算机来模拟人的视觉,因此模拟才是计算机视觉领域的最终目标。
  • 环境安装:pip install opencv-python==3.4.5.20
  • 操作:打开腾讯会议,识别【加入会议】按钮,对其进行点击操作
python 复制代码
import pyautogui
import cv2
import time

time.sleep(2)
# 获取带有腾讯会议的屏幕快照且保存到本地
im = pyautogui.screenshot()
im.save('screen.jpg')

# 基于cv2读取照片
screen = cv2.imread('./screen.jpg')
joinMeeting = cv2.imread('./joinMeeting.jpg')
# 在屏幕快照中对比加入会议按钮照片,定位其准确位置
# result是一个二维列表,列表中最大值元素的位置就是我们对比后相似度最高的图片【最上角】位置
result = cv2.matchTemplate(joinMeeting, screen, cv2.TM_CCOEFF_NORMED)

# minMaxLoc返回一个元组,其中三个元素,以此为最不相似点分数,最相似点分数,最不相似点位置坐标,最相似点位置坐标
pos_start = cv2.minMaxLoc(result)[3] # 获取最相似点相似坐标
print(pos_start)

# 定位到点击图片的中间位置
x = int(pos_start[0]) + int(joinMeeting.shape[1] / 2)
y = int(pos_start[1]) + int(joinMeeting.shape[0] / 2)

time.sleep(1)
pyautogui.click(x, y)

八、键盘控制

例1:在文件编辑器窗口中输入HelloWord!

python 复制代码
import pyautogui
import time

time.sleep(2)
pyautogui.click(1300, 1300)
time.sleep(2)
pyautogui.typewrite('Hello world', interval=0.25)

例2:打印出美元字符(通过按住shift键并按4得到)

python 复制代码
import pyautogui
import time

time.sleep(2)
pyautogui.keyDown('shift')
pyautogui.press('4')
pyautogui.keyUp('shift')

例3:热键组合,比如ctrl+v

python 复制代码
import pyautogui
import time

time.sleep(2)
pyautogui.hotkey('ctrl', 'v')
相关推荐
代码的乐趣12 分钟前
支持selenium的chrome driver更新到136.0.7103.94
chrome·python·selenium
愚润求学35 分钟前
【Linux】进程间通信(一):认识管道
linux·运维·服务器·开发语言·c++·笔记
渴望技术的猿36 分钟前
Windows 本地部署MinerU详细教程
java·windows·python·mineru
SHUIPING_YANG1 小时前
Nginx 返回 504 状态码表示 网关超时(Gateway Timeout)原因排查
运维·nginx·gateway
光不度AoKaNa1 小时前
计算机操作系统概要
linux·运维·服务器
晚秋大魔王1 小时前
OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——wget
java·linux·运维·开发语言·华为·harmonyos
Aliano2171 小时前
TestNGException ClassCastException SAXParserFactoryImpl是Java自带的Xerces解析器——解决办法
java·开发语言·python
漫谈网络1 小时前
回调函数应用示例
开发语言·python·回调函数
孤的心了不冷1 小时前
【Linux】Linux安装并配置MongoDB
linux·运维·mongodb·容器
南棱笑笑生1 小时前
20250517让NanoPi NEO core开发板在Ubuntu core16.04.2下支持TF卡的热插拔
linux·运维·ubuntu