Python使用pyautogui模块实现自动化鼠标和键盘操作示例


Posted in Python onSeptember 04, 2018

本文实例讲述了Python使用pyautogui模块实现自动化鼠标和键盘操作。分享给大家供大家参考,具体如下:

一、pyautogui模块简要说明

## 使用 pyautogui 模块相关函数,可以模拟鼠标及键盘操作, 完整说明文档见: http://pyautogui.readthedocs.org/
# pip install pyautogui
# 要注意的是,模拟移动鼠标与击键可能太快,导致其他程序跟不上,并且程序可能失去控制,
# 需要掌握如何从问题中恢复,至少要能中止它。
# 防止或恢复GUI自动化问题
# 1) 使用pyautogui.PAUSE设置每个PyAutoGUI函数调用在执行动作后暂停的秒数
# 2) pyautogui自动防故障功能:将鼠标移到屏幕的左上角,来抛出failSafeException异常

二、控制鼠标移动与交互

三、屏幕快照与识别比较

四、控制键盘

五、综合例子

具体见以下代码及说明:

## 使用 pyautogui 模块相关函数,可以模拟鼠标及键盘操作, 完整说明文档见: http://pyautogui.readthedocs.org/
# pip install pyautogui
# 要注意的是,模拟移动鼠标与击键可能太快,导致其他程序跟不上,并且程序可能失去控制,
# 需要掌握如何从问题中恢复,至少要能中止它。
# 防止或恢复GUI自动化问题
#  1) 使用pyautogui.PAUSE设置每个PyAutoGUI函数调用在执行动作后暂停的秒数
#  2) pyautogui自动防故障功能:将鼠标移到屏幕的左上角,来抛出failSafeException异常
import pyautogui
pyautogui.PAUSE = 1
pyautogui.FAILSAFE = True      # 启用自动防故障功能
width,height = pyautogui.size()   # 屏幕的宽度和高度
pyautogui.position()        # 鼠标当前位置
## 控制鼠标移动
for i in range(10):
  pyautogui.moveTo(100,100,duration=0.25)   # 移动到 (100,100)
  pyautogui.moveTo(200,100,duration=0.25)
  pyautogui.moveTo(200,200,duration=0.25)
  pyautogui.moveTo(100,200,duration=0.25)
for i in range(10):
  pyautogui.moveRel(100,0,duration=0.25)    # 从当前位置右移100像素
  pyautogui.moveRel(0,100,duration=0.25)    # 向下
  pyautogui.moveRel(-100,0,duration=0.25)   # 向左
  pyautogui.moveRel(0,-100,duration=0.25)   # 向上
## 例子:持续获取鼠标位置并更新显示
# 1.获取当前坐标
# 2.在屏幕上打印,并删除之前打印的坐标
# 3.处理异常,并能按键退出
# Displays the mouse cursor's currrent position.
import pyautogui
print('Press Ctrl-C to quit.')
try:
  while True:
    # Get and print the mouse coordinates.
    x,y = pyautogui.position()
    positionStr = 'X: '+str(x).rjust(4)+' Y:'+str(y).rjust(4)
    pix = pyautogui.screenshot().getpixel((x,y))  # 获取鼠标所在屏幕点的RGB颜色
    positionStr += ' RGB:('+str(pix[0]).rjust(3)+','+str(pix[1]).rjust(3)+','+str(pix[2]).rjust(3)+')'
    print(positionStr,end='')           # end='' 替换了默认的换行
    print('\b'*len(positionStr),end='',flush=True) # 连续退格键并刷新,删除之前打印的坐标,就像直接更新坐标效果
except KeyboardInterrupt:               # 处理 Ctrl-C 按键
  print('\nDone.')
## 控制鼠标交互
# pyautogui.click() 封装了 pyautogui.mouseDown()和pyautogui.mouseUp(), 这两个函数也可以单独使用
# pyautogui.doubleClick() 双击左键, pyautogui.rightClick() 双击右键,pyautogui.middleClick() 双击中键
import pyautogui
pyautogui.click(10,5)           # 在(10,5)单击鼠标,默认左键
pyautogui.click(100,150,button='left')
pyautogui.click(200,250,button='right')
# pyautogui.dragTo()  按键并拖动鼠标移动,参数为坐标,与moveTo相同
# pyautogui.dragRel()  按键并拖动鼠标移动,参数为距离,与moveRel相同
import pyautogui,time
time.sleep(5)
# 这里停顿5秒,用于手工打开windows绘图应用,并选中铅笔或画图工具,让鼠标停留在画图工具的窗口中
# 或使用在线paint (http://sumopaint.com)
pyautogui.click()   # click to put drawing program in focus
distance = 200
while distance > 0 :
  pyautogui.dragRel(distance,0,duration=0.2) # move right
  distance = distance - 5
  pyautogui.dragRel(0,distance,duration=0.2) # move down
  pyautogui.dragRel(-distance,0,duration=0.2) # move left
  distance = distance - 5
  pyautogui.dragRel(0,-distance,duration=0.2) # move up
print('Done')
pyautogui.scroll(200)     # 鼠标向上滚动200像素
pyautogui.scroll(-100)    #   负数向下
import pyperclip
numbers = ''
for i in range(200):
  numbers = numbers + str(i) + '\n'
pyperclip.copy(numbers)
print(numbers)
# 这里手动打开一个文本窗口,粘贴
import time,pyautogui
time.sleep(5);pyautogui.scroll(100)
## 分析屏幕快照
import pyautogui
im = pyautogui.screenshot()   # 获取屏幕快照
im.getpixel((50,200))      # (130,135,144)
pyautogui.pixelMatchesColor(50,200,(130,135,144))  # True 可用来判断屏幕是否发生变化
pyautogui.pixelMatchesColor(50,200,(255,135,144))  # False
# 图像定位识别
pyautogui.locateOnScreen('submit.png')  # 在屏幕上查找匹配与文件相同的区域--每个区域像素都要相同 左,顶,宽,高
pyautogui.center(pyautogui.locateOnScreen('submit.png')) # 获取匹配图像中心点坐标
pyautogui.click((678,759))        # 点击该区域核心
list(pyautogui.locateAllOnScreen('submit.png'))  # 匹配到多处,返回区域list
## 控制键盘
pyautogui.click(100,100);pyautogui.typewrite('Hello python')
pyautogui.typewrite(['a','b','left','left','X','Y']) # typewrite可传入击键列表,这里输出XYab,left是左箭头
print(pyautogui.KEYBOARD_KEYS)      # pyautogui接受的所有可能字符串
pyautogui.press('enter')         # 接受按键命令
pyautogui.keyDown('shift');pyautogui.press('4');pyautogui.keyUp('shift')  # 输出 $ 符号的按键
#热键组合
pyautogui.keyDown('ctrl')
pyautogui.keyDown('c')
pyautogui.keyUp('c')
pyautogui.keyUp('ctrl')
# 这四句是组合 ctrl-c,类似这种顺序按下,再反序释放的,可以用hotkey()
pyautogui.hotkey('ctrl','c')        # 同上面四句,组合键
pyautogui.hotkey('ctrl','alt','shift','s') # Ctrl-Alt-Shift-S 热键组合
## 综合例子: 自动填表程序
# http://autbor.com/form
# 将电子表格中的大量数据自动输入到另一个应用的表单界面
# 1.点击表单的第一个文本字段
# 2.遍历表单,再每个输入栏键入信息
# 3.点击submit按钮
# 4.用下一组数据重复这个过程
# Automatically fills in the form.
import pyautogui,time
# set these to the correct coordinates for your computer.
nameField = (648,319)
submitButton = (651,817)
submitButtonColor = (75,141,249)
submitAnotherLink = (760,224)
formData = [{'name':'Alice','fear':'eavppers','source':'wand','robocop':4,'comments':'Tell us'},
      {'name':'Bog','fear':'eaves','source':'crystal','robocop':4,'comments':'Big room'},
      {'name':'Kad','fear':'apple','source':'woold','robocop':1,'comments':'Nice day'},
      {'name':'Cace','fear':'ppers','source':'ball','robocop':5,'comments':'n/a'}
      ]
pyautogui.PAUSE = 0.5
for person in formData:
  # Give the user a chance to kill the script.
  print('>>> 5 SECOND PAUSE TO LET USER PRESS CTRL-C <<<')
  time.sleep(5)
  # Wait until the form page has loaded.
  while not pyautogui.pixelMatchesColor(submitButton[0],submitButton[1],submitButtonColor):
    time.sleep(0.5)
  print('Entering %s info...' % (person['name']))
  pyautogui.click(nameField[0],nameField[1])    # 单击第一个文本字段输入位置
  # Fill out the Name field.
  pyautogui.typewrite(person['name']+'\t')     # 输入该域,并按下 tab 键,将焦点转向下一个输入框
  # Fill out the Greatest Fear(s) field.
  pyautogui.typewrite(person['fear']+'\t')
  # 处理下拉框
  # Fill out the Source of Wizard Powers Field
  if person['source'] == 'wand':
    pyautogui.typewrite(['down','\t'])
  elif person['source'] == 'crystal':
    pyautogui.typewrite(['down','down','\t'])
  elif person['source'] == 'woold':
    pyautogui.typewrite(['down','down','down','\t'])
  elif person['source'] == 'ball':
    pyautogui.typewrite(['down','down','down','down','\t'])
  # 处理单选按钮
  # Fill out the RoboCop field
  if person['robocop'] == 1:
    pyautogui.typewrite([' ','\t'])
  elif person['robocop'] == 2:
    pyautogui.typewrite(['right','\t'])
  elif person['robocop'] == 3:
    pyautogui.typewrite(['right','right','\t'])
  elif person['robocop'] == 4:
    pyautogui.typewrite(['right','right','right','\t'])
  elif person['robocop'] == 5:
    pyautogui.typewrite(['right','right','right','right','\t'])
  # Fill out the Additional Comments field.
  pyautogui.typewrite(person['comments']+'\t')
  # Click Submit.
  pyautogui.press('enter')
  # Wait until form page has loaded.
  print('Clicked submit.')
  time.sleep(5)
  # Click the Submit another response link.
  pyautogui.click(submitAnotherLink[0],submitAnotherLink[1])

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python处理cookie详解
Feb 07 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
May 24 Python
Python微信公众号开发平台
Jan 25 Python
Python递归实现汉诺塔算法示例
Mar 19 Python
Python基于socket模块实现UDP通信功能示例
Apr 10 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
dpn网络的pytorch实现方式
Jan 14 Python
Django DRF APIView源码运行流程详解
Aug 17 Python
利用Python实现Json序列化库的方法步骤
Sep 09 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 Python
Python 内存管理机制全面分析
Jan 16 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
Sep 04 #Python
selenium+python实现自动化登录的方法
Sep 04 #Python
python使用scrapy发送post请求的坑
Sep 04 #Python
解决win64 Python下安装PIL出错问题(图解)
Sep 03 #Python
Python全局变量与局部变量区别及用法分析
Sep 03 #Python
Python wxPython库Core组件BoxSizer用法示例
Sep 03 #Python
深入浅析Python中list的复制及深拷贝与浅拷贝
Sep 03 #Python
You might like
php 高性能书写
2010/12/11 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
php 在线导入mysql大数据程序
2015/06/11 PHP
ThinkPHP函数详解之M方法和R方法
2015/09/10 PHP
Yii2 assets清除缓存的方法
2016/05/16 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
javascript 手动给表增加数据的小例子
2013/07/10 Javascript
JQuery中基础过滤选择器用法实例分析
2015/05/18 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
javascript实现二叉树遍历的代码
2017/06/08 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
python中@contextmanager实例用法
2021/02/07 Python
css3给背景图片加颜色遮罩的方法
2019/11/05 HTML / CSS
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
幼儿园家长会邀请函
2014/01/15 职场文书
运动会跳远加油稿
2014/02/20 职场文书
淘宝店策划方案
2014/06/07 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
就业证明函
2015/06/17 职场文书
运动会报道稿大全
2015/07/23 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
python基础之函数的定义和调用
2021/10/24 Python
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle