转载来自:html
https://muxuezi.github.io/posts/doc-pyautogui.htmlgit
http://blog.topspeedsnail.com/archives/5373github
---------------------------------------------------------------------------------------------------------chrome
PyAutoGUI是一个纯Python的GUI自动化工具,其目的是能够用程序自动控制鼠标和键盘操做,利用它能够实现自动化任务,不再用担忧有重复枯燥的任务了。api
安装:浏览器
pip install pyautogui
或在pipy直接下载install函数
在Py3中安装提示:工具
Collecting PIL Could not find a version that satisfies the requirement PIL (from versions: ) No matching distribution found for PIL
依赖包PIL,Py3不支持,能够安装Pillow 代替:PIL, 而后在install pyautoguipost
pip install pillow
import pyautogui screenWidth, screenHeight = pyautogui.size() currentMouseX, currentMouseY = pyautogui.position() pyautogui.moveTo(100, 150) pyautogui.click() # 鼠标向下移动10像素 pyautogui.moveRel(None, 10) pyautogui.doubleClick() # 用缓动/渐变函数让鼠标2秒后移动到(500,500)位置 # use tweening/easing function to move mouse over 2 seconds. pyautogui.moveTo(1800, 500, duration=2, tween=pyautogui.easeInOutQuad) # 在每次输入之间暂停0.25秒 pyautogui.typewrite('Hello world!', interval=0.25) pyautogui.press('esc') pyautogui.keyDown('shift') pyautogui.press(['left', 'left', 'left', 'left', 'left', 'left']) pyautogui.keyUp('shift') pyautogui.hotkey('ctrl', 'c')
Python移动鼠标、点击键盘很是快,有能够致使其余应用出现问题。在这种状况下,程序可能会失控(即便是按照你的意思执行的),那时就须要中断。若是鼠标还在自动操做,就很难在程序窗口关闭它。ui
为了可以及时中断,PyAutoGUI提供了一个保护措施。当pyautogui.FAILSAFE = True
时,若是把鼠标光标在屏幕左上角,PyAutoGUI函数就会产生pyautogui.FailSafeException
异常。若是失控了,须要中断PyAutoGUI函数,就把鼠标光标在屏幕左上角。要禁用这个特性,就把FAILSAFE
设置成False
:
import pyautogui pyautogui.FAILSAFE = False
经过把pyautogui.PAUSE
设置成float
或int
时间(秒),能够为全部的PyAutoGUI函数增长延迟。默认延迟时间是0.1秒。在函数循环执行的时候,这样作可让PyAutoGUI运行的慢一点,很是有用。例如:
import pyautogui pyautogui.PAUSE = 2.5 pyautogui.moveTo(100,100); pyautogui.click()
全部的PyAutoGUI函数在延迟完成前都处于阻塞状态(block)。(将来计划增长一个可选的非阻塞模式来调用函数。)
建议PAUSE
和FAILSAFE
一块儿使用。
PyAutoGUI使用x,y坐标,屏幕左上角坐标是(0, 0)。
使用pyautogui.size()函数得到屏幕的分辨率:
import pyautogui pyautogui.size() # (1366, 768) width, height = pyautogui.size()
moveTo函数,绝对坐标
import pyautogui for i in range(10): pyautogui.moveTo(300, 300, duration=0.25) pyautogui.moveTo(400, 300, duration=0.25) pyautogui.moveTo(400, 400, duration=0.25) pyautogui.moveTo(300, 400, duration=0.25)
上面代码让鼠标顺时针移动,并划10次方框。
划圆:
import pyautogui import math width, height = pyautogui.size() r = 250 # 圆的半径 # 圆心 o_x = width/2 o_y = height/2 pi = 3.1415926 for i in range(10): # 转10圈 for angle in range(0, 360, 5): # 利用圆的参数方程 X = o_x + r * math.sin(angle*pi/180) Y = o_y + r * math.cos(angle*pi/180) pyautogui.moveTo(X, Y, duration=0.1)
moveRel()函数,相对坐标。以当前鼠标所在位置为基点:
import pyautogui for i in range(10): pyautogui.moveRel(100, 0, duration=0.25) pyautogui.moveRel(0, 100, duration=0.25) pyautogui.moveRel(-100, 0, duration=0.25) pyautogui.moveRel(0, -100, duration=0.25)
得到鼠标所在坐标:
import pyautogui x, y = pyautogui.position()
实时得到鼠标位置坐标:
import pyautogui try: while True: x, y = pyautogui.position() print(x,y) except KeyboardInterrupt: print('\nExit.')
鼠标点击
使用click()函数发送虚拟鼠标点击,默认状况下在鼠标所在的位置点击左键。函数原型:
pyautogui.click(x=cur_x, y=cur_y, button='left')
要在当前位置点击右键:
import pyautogui pyautogui.click(button='right')
click函数完成了一次鼠标点击。一次完整的点击包括两部分,按下mouseDown()和弹起mouseUp()。上面这两个函数参数和click函数同样,其实click函数只是简单的封装了mouseDown()和mouseUp()函数。
import pyautogui pyautogui.click(100, 100)
每一个按键按下和松开两个事件能够分开处理:
pyautogui.mouseDown(x=moveToX, y=moveToY, button='left') pyautogui.mouseUp(x=moveToX, y=moveToY, button='left')
鼠标拖拽
拖拽的意思是:按下鼠标键并拖动鼠标。PyAutoGUI提供了两个函数:dragTo() 和 dragRel()。它的参数和moveTo() 和 moveRel() 同样。
注意:duration时间不能过短,拖动太快有些系统会吃不消。
要作屡次单击能够设置clicks
参数,还有interval
参数能够设置每次单击之间的时间间隔。例如:
# 双击左键 pyautogui.click(clicks=2) # 两次单击之间停留0.25秒 pyautogui.click(clicks=2, interval=0.25) # 三击右键 pyautogui.click(button='right', clicks=2, interval=0.25)
滚轮
使用函数scroll(),它只接受一个整数。若是值为正往上滚,值为负往下滚。
pyautogui.scroll(200)
pyautogui有截屏功能
# 返回一个Pillow/PIL的Image对象 pyautogui.screenshot() pyautogui.screenshot('foo.png')
若是你不须要截取整个屏幕,还有一个可选的region
参数。你能够把截取区域的左上角XY坐标值和宽度、高度传入截取。
im = pyautogui.screenshot(region=(0, 0, 300 ,400))
假如你有一个按钮要10秒种点击一下,这个任务使用上面介绍的函数能够轻松实现。可是咱们假设你每次点击这个按钮它都会变换一个位置(随机),这时你该怎么办?下面咱们就来解决这个问题。
首先看一下怎么使用pyautogui截屏:
import pyautogui im = pyautogui.screenshot() # 得到某个坐标的像素 im.getpixel((50, 200)) # (30, 132, 153) # 判断屏幕坐标的像素是否是等于某个值 pyautogui.pixelMatchesColor(50, 200, (30, 132, 153)) # True
如今咱们来解决前面提出的问题。问题的关键是怎么找到按钮所在的坐标。其实很简单,首先对你要点击的按钮截个图,就叫button.png吧。而后使用locateOnScreen函数找到按钮所在的位置:
import pyautogui pyautogui.locateOnScreen('button.png') # (643, 745, 70, 29)
locateOnScreen其实就是简单的颜色对比,若是有一个像素不匹配,它就会返回None。这个函数返回了匹配图形的坐标,找到中间点:
x, y = pyautogui.center((643, 745, 70, 29)) # 得到中心点 pyautogui.click(x, y)
要检查XY坐标是否在屏幕上,须要用onScreen()
函数来检验,若是在屏幕上返回True
:
import pyautogui pyautogui.onScreen(0, 0) # True
pyautogui.onScreen(0, -1) #False
缓动/渐变函数的做用是让光标的移动更炫。若是你不须要用到的话,你能够忽略这些。
缓动/渐变函数能够改变光标移动过程的速度和方向。一般鼠标是匀速直线运动,这就是线性缓动/渐变函数。PyAutoGUI有30种缓动/渐变函数,能够经过pyautogui.ease*?
查看。其中,pyautogui.easeInQuad()
函数能够用于moveTo()
,moveRel()
,dragTo()
和dragRel()
函数,光标移动呈现先慢后快的效果,整个过程的时间仍是和原来同样。而pyautogui.easeOutQuad
函数的效果相反:光标开始移动很快,而后慢慢减速。pyautogui.easeOutElastic
是弹簧效果,首先越过终点,而后再反弹回来。例如:
# 开始很慢,不断加速 pyautogui.moveTo(100, 100, 2, pyautogui.easeInQuad) # 开始很快,不断减速 pyautogui.moveTo(100, 100, 2, pyautogui.easeOutQuad) # 开始和结束都快,中间比较慢 pyautogui.moveTo(100, 100, 2, pyautogui.easeInOutQuad) # 一步一徘徊前进 pyautogui.moveTo(100, 100, 2, pyautogui.easeInBounce) # 徘徊幅度更大,甚至超过起点和终点 pyautogui.moveTo(100, 100, 2, pyautogui.easeInElastic)
这些效果函数是模仿Al Sweigart的PyTweening模块,能够直接使用,不须要额外安装。
若是你想建立本身的效果,也能够定义一个函数,其参数是(0.0,1.0),表示起点和终点,返回值是介于[0.0,1.0]之间的数。
输入字符串
pyautogui.typewrite():
import pyautogui pyautogui.click(100, 100) pyautogui.typewrite('Hello world!')
上面的字符串是一次输入,为了唬人能够延迟输入:
pyautogui.typewrite('Hello world!', 0.25)
PyAutoGUI输入单个字符还能够,可是一些特殊字符怎么办呢?例如上面输入完Hello World,而后换行继续输入。
PyAutoGUI键盘表:
‘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’ |
箭头键 |
‘f1’, ‘f2’, ‘f3’…. |
F1…….F12键 |
‘volumemute’, ‘volumedown’,‘volumeup’ |
有些键盘没有 |
‘pause’ |
PAUSE键 |
‘capslock’, ‘numlock’,‘scrolllock’ |
CAPS LOCK, NUM LOCK, 和 SCROLLLOCK 键 |
‘insert’ |
INS或INSERT键 |
‘printscreen’ |
PRTSC 或 PRINT SCREEN键 |
‘winleft’, ‘winright’ |
Win键 |
‘command’ |
Mac OS X command键 |
import pyautogui pyautogui.click(100, 100) pyautogui.typewrite('Hello world!', 0.25) pyautogui.typewrite(['enter', 'a', 'b', 'left', 'left', 'X', 'Y'], '0.25')
按键的按下和释放 和鼠标按键很是相似。
alt+F4:
pyautogui.keyDown('altleft'); pyautogui.press('f4'); pyautogui.keyUp('altleft')
直接使用热键函数:
pyautogui.hotkey('altleft', 'f4')
每一个按键的按下和松开也能够单独调用:
pyautogui.keyDown(key_name)
pyautogui.keyUp(key_name)
若是你须要消息弹窗,经过单击OK暂停程序,或者向用户显示一些信息,消息弹窗函数就会有相似JavaScript的功能:
pyautogui.alert('这个消息弹窗是文字+OK按钮') pyautogui.confirm('这个消息弹窗是文字+OK+Cancel按钮') pyautogui.prompt('这个消息弹窗是让用户输入字符串,单击OK')
在prompt()
函数中,若是用户什么都不输入,就会返回None
。
1.打开浏览器以无痕模式浏览网页
import pyautogui import subprocess import win32api import time prs=subprocess.Popen(["C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe "]) time.sleep(1) pree=pyautogui.hotkey('ctrl', 'shift', 'n') time.sleep(2) pyautogui.typewrite('http://geek.csdn.net/news/detail/86546', interval=0.25) pyautogui.press('enter') pyautogui.press('enter') time.sleep(2) win32api.TerminateProcess(int(prs._handle), -1)
2.将当前屏幕最顶端应用拖拽到坐标(100,200),而后截图
pyautogui.moveTo(200, 0, duration=0.25) pyautogui.mouseDown(button='left') # 移动到(100, 200)位置,而后松开鼠标右键 pyautogui.mouseUp(button='left', x=100, y=200) pyautogui.screenshot('foo.png') 截图