警告!
为善去恶,希望你学会这项技术提高自己的生产效率,勿做有损他人的事情。
pyautogui可以控制鼠标移动和点击,可以用来实现一些自动化的操作,非常有趣。
注意事项
为避免失控,快速甩动鼠标到屏幕角落以强行退出程序。
一、控制鼠标
1. 安装pyautogui
在Windows的cmd窗口输入指令
pip install pyautogui
2. 确认安装正常
使用pyautogui.size()
获取当前屏幕的宽高,返回是一个点对象。
import pyautogui
wh = pyautogui.size()
print(wh.width, wh.height)
3. 移动鼠标到绝对位置
使用pyautogui.moveTo()
可将光标移至屏幕任意位置,传入三个参数,前两个分别为位置坐标x
与y
,第三个duration=
用来指定这个动作的耗时。
先了解一下计算机显示器的像素坐标系,屏幕左上为原点,x轴指向右侧,y轴指向屏幕底端。
举个例子,让鼠标自动画长方形。
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内将实现准备好的绘图软件窗口最大化。
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()