Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解


Posted in Python onSeptember 04, 2018

本文实例讲述了Python PyAutoGUI模块控制鼠标和键盘实现自动化任务。分享给大家供大家参考,具体如下:

PyAutoGUI是用Python写的一个模块,使用它可以控制鼠标和键盘。

利用它可以实现自动化任务,再也不用担心有重复枯燥的任务了。

pyautogui模块的功能:

  • 移动鼠标、点击左右键和滚轮
  • 发送虚拟按键

# 安装pyautogui

这个模块支持Windows, Mac OS X 和 Linux。

根据系统不同,你可能需要安装一些依赖。

Linux系统(Debian系列):

$ sudo apt-get install python3-pip
$ sudo pip3 install python3-xlib
$ sudo apt-get install scrot
$ sudo apt-get install python3-tk
$ and sudo apt-get install python3-dev

Scrot是pyautogui使用的截图工具。

Mac OS X:

$ sudo pip3 install pyobjc-framework-Quartz
$ sudo pip3 install pyobjc-core
$ sudo pip3 install pyobjc
$ sudo pip3 install pillow

OS X上的Python3可以通过brewhome或port安装。

Windows系统不用安装依赖。

安装完依赖之后,安装pyautogui:

$ sudo pip3 install pyautogui
# Windows
pip install pyautogui

导入模块测试:

import pyautogui

# 准备

Python移动鼠标、点击键盘非常快,有可以导致其他应用出现问题。如果出现了问题,而鼠标还一直瞎晃,在这种情况下,你很难点击窗口退出程序。

两种解决方法:

#1 pyautogui的暂停和Fail-Safe

你可以告诉你的Python脚本在每执行一个函数后暂停几秒钟,这样你就有了几秒种的控制权。

import pyautogui
pyautogui.PAUSE = 1.5

fail-safe:当鼠标移动到屏幕的左上角时触法PyAutoGUI的FailSafeException异常。你可以使用try except语句处理异常,或直接让脚本异常退出。如果你想终止程序,只要你快速的把鼠标移动到屏幕左上角就可以了。

import pyautogui
pyautogui.FAILSAFE = True

#2 注销系统

这个方法比较粗暴直接,不建议使用。Windows和Linux的快捷键是:Ctrl?Alt?Del;Mac OS X的快捷键是Command?Shift?Option-Q。

# 移动鼠标

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

1366×768分辨率:

 Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解

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

import pyautogui
pyautogui.size()
# (1366, 768)
width, height = pyautogui.size()

Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解 

Ok,现在我们得到了屏幕的分辨率,下面我们来控制鼠标移动。

moveTo函数,绝对坐标。(block.py):

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)

执行:

$ python3 block.py

上面代码让鼠标顺时针移动,并划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')
  • x,y是要点击的位置,默认是鼠标当前位置
  • button是要点击的按键,有三个可选值:‘left', ‘middle',  ‘right'。

要在当前位置点击右键:

import pyautogui
pyautogui.click(button='right')

要在指定位置点击左键:

import pyautogui
pyautogui.click(100, 100)

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

其他函数:

  • pyautogui.doubleClick():鼠标双击,其实就是执行两次click()函数。
  • pyautogui.rightClick():右击
  • pyautogui.middleClick():中击

鼠标拖拽

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

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

使用它你可以在简单的画图程序中绘制复杂的图形。

Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解

滚轮

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

pyautogui.scroll(200)

# 定位某个按钮的位置

pyautogui有截屏功能。你可能会疑惑,它怎么还带截屏?

假如你有一个按钮要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)

locateAllOnScreen():找到所有匹配的位置坐标。

# 键盘按键

前面是鼠标相关,下面我们看看键盘。

输入字符串

pyautogui.typewrite()

import pyautogui
pyautogui.click(100, 100)
pyautogui.typewrite('Hello world!')

Python 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, 和 SCROLL LOCK 键
‘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')

Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解

按键的按下和释放

和鼠标按键非常类似。

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

alt+F4:

pyautogui.keyDown('altleft');
pyautogui.press('f4');
pyautogui.keyUp('altleft')

也可以直接使用热键函数:

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

关于PyAutoGUI的介绍就到这里,如果你使用它做了什么好玩的自动化脚本,欢迎留言。

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

Python 相关文章推荐
python使用urllib2模块获取gravatar头像实例
Dec 18 Python
python里将list中元素依次向前移动一位
Sep 12 Python
跟老齐学Python之眼花缭乱的运算符
Sep 14 Python
python计算方程式根的方法
May 07 Python
PyQt5每天必学之事件与信号
Apr 20 Python
python之cv2与图像的载入、显示和保存实例
Dec 05 Python
使用Django连接Mysql数据库步骤
Jan 15 Python
Python3实现的反转单链表算法示例
Mar 08 Python
Python之指数与E记法的区别详解
Nov 21 Python
Python PyPDF2模块安装使用解析
Jan 19 Python
Django DRF APIView源码运行流程详解
Aug 17 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
Aug 27 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
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 #Python
You might like
PHP SQLite类
2009/05/07 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
Python使用sort和class实现的多级排序功能示例
2018/08/15 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
用python生成与调用cntk模型代码演示方法
2019/08/26 Python
python手机号前7位归属地爬虫代码实例
2020/03/31 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
Python常用外部指令执行代码实例
2020/11/05 Python
举例讲解Python装饰器
2020/12/24 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
曼城官方网上商店:Manchester City
2019/09/10 全球购物
空指针到底是什么
2012/08/07 面试题
加工操作管理制度
2014/01/19 职场文书
信息合作协议书
2014/10/09 职场文书
个人年度总结报告
2015/03/09 职场文书
首次购房证明
2015/06/19 职场文书
instantclient客户端 连接oracle数据库
2022/04/26 Oracle