用GUI 自动化控制鼠标和键盘

版权声明:转载请标明出处 https://blog.csdn.net/gymaisyl/article/details/84192330

GUI自动化,被称为 ‘图形用户界面自动化’。有人调侃过,有了GUI自动化,你的程序就像一个活人用户坐在计算机面前,能做任何事情,除了将咖啡泼在键盘上。

安装 pyautogui 模块

pyautogui模块可以向Windows,OS X 和Linux发送虚拟的键盘和鼠标点。根据不同的系统,在安装pyautogui之前,需要安装相关的依赖模块。

  • Windows:免除了所有烦恼,直接安装就可以了;
  • OS X:需要运行如下代码:
sudo pip3 install pyobjc-framework-Quartz
sudo pip3 install pyobjc-core
sudo pip3 install pyobjc
  • Linux:需要运行如下代码:
sudo pip3 install pytohn3-xlib
sudo apt-get install scrot
sudo apt-get install python3-tk
sudo apt-get install python3-dev

安装pyautogui的代码如下:

pip install pyautogui

下载之后,在交互式环境或者pycharm中import pyautogui, 如果没爆红,就说明安装成功了

# 导入模块后重命名,下面所有代码中的gui==pyautogui
Import  pyautogui  as gui

为了更好的体验

在自动运行过程中,运行的方向和本来的意图可能有偏差,为了防止各种意外发生,我们需要做出相关的预防措施。

  1. 暂停
    我们可以告诉脚本,在每次函数调用之后等一会,在出问题的时候,让我们有机会去弥补(键盘和鼠标让我们来控制);要做到这一点,就需要将gui.PAUSE 设置为你想要暂停的秒数:

每个pyautogui函数调用后会等待1秒

 gui.PAUSE = 1
  1. 自动防故障装置

pyautogui中的自动防故障功能,是你在尽快将鼠标向左上移动的时候,自动防故障系统会停止程序,gui.FAILSAFE=Flase会禁止这项功能,但是,为了更好让我们行使主宰的权利,还是打开比较好:

gui.FAILSAFE = True

控制鼠标移动

  1. 获取屏幕的像素数(屏幕的宽和高)
width, height = gui.size()
print(width, height)
  1. 鼠标的移动
  • gui.moveTo(x, y): 将鼠标移动到指定位置, x,y是坐标;
  • gui.moveRel(x, y): 是相对于当前位置进行鼠标的移动,x,y是相对于当前位置的坐标;
  • 上面两个函数,还可以有一个关键字参数 duration 是将鼠标移动到目的位置所需要的秒数,默认值是0,表示立即移动,参数可以接收整数或者浮点数。

参考代码:

#  以正方形的模式,顺时针移动鼠标
for i in range(10):
    gui.moveTo(100, 100, duration=0.5)
    gui.moveTo(200, 100, duration=0.5)
    gui.moveTo(200, 200, duration=0.5)
    gui.moveTo(100, 200, duration=0.5)
# 也是按照正方形移动鼠标,只不过是在鼠标所在位置开始的
for i in range(5):
    gui.moveRel(200, 0, duration=0.5)
    gui.moveRel(0, 200, duration=0.5)
    gui.moveRel(-200, 0, duration=0.5)
    gui.moveRel(0, -200, duration=0.5)
  1. 获取鼠标位置
    调用gui.position() 函数,可以获取鼠标当前的位置。函数返回的是一个元组,表示当前鼠标的位置(x,y坐标)

案例-----在终端中实时显示鼠标的位置

#  在终端中运行,提示按Ctrl-C可以关闭程序
print('Press Ctrl-C to quit.')
try:
    while True:
        x, y = gui.position()
        positionStr = 'X:' + str(x).rjust(4) + '  ' + 'Y:' + str(y).rjust(4)
        print(positionStr, end='')
        print('\b'*len(positionStr), end='', flush=True)
except KeyboardInterrupt:
    print('\nDone.')

这里解释以下\b'*len(positionStr), end='', flush=True的作用:
因为每次鼠标的位置数据显示是需要在打印位置将上一次打印数据进行擦除的,就可以打印\b 退格转义字符;这个字符可以擦除屏幕当前行末尾的字符,利用*len(positionStr),将根据原来字符串的长度进行全部覆盖。
当然,flush=True是完成屏幕按照我们的期望进行刷新。

  1. 鼠标的点击

  2. 单击
    鼠标的点击是调用 gui.click()函数,默认情况下是点击左键,点击发生在鼠标当前位置,当然,也可以通过传入参数来指定想要进行点击的位置;
    那么,如果想点击右键呢,别担心, gui.click()函数也是提供一个关键字参数button,值分别可以是‘left’,‘middle’,‘right’,分别对应单击鼠标的左键,中间以及右键。

  3. 双击
    gui.doubleClick : 执行双击鼠标左键
    gui.rightClick: 执行双击右键
    gui.middleClick: 执行双击中键

  4. 鼠标的按下和释放
    gui.mouseDown() : 按下鼠标按键
    gui.mouseUp(): 释放鼠标按键

实际上,click是将上面两个按下和释放进行封装了而已。

  1. 拖动鼠标
    ‘拖动’意味着需要移动鼠标,同时需要按住一个按键不放。
    gui.dragTo(x, y, duration=0): 将鼠标拖动到指定位置,x,y为指定的位置,duration默认是0,也可以自己进行关键字传参;
    gui.dragRel(x,y,duration): 将鼠标拖动到相对当前位置的位置,参数传递和上面的一样;

案例-----在画图软件中,让鼠标自己进行画图

import time
time.sleep(3)  #  在运行pycharm之后,进入到画图界面
gui.click()  #  获取焦点
distance = 200
while distance > 0:
    gui.dragRel(distance, 0, duration=0.5)
    distance -= 5
    gui.dragRel(0, distance, duration=0.5)
    gui.dragRel(-distance, 0, duration=0.5)
    distance -= 5
    gui.dragRel(0, -distance, duration=0.5)

运行完的结果,就是这样的,不过,在运行之前,你要先选择铅笔或者画笔工具。
在这里插入图片描述

屏幕数据的处理

  1. 获取屏幕快照

使用 gui.screenshot() 函数 获取整个屏幕的快照
比如: image = gui.screenshot()

  1. 获取图片中相应位置的像素颜色

使用 .getpixel((x, y)), 返回的是颜色RGB的一个元组
比如: color = image.getpixel((0, 0)) 返回结果 (176,176,175)

  1. 对屏幕快照进行分析

使用: gui.pixelMatchesColor()
在获取屏幕快照,并使用.getpixel((x, y)) 函数获取特定坐标处的像素颜色的RGB元组之后, 将我们想要与之匹配的坐标进行比对(使用的是gui.pixelMatchesColor() ),如果是完全一样的,则返回True,反之,则返回False;

  1. 图像识别
  • 获取指定图片的坐标
    可以通过 gui.locateOnScreen('图片名.png') 获取图片文件的对应坐标,这个函数的返回值是一个4个整数的元组,分别是 图像左边的x坐标,顶边的y坐标, 宽度, 高度; 如果没有找到该图像,则返回None; 如果不止一个,那么则返回一个Generator对象,可以将其传递给list(), 然后进行遍历或者其他操作进行获取。

  • 获取坐标的中心位置
    可以将坐标的数据传递给 gui.center()函数,获取这个指定图像的中心位置坐标

案例 ---- 根据指定图片进行双击打开,比如打开桌面的 我的电脑

import  time
time.sleep(3)
# 一:最小化pycharm
loca1 = gui.locateOnScreen('close.png')  # close.png是pycharm右上角最小化的图像
center = gui.center(loca1)
gui.click(center, duration=1)

time.sleep(3)
# 1.根据图片找到指定位置的图片位置
loca2 = gui.locateOnScreen('computer.png')  # computer.png是桌面的我的电脑的图像
# 2.获取中心位置
center = gui.center(loca2)
# 3. 双击指定位置
gui.doubleClick(center, duration=1)

键盘的控制

  1. gui.tupewrite(‘输入的内容’ ,time) 函数向计算机发送虚拟按键,这些按键产生的效果,取决于当前获得焦点的窗口和文本输入框。一般需要先向文本输入框发送一次鼠标点击,确保它获取到焦点。

time是表示在每个内容打出后等待多长时间再进行下一个字的打印,是种渐进的打字机效果。
比如:

gui.click(150, 150)
gui.typewrite('Hello World!', 0.25)
  1. 按下和释放键盘

这个和鼠标的按下释放是一个道理,这里提供了 gui.keyDown() 和 gui.keyUp() 向键盘发送虚拟的按键和释放;同时 pyautogui还提供了.press() 函数, 它通过和按键/释放的配合,模拟完成一次完整的击键;

打印$美元字符串:

gui.keyDown('shift')
gui.press('4')
gui.keyUp('shift')
  1. 热键组合

‘热键’或‘快捷键’是一种组合,比如常用的Ctrl-C是复制, 其执行过程是,用户先按下Ctrl,再按下C,再释放C,最后释放Ctrl。

代码如下:

gui.keyDown('Ctrl')
gui.keyDown('C')
gui.keyUp('C')
gui.keyUp('Ctrl')

这个相对就比较复杂了,我们就可以使用hotkey()函数,它可以接收多个键字符串参数,按顺序按下,再按照相反的顺序释放,所以上面的代码简化如下:

gui.hotkey('Ctrl', 'C')

That's all...

猜你喜欢

转载自blog.csdn.net/gymaisyl/article/details/84192330