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 time模块详解(常用函数实例讲解,非常好)
Apr 24 Python
浅谈python中的实例方法、类方法和静态方法
Feb 17 Python
Python3 socket同步通信简单示例
Jun 07 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 Python
Python3基于sax解析xml操作示例
May 22 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
python 去除二维数组/二维列表中的重复行方法
Jan 23 Python
django之自定义软删除Model的方法
Aug 14 Python
python使用多线程编写tcp客户端程序
Sep 02 Python
Python动态声明变量赋值代码实例
Dec 30 Python
django项目中使用云片网发送短信验证码的实现
Jan 19 Python
Python3+Appium安装及Appium模拟微信登录方法详解
Feb 16 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
用户的详细注册和判断
2006/10/09 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
javascript 操作文件 实现方法小结
2009/07/02 Javascript
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
原生小程序封装跑马灯效果
2020/10/21 Javascript
python mysqldb连接数据库
2009/03/16 Python
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
Django中login_required装饰器的深入介绍
2017/11/24 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
python3实现高效的端口扫描
2019/08/31 Python
Django框架反向解析操作详解
2019/11/28 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
python将unicode和str互相转化的实现
2020/05/11 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
如何Tkinter模块编写Python图形界面
2020/10/14 Python
python3 os进行嵌套操作的实例讲解
2020/11/19 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
Hunkemöller西班牙:欧洲最大的内衣连锁店
2018/08/15 全球购物
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
Linux的文件类型
2012/03/07 面试题
师范生实习个人的自我评价
2013/09/28 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
农村文化建设标语
2014/10/07 职场文书
vmware虚拟机打不开vmx文件怎么办 ?vmware虚拟机vmx文件打开方法
2022/04/08 数码科技