让 pyautogui 自动化你的工作

个人地址-原文

警告!

为善去恶,希望你学会这项技术提高自己的生产效率,勿做有损他人的事情。

pyautogui可以控制鼠标移动和点击,可以用来实现一些自动化的操作,非常有趣。

注意事项

为避免失控,快速甩动鼠标到屏幕角落以强行退出程序。

一、控制鼠标
1. 安装pyautogui

在Windows的cmd窗口输入指令

pip install pyautogui
2. 确认安装正常

使用pyautogui.size()获取当前屏幕的宽高,返回是一个点对象。

import pyautogui
wh = pyautogui.size()
print(wh.width, wh.height)
3. 移动鼠标到绝对位置

使用pyautogui.moveTo()可将光标移至屏幕任意位置,传入三个参数,前两个分别为位置坐标xy,第三个duration=用来指定这个动作的耗时。
先了解一下计算机显示器的像素坐标系,屏幕左上为原点,x轴指向右侧,y轴指向屏幕底端。

图1 分辨率为1920x1080的屏幕坐标系图片 [1]

举个例子,让鼠标自动画长方形。

import pyautogui
for i in range(10):
    pyautogui.moveTo(100, 100, duration=0.25)
    pyautogui.moveTo(100, 400, duration=0.25)
    pyautogui.moveTo(400, 400, duration=0.25)
    pyautogui.moveTo(400, 100, duration=0.25)
4. 移动鼠标到相对位置

使用pyautogui.move(),同样是三个参数,区别是坐标为相对位移坐标。
如果要获得鼠标当前位于何处,可以使用pyautogui.positioin(),没有参数,返回一个对象包含两个坐标值。

5. 控制鼠标点击

让鼠标在坐标(100,100)处完成一次左键单击,使用pyautogui.click(),传入的第三个参数button=用来指定左键、中键和右键。

import pyautogui
pyautogui.click(100, 100, button='left')    # 点击左键
pytutogui.click(100, 100, button='right')   # 点击右键

完成一次点击包括两个动作,也就是按下与释放。pyautogui.click()使用了默认的时间间隔。如果我们想要自定义按下和释放之间的保持时间,就使用pyautogui.mouseDown()来按下,用pyautogui.mouseUp()来释放,参数相同。

6. 拖动鼠标

按下后保持,再移动鼠标,可用pyautogui.dragTo()或者pyautogui.drag()实现,前者是绝对位置,后者为相对位置。
以下代码是用鼠标绘图的例子

import pyautogui
import time

time.sleep(5)   # 等待切换软件窗口
pyautogui.click(800, 600)   # 点击画幅内的一点作为起点

distance = 500
change = 20
while distance > 0:
    pyautogui.drag(distance, 0, duration=0.2)   # Move right.
    distance = distance - change
    pyautogui.drag(0, distance, duration=0.2)   # Move down.
    pyautogui.drag(-distance, 0, duration=0.2)  # Move left.
    distance = distance - change
    pyautogui.drag(0, -distance, duration=0.2) 

事先打开一个绘图软件,此处以windows绘图软件为例,选择好画笔后回到IDE启动脚本。程序中有一个5s的延时,因此启动程序后5s内将实现准备好的绘图软件窗口最大化。

图2 pyautogui.drag()拖动鼠标绘制图形的结果
7. 控制滚轮

使用pyautogui.scroll()输入参数为整数滚动单位。

8. 获取屏幕上某一点的像素坐标

使用snipaste软件,启动在后台运行,需要时点击F1进入截图预览模式,此时鼠标所处的位置会有坐标值显示。
或者使用pyautogui.displayMousePosition()实时显示位置和颜色信息。

9. 获取屏幕图像信息

使用pyautogui.screenshot()获取全屏截图。使用pyautogui.pixel(x, y)获取某个像素点的颜色信息输入两个坐标值。
判断某个点是否与给定颜色一致,可用pyautogui.pixelMatchesColor(x, y, (R, G, B)),输入两个坐标值,和一个包含RGB信息的元组。
判断给定的图片在屏幕上的哪个位置,可用pyautogui.locateOnScreen('img.jpg'),传入参数为图片路径,返回xywh元组,可能有多个。如果想要点击这个区域的中心,将该元组传入pyautogui.click((x, y, w, h))即可。甚至可以直接这样pyautogui.click('img.jpg')实现查找和点击,但是有可能不成功,需和try以及except一起用。

10. 获取窗口信息
import pyautogui
fw = pyautogui.getActiveWindow() # 获取活动的窗口信息
print(str(fw))  # <Win32Window left="-12", top="-12", width="2584", height="1540", title="test.py - Visual Studio Code">

pyautogui.getAllWindows() # 返回一个list,包含所有的窗口信息

pyautogui.getWindowsAt(x, y) # 输入xy坐标,返回包含坐标的所有窗口

pyautogui.getWindowsWithTitle(title) # 输入title,返回对应的窗口

pyautogui.getAllTitles() # 获取所有的串口标题,返回是一个list,元素为string

对获取到的窗口可以进行一些操作

fw.width = 1000 # 将窗口宽度调整为1000像素

fw.topleft = (200, 200) # 将窗口左上角移动到指定位置

print(fw.isMaximized) # 判断窗口是否为最大化

fw.maximize() # 最大化窗口

fw.minimize() # 最小化窗口

fw.restore()  # 恢复最大化/最小化操作

完整的使用方法,见官方文档https://pyautogui.readthedocs.io/

二、控制键盘
1. 输入内容

首先通过点击确定文字输入区域,再用pyautogui.write()输入。

import pyautogui
pyautogui.click(1080,1400)
pyautogui.write('hello world!') # pyautogui输入'!'时会自动按下shift键

# 使用list传入时可以将键盘上的所有键以名称方式描述,如'left'表←键
pyautogui.write(['a', 'b', 'left', 'left', 'X', 'Y']) # 按顺序按下a、b、←、←、shift+x、shift+y 结果 XYab

键盘对应的内容表格如下

键盘关键字含义
‘a’, ‘b’, ‘c’, ‘A’, ‘B’, ‘C’, ‘1’, ‘2’, ‘3’, ‘!’, ‘@’, '#'等单字符按键
‘enter’ (或 ‘return’ 或 ‘\n’)回车键
‘esc’ESC键
‘shiftleft’, ‘shiftright’左右SHIFT键
‘altleft’, ‘altright’左右ALT键
‘ctrlleft’, ‘ctrlright’左右CTRL键
‘tab’ (或 ‘\t’)TAB键
‘backspace’, ‘delete’BACKSPACE 和 DELETE键
‘pageup’, ‘pagedown’PAGE UP 和 PAGE DOWN 键
‘home’, ‘end’HOME 和 END 键
‘up’, ‘down’, ‘left’, ‘right’up, down, left 和 right 箭头键
‘f1’, ‘f2’, ‘f3’, 等F1 到 F12 键
‘volumemute’, ‘volumedown’, ‘volumeup’静音,音量减,音量加键(有些键盘没有这些键,但是你的电脑可以接收这些指令)
‘pause’PAUSE键
‘capslock’, ‘numlock’, ‘scrolllock’CAPS LOCK, NUM LOCK, 和 SCROLL LOCK 键
‘insert’INS 或 INSERT 键
‘printscreen’PRTSC 或 PRINT SCREEN 键
‘winleft’, ‘winright’左右WIN键(Windows)
‘command’Command键(macOS)
‘option’OPTION键(on macOS)
2. 热键组合

与鼠标相似,我们可以用pyautogui.keyDown()pyautogui.keyUp()来分开控制键盘的按下与释放。
如在windows上实现一次复制粘贴,可以如下操作

pyautogui.keyDown('ctrl')
pyautogui.keyDown('c')
pyautogui.keyUp('c')
pyautogui.keyUp('ctrl')

但是上面的操作未免有些复杂了,同样的操作可以这样

pyautogui.hotkey('ctrl', 'c')
3. 使用提示
  • 屏幕分辨率保持不便
  • 应用窗口应该最大化,因为这样才能保证按钮始终在同一个位置
  • 根据软件反应速度多给一些延时,你不会想在上一个动作没有完成就开始点击
  • 使用locateOnScreen()寻找按钮,尽量不依赖xy坐标,在没发现目标时停止比乱点击要好
  • 使用getWindowsWithTitle()确保你准备控制的应用程序窗口是存在的,用activate()让窗口进入前台
  • 增加尽可能多的检查,如弹窗、断网的情况怎么处理
  • 第一次运行时要完整地观察是否正常

给延时的两个例子

import time
time.sleep(3)   # 等待3s

import pyautogui
pyautogui.countdown(10) # 等待10s,在命令行倒数输出10、9、8...

另外可以用pyautogui.alert('text')pyautogui.confirm('text')来弹窗确认。如果需要使用到剪贴板里面的内容,需要用到import pyperclip然后pyperclip.paste()

引用

[1] Automate The Boring Stuff, Al Sweigart

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值