转载来自:

https://muxuezi.github.io/posts/doc-pyautogui.html

http://blog.topspeedsnail.com/archives/5373

---------------------------------------------------------------------------------------------------------

PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,利用它可以实现自动化任务,再也不用担心有重复枯燥的任务了。

安装:

  1. pip install pyautogui

或在pipy直接下载install

在Py3中安装提示:

  1. Collecting PIL
  2. Could not find a version that satisfies the requirement PIL (from versions: )
  3. No matching distribution found for PIL

依赖包PIL,Py3不支持,可以安装Pillow 代替:PIL, 然后在install pyautogui

  1. pip install pillow

例子

  1. import pyautogui
  2. screenWidth, screenHeight = pyautogui.size()
  3. currentMouseX, currentMouseY = pyautogui.position()
  4. pyautogui.moveTo(100, 150)
  5. pyautogui.click()
  6. # 鼠标向下移动10像素
  7. pyautogui.moveRel(None, 10)
  8. pyautogui.doubleClick()
  9. # 用缓动/渐变函数让鼠标2秒后移动到(500,500)位置
  10. # use tweening/easing function to move mouse over 2 seconds.
  11. pyautogui.moveTo(1800, 500, duration=2, tween=pyautogui.easeInOutQuad)
  12. # 在每次输入之间暂停0.25秒
  13. pyautogui.typewrite('Hello world!', interval=0.25)
  14. pyautogui.press('esc')
  15. pyautogui.keyDown('shift')
  16. pyautogui.press(['left', 'left', 'left', 'left', 'left', 'left'])
  17. pyautogui.keyUp('shift')
  18. pyautogui.hotkey('ctrl', 'c')

保护措施(Fail-Safes)

Python移动鼠标、点击键盘非常快,有可以导致其他应用出现问题。在这种情况下,程序可能会失控(即使是按照你的意思执行的),那时就需要中断。如果鼠标还在自动操作,就很难在程序窗口关闭它。

为了能够及时中断,PyAutoGUI提供了一个保护措施。当pyautogui.FAILSAFE = True时,如果把鼠标光标在屏幕左上角,PyAutoGUI函数就会产生pyautogui.FailSafeException异常。如果失控了,需要中断PyAutoGUI函数,就把鼠标光标在屏幕左上角。要禁用这个特性,就把FAILSAFE设置成False

  1. import pyautogui
  2. pyautogui.FAILSAFE = False

通过把pyautogui.PAUSE设置成floatint时间(秒),可以为所有的PyAutoGUI函数增加延迟。默认延迟时间是0.1秒。在函数循环执行的时候,这样做可以让PyAutoGUI运行的慢一点,非常有用。例如:

  1. import pyautogui
  2. pyautogui.PAUSE = 2.5
  3. pyautogui.moveTo(100,100); pyautogui.click()

所有的PyAutoGUI函数在延迟完成前都处于阻塞状态(block)。(未来计划增加一个可选的非阻塞模式来调用函数。)

建议PAUSEFAILSAFE一起使用。

移动鼠标

PyAutoGUI使用x,y坐标,屏幕左上角坐标是(0, 0)。

使用pyautogui.size()函数获得屏幕的分辨率:

  1. import pyautogui
  2.  
  3. pyautogui.size()
  4. # (1366, 768)
  5. width, height = pyautogui.size()

moveTo函数,绝对坐标

  1. import pyautogui
  2. for i in range(10):
  3. pyautogui.moveTo(300, 300, duration=0.25)
  4. pyautogui.moveTo(400, 300, duration=0.25)
  5. pyautogui.moveTo(400, 400, duration=0.25)
  6. pyautogui.moveTo(300, 400, duration=0.25)

上面代码让鼠标顺时针移动,并划10次方框。

划圆:

  1. import pyautogui
  2. import math
  3.  
  4. width, height = pyautogui.size()
  5.  
  6. r = 250 # 圆的半径
  7. # 圆心
  8. o_x = width/2
  9. o_y = height/2
  10.  
  11. pi = 3.1415926
  12.  
  13. for i in range(10): # 转10圈
  14. for angle in range(0, 360, 5): # 利用圆的参数方程
  15. X = o_x + r * math.sin(angle*pi/180)
  16. Y = o_y + r * math.cos(angle*pi/180)
  17.  
  18. pyautogui.moveTo(X, Y, duration=0.1)

moveRel()函数,相对坐标。以当前鼠标所在位置为基点:

  1. import pyautogui
  2.  
  3. for i in range(10):
  4. pyautogui.moveRel(100, 0, duration=0.25)
  5. pyautogui.moveRel(0, 100, duration=0.25)
  6. pyautogui.moveRel(-100, 0, duration=0.25)
  7. pyautogui.moveRel(0, -100, duration=0.25)

获得鼠标所在坐标:

  1. import pyautogui
  2.  
  3. x, y = pyautogui.position()

实时获得鼠标位置坐标:

  1. import pyautogui
  2. try:
  3. while True:
  4. x, y = pyautogui.position()
  5. print(x,y)
  6. except KeyboardInterrupt:
  7. print('\nExit.')

鼠标点击、拖拽和滚轮

鼠标点击

使用click()函数发送虚拟鼠标点击,默认情况下在鼠标所在的位置点击左键。函数原型:

  1. pyautogui.click(x=cur_x, y=cur_y, button='left')
  • x,y是要点击的位置,默认是鼠标当前位置
  • button是要点击的按键,有三个可选值:‘left’, ‘middle’,  ‘right’

要在当前位置点击右键:

  1. import pyautogui
  2.  
  3. pyautogui.click(button='right')

click函数完成了一次鼠标点击。一次完整的点击包括两部分,按下mouseDown()和弹起mouseUp()。上面这两个函数参数和click函数一样,其实click函数只是简单的封装了mouseDown()和mouseUp()函数。

  1. import pyautogui
  2.  
  3. pyautogui.click(100, 100)

每个按键按下和松开两个事件可以分开处理:

  1. pyautogui.mouseDown(x=moveToX, y=moveToY, button='left')
  2. pyautogui.mouseUp(x=moveToX, y=moveToY, button='left')
  • pyautogui.doubleClick():鼠标双击,其实就是执行两次click()函数。
  • pyautogui.rightClick():右击
  • pyautogui.middleClick():中击

鼠标拖拽

拖拽的意思是:按下鼠标键并拖动鼠标。PyAutoGUI提供了两个函数:dragTo() 和 dragRel()。它的参数和moveTo() 和 moveRel() 一样。

注意:duration时间不能太短,拖动太快有些系统会吃不消。

要做多次单击可以设置clicks参数,还有interval参数可以设置每次单击之间的时间间隔。例如:

  1. # 双击左键
  2. pyautogui.click(clicks=2)
  3. # 两次单击之间停留0.25秒
  4. pyautogui.click(clicks=2, interval=0.25)
  5. # 三击右键
  6. pyautogui.click(button='right', clicks=2, interval=0.25)

滚轮

使用函数scroll(),它只接受一个整数。如果值为正往上滚,值为负往下滚。

  1. pyautogui.scroll(200)

定位某个按钮的位置

pyautogui有截屏功能

  1. # 返回一个Pillow/PIL的Image对象
  2. pyautogui.screenshot()
  3. pyautogui.screenshot('foo.png')

如果你不需要截取整个屏幕,还有一个可选的region参数。你可以把截取区域的左上角XY坐标值和宽度、高度传入截取。

  1. im = pyautogui.screenshot(region=(0, 0, 300 ,400))

假如你有一个按钮要10秒种点击一下,这个任务使用上面介绍的函数可以轻松实现。但是我们假设你每次点击这个按钮它都会变换一个位置(随机),这时你该怎么办?下面我们就来解决这个问题。

首先看一下怎么使用pyautogui截屏:

  1. import pyautogui
  2.  
  3. im = pyautogui.screenshot()
  4.  
  5. # 获得某个坐标的像素
  6. im.getpixel((50, 200))
  7. # (30, 132, 153)
  8.  
  9. # 判断屏幕坐标的像素是不是等于某个值
  10. pyautogui.pixelMatchesColor(50, 200, (30, 132, 153))
  11. # True

现在我们来解决前面提出的问题。问题的关键是怎么找到按钮所在的坐标。其实很简单,首先对你要点击的按钮截个图,就叫button.png吧。然后使用locateOnScreen函数找到按钮所在的位置:

  1. import pyautogui
  2. pyautogui.locateOnScreen('button.png')
  3. # (643, 745, 70, 29)

locateOnScreen其实就是简单的颜色对比,如果有一个像素不匹配,它就会返回None。这个函数返回了匹配图形的坐标,找到中间点:

  1. x, y = pyautogui.center((643, 745, 70, 29)) # 获得中心点
  2. pyautogui.click(x, y)
  • locateAllOnScreen():找到所有匹配的位置坐标。

要检查XY坐标是否在屏幕上,需要用onScreen()函数来检验,如果在屏幕上返回True

  1. import pyautogui
  2. pyautogui.onScreen(0, 0)
  3. # True
  1. pyautogui.onScreen(0, -1)
  2. #False

缓动/渐变(Tween / Easing)函数

缓动/渐变函数的作用是让光标的移动更炫。如果你不需要用到的话,你可以忽略这些。

缓动/渐变函数可以改变光标移动过程的速度和方向。通常鼠标是匀速直线运动,这就是线性缓动/渐变函数。PyAutoGUI有30种缓动/渐变函数,可以通过pyautogui.ease*?查看。其中,pyautogui.easeInQuad()函数可以用于moveTo()moveRel()dragTo()dragRel()函数,光标移动呈现先慢后快的效果,整个过程的时间还是和原来一样。而pyautogui.easeOutQuad函数的效果相反:光标开始移动很快,然后慢慢减速。pyautogui.easeOutElastic是弹簧效果,首先越过终点,然后再反弹回来。例如:

  1. # 开始很慢,不断加速
  2. pyautogui.moveTo(100, 100, 2, pyautogui.easeInQuad)
  3. # 开始很快,不断减速
  4. pyautogui.moveTo(100, 100, 2, pyautogui.easeOutQuad)
  5. # 开始和结束都快,中间比较慢
  6. pyautogui.moveTo(100, 100, 2, pyautogui.easeInOutQuad)
  7. # 一步一徘徊前进
  8. pyautogui.moveTo(100, 100, 2, pyautogui.easeInBounce)
  9. # 徘徊幅度更大,甚至超过起点和终点
  10. pyautogui.moveTo(100, 100, 2, pyautogui.easeInElastic)

这些效果函数是模仿Al Sweigart的PyTweening模块,可以直接使用,不需要额外安装。

如果你想创建自己的效果,也可以定义一个函数,其参数是(0.0,1.0),表示起点和终点,返回值是介于[0.0,1.0]之间的数。

键盘按键

输入字符串

pyautogui.typewrite():

  1. import pyautogui
  2.  
  3. pyautogui.click(100, 100)
  4. pyautogui.typewrite('Hello world!')

上面的字符串是一次输入,为了唬人可以延迟输入:

  1. 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键

  1. import pyautogui
  2.  
  3. pyautogui.click(100, 100)
  4. pyautogui.typewrite('Hello world!', 0.25)
  5. pyautogui.typewrite(['enter', 'a', 'b', 'left', 'left', 'X', 'Y'], '0.25')

按键的按下和释放 和鼠标按键非常类似。

  • keyDown():按下某个键
  • keyUp():松开某个键
  • press():一次完整的击键,前面两个函数的组合。

alt+F4:

  1. pyautogui.keyDown('altleft');
  2. pyautogui.press('f4');
  3. pyautogui.keyUp('altleft')

直接使用热键函数:

  1. pyautogui.hotkey('altleft', 'f4')

每个按键的按下和松开也可以单独调用:

  1. pyautogui.keyDown(key_name)
  2. pyautogui.keyUp(key_name)

消息弹窗函数

如果你需要消息弹窗,通过单击OK暂停程序,或者向用户显示一些信息,消息弹窗函数就会有类似JavaScript的功能:

  1. pyautogui.alert('这个消息弹窗是文字+OK按钮')
  2. pyautogui.confirm('这个消息弹窗是文字+OK+Cancel按钮')
  3. pyautogui.prompt('这个消息弹窗是让用户输入字符串,单击OK')

prompt()函数中,如果用户什么都不输入,就会返回None

应用

1.打开浏览器以无痕模式浏览网页

  1. import pyautogui
  2. import subprocess
  3. import win32api
  4. import time
  5. prs=subprocess.Popen(["C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe "])
  6. time.sleep(1)
  7. pree=pyautogui.hotkey('ctrl', 'shift', 'n')
  8.  
  9. time.sleep(2)
  10. pyautogui.typewrite('http://geek.csdn.net/news/detail/86546', interval=0.25)
  11. pyautogui.press('enter')
  12. pyautogui.press('enter')
  13. time.sleep(2)
  14. win32api.TerminateProcess(int(prs._handle), -1)

2.将当前屏幕最顶端应用拖拽到坐标(100,200),然后截图

  1. pyautogui.moveTo(200, 0, duration=0.25)
  2. pyautogui.mouseDown(button='left')
  3. # 移动到(100, 200)位置,然后松开鼠标右键
  4. pyautogui.mouseUp(button='left', x=100, y=200)
  5. pyautogui.screenshot('foo.png') 截图

PyAutoGUI 简介的更多相关文章

  1. Python 实现auto linlink 连连看

    先上知乎上大神所写: 你看过/写过哪些有意思的代码? 然后别急着看blog,玩一把游戏再说! 看知乎评论,有人说他用了一个下午时间就写出来了. wo kao!!! 我断断续续写了一周的下午才搞定,然后 ...

  2. pyautogui 文档(一):简介

    PyAutoGUI 可实现控制鼠标.键盘.消息框.截图.定位等功能,最近做了个自动化需要这些,故了解并记录下 自动化需要操作win7上的一个app,用PyAutoGUI做的,定位坐标,点击鼠标等,但是 ...

  3. PyAutoGUI——让所有GUI都自动化

    2015-08-17:输入中文bug没有解决,目前的解决方案是Python 2.X环境下安装pyperclip和pyautogui,用复制粘贴来实现. In [ ]: import pyperclip ...

  4. Python3.x:第三方库简介

    Python3.x:第三方库简介 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex ...

  5. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  6. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  7. Cassandra简介

    在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...

  8. REST简介

    一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...

  9. Microservice架构模式简介

    在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...

随机推荐

  1. jquery理财贷款计算器

    先放效果图,如下: 需要引入jquery ,bootstrap jq代码如下: function pCalculator(amount,term,rating,repayway){ var zhong ...

  2. Linux下oracle数据库启动和关闭操作

    第一步:登陆 root登陆之后切换到oracle用户上,输入 su oracle 第二步:连接 在oracle用户下,输入 sqlplus /nolog 第三步:使用管理员权限 输入 connect ...

  3. sql 注入问题

    1. 关于使用intval强制转换成数字的问题.数字大于2147483647会出现溢出出现负数.使用个方法来替代这个吧$n="\n";$a=2147483648.05555;ech ...

  4. Android studio 软件板块

  5. github怎么退出组织和删除自己创建的组织

    1. 点击头像,进入settings 2. 点击左侧菜单中的 Organizations 切换到Origanizations后,右侧面板中会出现所有的oragnizations,我这里只有一个,是我自 ...

  6. MySQL模糊搜索的四种用法

    1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '% ...

  7. 为什么margin-top不是作用于父元素【margin外边距合并问题】

    coding时发现margin-top居然没作用于本元素上,而是作用到了父元素上. 原来是margin外边距合并导致的.以下是网上搬运来的知识: margin外边距合并详解:外边距合并现象在网页布局中 ...

  8. linux查看端口占用情况

    今天要使用python写一个端口探测的小程序,以检测一些特定的服务端口有没有被占用,突然发现自己居然不知道在linux中如何查询端口被占用的情况,天呐,赶快学习一下.

  9. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  10. 博客整理——K米测评

    K米测评 1.233郑扬涛(orzyt) 博客链接:个人作业--关于K米的产品案例分析 亮点分析: 1.将整个软件各个功能模块的逻辑图都画出来了,而不是只画一个大概. 我做了个缩略图 2.第三部分 建 ...