"GUI自动化":通过程序控制应用,向他们发送虚拟的击键和鼠标点击,即图形用户界面自动化
import pyautogui
#以下指令将返回屏幕分辨率大小
weight , height = pyautogui.size()
(1)移动鼠标
#移动绝对坐标值(x,y,移动到该位置所需时间)
pyautogui.moveto(100,200,duration = 0.2)
#移动相对坐标
pyautogui.moveRel(100,-100,duration = 0.2)
(2)获取鼠标位置
#返回坐标元组
pyautogui.position()
(3)点击鼠标
#点击函数(x,y,点击左/右键)
pyautogui.click(x,y,button = 'left')
#鼠标按下不松开
pyautogui.mouseDown()
#释放鼠标
pyautogui.Up()
#双击左键
pyautogui.doubleClick()
#双击中键
pyautogui.middleClick()
(4)拖动鼠标
#拖动到绝对坐标位置
pyautogui.dragTo(x,y,duration = 0.2)
#拖动到相对坐标位置
pyautogui.dragRel(x,y,duration = 0.2)
(5)滚动鼠标
#正数为向上滚动,负数为向下滚动
pyautogui.scroll(100)
(1)获取屏幕快照
#im包含一个Image对象,可对其调用Image方法
im = pyautogui.screenshot()
#传入坐标元组,返回该处RGB元组
im.getpixel((50,100))
(2)分析屏幕快照
可用于判断该处按钮是否为可选按钮,灰色按钮等
#参数(x,y,(R,G,B)),检查(x,y)处RGB是否完全匹配给出的RGB元组值,返回True/False
pyautogui.pixelMatchesColor(20,300,(255,255,0))
(3)图像识别
将以前保存的屏幕快照保存为‘submit.png’
#函数返回四个证书的元组,是屏幕上首次发现该图像时左边的X坐标,顶边的Y坐标,图像的宽度以及高度
pyautogui.locateOnScreen('submit.png') #这里要求的是“完全匹配”
若该图像能在屏幕上找到多处,则 pyautogui.locateAllOnScreen() 函数将返回一个Generator对象,将他传递给List,返回一个4整数元组的列表。
(1)键盘发送字符串
#在此之前一般会先调用click函数取得焦点
pyautogui.typewrite('hello world')
(2)键名
键盘键字符串 | 含义 |
‘a’,'1','?'等 | 单个字符的键 |
‘enter’ / '\n' | 回车键 |
‘esc’ | Esc键 |
shiftleft , shiftright | 左右shift键 |
altleft, altright | 左右alt键 |
ctrlleft同上 | 左右ctrl |
tab \t | Tab键 |
backapace delete | 空格键 Del键 |
pageup pagedown | Page UP/Down |
home end | Home End |
up down left right | 上下左右箭头键 |
f1 f2... | F1-F12 |
volumemute volumedown volumeup | 音量静音,调大,调小 |
pause | Pause |
capslpck numlock scrolllock | 功能锁 |
insert | 同义 |
printscreen | 同义 |
winleft winright | 左右win键 |
command | Command键(OS) |
option | option键(OS) |
注:以上调用时加上 ' '
(3)按下和释放键盘
#打印 % 符号 ‘shift+5’
pyautogui.keyDown('shift') #按下
pyautogui.press('4') #按下并释放
pyautogui.keyUp('shift) #释放
(4)热键组合
为了避免以上麻烦的指令,可应用热键功能,接受多个键字符串的函数,按给出的顺序按下,相反的顺序释放,于是以上代码就变成了:
pyautogui.hoykey('shift','4')
在移动鼠标时随时显示x,y坐标,以及RGB颜色值
#@TIME :2018/4/5 16:24
#输出当前鼠标位置,以及像素RGB颜色
import pyautogui
print("Press Crtl+C to quit")
try:
while True:
x, y = pyautogui.position()
positionstr = 'X: '+str(x).rjust(4) + 'Y: ' + str(y).rjust(4) #格式化输出
pixelcolor = pyautogui.screenshot().getpixel((x,y)) #截图得到x,y处颜色值
positionstr += ' RGB :('+str(pixelcolor[0]).rjust(3)
positionstr +=', ' + str(pixelcolor[1]).rjust(3)
positionstr +=', ' + str(pixelcolor[2]).rjust(3) +' )'
print(positionstr)
# print('\b'*len(positionstr),end='',flush=True) #每移动一次屏幕刷新
except KeyboardInterrupt: #捕捉中断异常
print("Done\n")
#@TIME :2018/4/8 15:18
#自动填表程序 网址:https://docs.google.com/forms/d/e/1FAIpQLScSVDFU76rZvbO_tiIwSt6d9sOK0CZyS9KKMCP6cP5O5W5lVQ/viewform
import pyautogui,time
# 0 要输入的信息(以列表中元组的形式)
FormData = [
{'name':'Alex','fear':'eavesdroppers','source':'money','robocop':4,'comments':'Tell bob i said hi'},
{'name':'Bob','fear':'bees','source':'wand','robocop':3,'comments':'n/a'}
]
# 1 找到各按钮的确切位置(通过上一个例子确定按钮位置)
namefield = (369,333)
submit= (400,524)
submitcolor = (156, 141, 248)
submitanother = (517,245)
#2 开始键入数据
for person in FormData:
print(">>>5s pause to let users press crtl-c") #给5秒的时间确定屏幕焦点
time.sleep(5)
# while not pyautogui.pixelMatchesColor(submitcolor[0],submitcolor[1],submitcolor[2]):
# time.sleep(0.5)
print("Entering %s info..."%(person['name']))
pyautogui.click(namefield[0],namefield[1])
pyautogui.typewrite(person['name'] + '\t') #'\t'进行下一项的填写
pyautogui.typewrite(person['fear']+'\t')
# 3 处理列表和单选按钮
if person['source'] == 'wand': #下拉菜单
pyautogui.typewrite(['down','\t'])
elif person['source'] == 'money':
pyautogui.typewrite(['down','down','down','down','\t'])
if person['robocop'] == 3: #单选按钮
pyautogui.typewrite(['right','right','\t'])
elif person['robocop'] == 4:
pyautogui.typewrite(['right','right','right','\t'])
pyautogui.typewrite(person['comments'] +'\t')
pyautogui.typewrite('enter') #提交
# 4 开始另一份
print("Submit clicked")
pyautogui.click(submitanother[0],submitanother[1]) #开始另一个
18.14.1 看起来很忙机器人
#@TIME :2018/4/8 16:02
#不想通信软件变为空闲,每隔十秒钟动一下鼠标
import pyautogui,time
TIMESLEEP = 5
try:
while True:
x,y = pyautogui.position()
print(x,y)
time.sleep(TIMESLEEP)
pyautogui.moveRel(10,0,duration=0.2)
except KeyboardInterrupt:
quit()