1. 基础语法
"GUI自动化":通过程序控制应用,向他们发送虚拟的击键和鼠标点击,即图形用户界面自动化
import pyautogui
#以下指令将返回屏幕分辨率大小weight , height = pyautogui.size()
1.1 鼠标
(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.2 处理屏幕
(1)获取屏幕快照
#im包含一个Image对象,可对其调用Image方法im = pyautogui.screenshot()#传入坐标元组,返回该处RGB元组im.getpixel((50,100))
(2)分析屏幕快照
可用于判断该处按钮是否为可选按钮,灰色按钮等
#参数(x,y,(R,G,B)),检查(x,y)处RGB是否完全匹配给出的RGB元组值,返回True/Falsepyautogui.pixelMatchesColor(20,300,(255,255,0))
(3)图像识别
将以前保存的屏幕快照保存为‘submit.png’
#函数返回四个证书的元组,是屏幕上首次发现该图像时左边的X坐标,顶边的Y坐标,图像的宽度以及高度pyautogui.locateOnScreen('submit.png') #这里要求的是“完全匹配”
若该图像能在屏幕上找到多处,则 pyautogui.locateAllOnScreen() 函数将返回一个Generator对象,将他传递给List,返回一个4整数元组的列表。
1.3 键盘
(1)键盘发送字符串
#在此之前一般会先调用click函数取得焦点pyautogui.typewrite('hello world')
(2)键名
注:以上调用时加上 ' '
(3)按下和释放键盘
#打印 % 符号 ‘shift+5’pyautogui.keyDown('shift') #按下pyautogui.press('4')#按下并释放pyautogui.keyUp('shift) #释放
(4)热键组合
为了避免以上麻烦的指令,可应用热键功能,接受多个键字符串的函数,按给出的顺序按下,相反的顺序释放,于是以上代码就变成了:
pyautogui.hoykey('shift','4')
2. 实例应用
2.1 鼠标在哪里
在移动鼠标时随时显示x,y坐标,以及RGB颜色值
#@TIME :/4/5 16:24#输出当前鼠标位置,以及像素RGB颜色import pyautoguiprint("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")
2.2 自动提交表单
#@TIME :/4/8 15:18#自动填表程序 网址:/forms/d/e/1FAIpQLScSVDFU76rZvbO_tiIwSt6d9sOK0CZyS9KKMCP6cP5O5W5lVQ/viewformimport 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]) #开始另一个
3. 课后习题
18.14.1 看起来很忙机器人
#@TIME :/4/8 16:02#不想通信软件变为空闲,每隔十秒钟动一下鼠标import pyautogui,timeTIMESLEEP = 5try:while True:x,y = pyautogui.position()print(x,y)time.sleep(TIMESLEEP)pyautogui.moveRel(10,0,duration=0.2)except KeyboardInterrupt:quit()