程序员

Python学习笔记——用GUI自动化控制键盘和鼠标

2018-02-02  本文已影响0人  developerChenxi

安装pyautogui模块

pyautogui模块可以向Windows、OSX和Linux发送虚拟按键和鼠标点击。

安装依赖

sudo pip3 install pyobjc-framework-Quartz
sudo pip3 install pyobjc-core
sudo pip3 install pyobjc
sudo pip3 install python3-xlib
sudo apt-get install scrot
sudo apt-get install python3-tk
sudo apt-get install python3-dev
#(Scrot是PyAutoGUI使用的屏幕快照程序)。

在这些依赖安装后,运行pip install pyautogui(或在OSX和Linux上运行pip3),安装pyautogui。

1. 异常情况处理

Python能以想象不到的速度移动并点击,它可能由于速度太快导致其他应用程序跟不上。以下有几种方法来防止和恢复自动化问题。

1.1 注销关闭所有程序来恢复系统。

1.2 暂停和自动防故障装置

2 控制鼠标

获取屏幕宽高:

#屏幕分辨率的不同,返回值可能不一样.
width, height = pyautogui.size() 

2.1 鼠标移动

2.2 点击鼠标

2.3 拖动鼠标

PyAutoGUI提供了pyautogui.dragTo()和pyautogui.dragRel()函数,将鼠标拖动到一个新的位置,或相对当前位置的位置。

# 拖动到x, y 坐标处,用时0.25s
pyautogui.dragTo(x, y, duration=0.25)
# 相对于当前位置拖动鼠标,x、y可以为负数
pyautogui.moveRel(x, y, duration=0.25)

2.4 滚动鼠标

pyautogui.scroll(d)。 传入一个整型,向上或向下滚动 d单位。单位的意义在每个操作系统和应用上不一样, 所以 必须试验,看看在当前情况下滚动多远。滚动发生在鼠标的当前位置。传递正整数表示向上滚动,传递负整数表示向下滚动。

3 处理屏幕

pyautogui有屏幕快照的功能,可以根据当前屏幕的内容创建图形文件。这些函数也可以返回一个Pillow的Image对象,包含当前屏幕的内容。

3.1 获取屏幕快照

调用pyautogui.screenshot()可以获取屏幕快照。

import pyautogui
img = pyautogui.screenshot()

img是屏幕快照的Image对象,img是完全不透明的,这就是让程序"看到"屏幕的方法。

3.2 分析屏幕快照

假设程序中有一步是点击灰色按钮,那么在调用click()方法之前可以进行校验,查看要点击处的像素,如果颜色和灰色按钮不一致,那么就可以知道程序出问题了。

匹配颜色:PyAutoGUI的pixelMatchesColor(x, y, (r,g,b))可以对颜色进行匹配,如果颜色一致返回true。第三个参数(r,g,b)必须是RGB颜色元组,并且颜色完全匹配才会返回True。

4 图像识别

PyAutoGUI可以同过屏幕某一部分的截图去找它在屏幕中的坐标:

>>>import pyautogui
>>>pyautogui.locateOnScreen('submit.png')
(643,745,70,29)

locateOnScreen()函数返回4个整数的元组,是屏幕上首次发现该图像时左边的x坐标、顶边的y坐标、宽度以及高度。如果屏幕上找不到该图像,locateOnScreen()函数将返回None。要成功识别屏幕上的图像必须与提供的图像完全匹配。即使只差一个像素,locateOnScreen()函数也会返回None。

如果该图像在屏幕上能够找到多处,locateAllOnScreen()函数将返回一个Generator对象。可以将它传递给list(),返回一个4整数元组的列表。(locationList=list(generator))。

5 控制键盘

5.1 输入字符串

pyautogui.typewrite()函数向计算机发送虚拟按键。这些按键产生什么效果,取决于当前获得焦点的窗口和文本输入框。(可能需要先向文本输入框发送一次鼠标点击,确保它获得焦点。)

例如:

>>> pyautogui.click( 100, 100); pyautogui.typewrite('Hello world!')
# 同一行中有两条指令用分号隔开

默认情况下,typewrite()函数将立即打印出完整字符串。可以传入可选的第二参数,在每个字符之间添加短时间暂停。
例如,pyautogui.typewrite('Helloworld!',0.25)将在打出H后等待1/4秒。打出e以后再等待1/4秒。这种渐进的打字机效果,对于较慢的应用可能有用,它们处理击键的速度不够快,跟不上pyautogui。
对于A或!这样的字符,pyautogui将自动模拟按住Shift键。

5.2 使用特殊按键(enter、shift等等)

不是所有的键都很容易用单个文本字符来表示。例如把Shift键或左箭头键,那么这些特殊键如何使用呢?
在PyAutoGUI中,这些键表示为短的字符串值:'esc'表示Esc键,'enter'表示Enter。
除了单个字符串参数,还可以向typewrite()函数传递这些键字符串的列表。例如,以下的调用表示按a键,然后是b键,然后是左箭头两次,最后是X和Y键:

>>>pyautogui.typewrite(['a','b','left','left','X','Y'])

因为按下左箭头将移动键盘光标,所以这会输出XYab。

PyKeyboard 属性

键盘键 含义
'a','b','c','A','B','C','1','2','3','!','@','#',等等 单个字符的键
'enter'(or'return'or'\n')回车键 'esc'Esc键
'shiftleft','shiftright' 左右Shift键
'altleft','altright' 左右Alt键
'ctrlleft','ctrlright' 左右Ctrl键
'tab'(or'\t') Tab键
'backspace','delete' Backspace和Delete键
'pageup','pagedown' PageUp和PageDown键
'home','end' Home和End键
'up','down','left','right' 上下左右箭头键
'f1','f2','f3',等等 F1至F12键
'volumemute','volumedown','volumeup' 静音、减小音量、放大音量键(有些键盘没有这些键,但你的操作系统仍能理解这些模拟的按键)
'pause' Pause键
'capslock','numlock','scrolllock' CapsLock,NumLock和ScrollLock键
'insert' Ins或Insert键
'printscreen' Prtsc或PrintScreen键
'winleft','winright' 左右Win键(在Windows上)
'command' Command键(在OSX上)
'option' Option键(在OSX上)

5.3 按下和释放键盘

就像mouseDown()和mouseUp()函数一样,pyautogui.keyDown()和pyautogui.keyUp()将向计算发送虚拟的按键和释放。它们将根据参数发送键字符串。方便起见,pyautogui提供了pyautogui.press()函数,它调用这两个函数,模拟完整的击键。

5.4 热键组合

例如,对于Ctrl-C,pyautogui.hotkey('ctrl', 'c')

对于Ctrl-Alt-Shift-S 热键组合显示 Style(样式)窗口。 只要调用hotkey('ctrl', 'alt', 'shift', 's')。

小结

本章介绍了许多不同函数,下面是快速的汇总参考:

moveTo(x,y)将鼠标移动到指定的x、y坐标。

moveRel(xOffset,yOffset)相对于当前位置移动鼠标。

dragTo(x,y)按下左键移动鼠标。

dragRel(xOffset,yOffset)按下左键,相对于当前位置移动鼠标。

click(x,y,button)模拟点击(默认是左键)。rightClick()模拟右键点击。

middleClick()模拟中键点击。

doubleClick()模拟左键双击。

mouseDown(x,y,button)模拟在x、y处按下指定鼠标按键。

mouseUp(x,y,button)模拟在x、y处释放指定键。

scroll(units)模拟滚动滚轮。正参数表示向上滚动,负参数表示向下滚动。

typewrite(message)键入给定消息字符串中的字符。

typewrite([key1,key2,key3])键入给定键字符串。

press(key)按下并释放给定键。

keyDown(key)模拟按下给定键。

keyUp(key)模拟释放给定键。

hotkey([key1,key2,key3])模拟按顺序按下给定键字符串,然后以相反的顺序释放。

screenshot()返回屏幕快照的Image对象。
上一篇下一篇

猜你喜欢

热点阅读