PyAutoGUI模块很全详解

PyAutoGUI模块是Python专属的图形用户界面自动化的技术(简称GUI自动化)的模块,全自动控制您的键盘、鼠标,让重复工作更轻松!各种GUI属性、信息轻松获取。

文档结尾有我的使用经历。本文虽由小盆友制作,但制作精良。

先跟大家说一下,我最近在忙C++和CSP比赛的事情,导致更新慢,非常抱歉。

注意:实用性考虑,本文主要面向Windows系统,macOS、Linus系统的我还不太了解,粉丝破百后我考虑更新一下。

安装

安装方式很简单,直接使用pip安装即可:

pip install pyautogui

使用清华源安装PyAutoGUI模块(加速安装):

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyautogui

本文绝大部分代码都将模块导入部分删去了,请在你的代码中加入如下代码导入PyAutoGUI模块:

import pyautogui

暂停和自动防故障装置、注销

如果你的程序出现错误,例如写错了一个坐标、流氓软件弹出了个窗口,且无法使用键盘或鼠标关闭程序。请在(默认为)0.1秒(根据你的pyautogui.PAUSE参数设置的数字)内快速将鼠标移动到屏幕的四个角落之一。如果你将pyautogui.FAILSAFE设置为False,以上防故障装置会关闭,该方法失效,现在唯一的方法是——注销。Windows操作系统按Ctrl+Alt+Delete屏幕就会变黑,此时程序无法控制鼠标键盘,单击中间的注销按钮即可注销。(注销操作会关闭计算机中的所有程序,建议在注销前保存工作并关闭所有应用程序)

坐标的概念

屏幕的最左边的最上边(左上角)的坐标是(0,0),向右x坐标递增,向左x坐标递减,向下y坐标递增,向上y坐标递减。屏幕坐标没有负数,都是正整数。

获取屏幕分辨率

建议在代码开头检测屏幕分辨率,若分辨率与你想要的分辨率不一样,就弹出警告窗口等防止代码运行时出现问题。

wh = pyautogui.size() # 返回一个Size对象,比如:Size(width=1920, height=1080)
print(wh[0]) # 输出x坐标
print(wh[1]) # 输出y坐标
print(wh.width) # 输出x坐标
print(wh.height) # 输出y坐标

获取鼠标指针位置

p = pyautogui.position() # 返回Point对象,比如:Point(x=500, y=500)
print(p[0]) # 输出x坐标
print(p[1]) # 输出y坐标
print(p.x) # 输出x坐标
print(p.y) # 输出y坐标

鼠标指针交互

移动鼠标指针

相对于当前位置移动鼠标指针(x、y为整数,正数负数都可以)。其中duration参数是可选的,它表示鼠标移动到这个位置所需要的时间,默认为0,可以为正浮点数或正整数,单位为秒(s)。

pyautogui.move(x, y, duration=time)

用屏幕坐标移动鼠标指针,在move函数后面加上To就是moveTo函数。duration参数与move函数一样

pyautogui.moveTo(x, y, duration=time)

单击/双击鼠标

这个功能有很多效果一样的代码,大家可以根据自己的喜好选择。

左键单击

pyautogui.click(x, y)
pyautogui.click(x, y, button='left')

左键双击

pyautogui.doubleClick(x, y)

右键单击

pyautogui.click(x, y, button='right')
pyautogui.rightClick(x, y)

中键单击

pyautogui.click(x, y, button='middle')
pyautogui.middleClick(x, y)

拖动鼠标

其参数和click函数差不多,这里不在多叙述。

pyautogui.drag(x, y, duration=time) # 相对于当前位置拖动鼠标指针
pyautogui.dragTo(x, y, duration=time) # 用屏幕坐标拖动鼠标指针

滚动鼠标

向scroll函数传入的参数如果是正整数,表示向上滚动。反之向下滚动。

pyautogui.scroll(number)

MouseInfo

MouseInfo是一个应用程序,它是PyAutoGUI的一部分。它方便了你开发与鼠标相关的程序,很实用。缺点是全英文,但应该没人看不懂吧。。。

翻译(没图片,大家凑合着看,注意,这个翻译是自己翻译的,稍有改动以便理解):

复制 日志 帮助
————————————————————————————
3秒,按钮延迟  复制所有(F1) 将所有保存在日志文件内(F5)
XY坐标 2678,1172 复制XY坐标(F2) 将XY坐标保存在日志文件内(F6)
RGB颜色 90,0,0 复制RGB颜色(F3) 将RGB颜色保存在日志文件内(F7)
十六进制(H)RGB颜色 #5A0000 复制十六进制RGB颜色(F4) 将十六进制RGB颜色保存在日志文件内(F8)
颜色 <颜色>
XY 原点 0,0
<日志文件内容>
日志文件地址 保存日志文件
屏幕截图文件地址 截取整个屏幕并保存屏幕截图文件
屏幕文件保存于<屏幕截图文件地址>

打开代码如下:(建议使用交互式环境)

pyautogui.mouseInfo()

他的窗口看起来像这样:

670e1f48fe2a4eb7a14553b221a75fe9.png

建议

在开发过程中,建议不要通过屏幕坐标操作,最好使用图像识别,代码如下:

try:

    image = pyautogui.locateOnScreen("你的图片路径.png")

except:

    print("错误:未找到该图像")

但这样做有很大的缺陷,一旦修改屏幕分辨率就90%会失败,或者稍微动一个像素就会导致失败。

获取窗口信息

什么是活动窗口?

当前处于前台且接受键盘输入的窗口。比如说你现在在用的浏览器的窗口。

以下代码可获取活动窗口并输出窗口标题:

fw = pyautogui.getActiveWindow()

# fw是一个Win32Window对象

print(fw.title) # 打印窗口标题

该对象的所有属性:

第一列为Win32Window对象的属性,用空格隔开。

第二列为该属性的描述。

left right top bottom窗口边的x或y坐标
topleft topright bottomleft bottomright两个整数的命名元组,表示窗口角的xy坐标
midleft midright midleft midright两个整数命名的元组,表示窗口边中间的xy坐标
width height表示窗口的一个维度,单位为像素
size两个整数的命名元组,表示窗口的宽度和高度
area一个整数,表示窗口的面积,以像素为单位
center两个整数的命名元组,表示窗口的中心xy坐标
centerx centery一个整数,表示窗口中心的x或y坐标
box4个整数的命名元组,表示窗口的左侧、顶部、宽度、高度
title窗口顶部标题栏中的文本字符串

操纵窗口

我们可以通过修改这些属性来操纵窗口,如:

fw.width = 1000

也可以发现或更改窗口的最大化,最小化和激活状态。

以下返回布尔值:

fw.isMaximized#是否最大化
fw.isMinimized#是否最小化
fw.isActive#是否激活

以下方法可以更改窗口的状态:

fw.isMaximized()#最大化
fw.isMinimized()#最小化
fw.isActive()#激活

除此之外还有两个常用的函数:

fw.restore()#将窗口还原到以前的大小和位置
fw.close()#关闭一个窗口,注意使用这种方法,因为他可能会绕过要求你在退出应用程序之前保存所做工作的所有消息对话框。

获取窗口的其他方法:

pyautogui.getAllWindows():返回屏幕上所有可见窗口的window对象列表
pyautogui.getWindowsAt(x,y):返回所有包含点xy的可见窗口的Window对象列表
pyautogui.getWindowsWithTitle(title):返回所有标题栏中包含字符串title的可见窗口的window对象的列表
pyautogui.getActiveWindow():返回当前接收键盘焦点的窗口的window对象

这个模块还有pyautogui.getAlltitles()函数,该函数返回所有可见窗口的字符串列表

没用的函数,因为第一个代码其他模块早就有了,也习惯了。第二个代吗因为是在终端输出,很不美观,还不如自己写的for循环+tkinter模块的进度条好使:

pyautogui.sleep(3)#等待3秒,与time.sleep()没什么两样
pyautogui.countdown(10)#会每秒打印一个数字,相当于倒计时

写代码时和运行时请注意:


1、建议每次运行代码用相同的屏幕分辨率,这样窗口的位置就不会变,你之前的截屏也能正确识别

2、程序打开一个应用程序时建议先将其最大化,这样它的按钮等东西都在同一个地方

3、在等待加载程序的过程中,一定要加入足够的暂停时间

4、建议使用logging(存储日志)模块保存和保存程序所做的事情,这个模块个人觉得很实用,功能不是很多但很强大。5个不同级别的日志重要程度,可以保存至文件里。有需要的话我单独出一个博文讲。

5、使用

pyautogui.getWindowsWithTitle(title)

来确保你认为程序正在单击的应用程序的窗口是存在的,并使用fw.activate()方法将该窗口放在前台

6、一定要在程序中添加尽可能多的检查,万一弹出一个意外的窗口或计算机失去了网络连接,它可能会在你的电脑上到处乱点

7、如果你不按以上就运行,我建议你一定要做在椅子上,万一出事了就不好搞了。显示消息框(如果你有这方面的需求,tkinter模块是个更好的选择)

pyautogui.alert(text) # 显示文本text,并有一个确定按钮

pyautogui.confirm(text) # 显示文本text,并有确定和取消按钮,根据单击的按钮返回'ok'或'Cancel'

pyautogui.prompt(text) # 显示文本text,并有一个文本字段给用户输入,它以字符串的形式返回

pyautogui.password(text) # 与prompt()相同,但会显示“*”,这样用户可以输入敏感信息,如密码等隐私信息

他们四个还有一个可选的参数——标题,如下:

pyautogui.alert("程序执行完毕","GUI自动化程序")

当你在计算机上干重复的事情,为什么不直接扔给PyAutoGUI做?看着鼠标自己移动,看着文本自动出现在屏幕上,这是彻头彻尾的催眠。为什么不用节省下来的时间,舒舒服服地坐着,看着程序为你工作?看着你聪明才智帮你完成繁琐的工作,肯定会让你感到满意!

我的模块使用经历

我曾用过这个模块全自动登录过6个网站,但是有些网站有人机校验,无法全自动,但也能半自动了,这个模块配合这些模块最好用:

time:虽然PyAutoGUI模块也可以等待一段时间,但个人更习惯。

webbrowser:与PyAutoGUI模块相似的模块,用于浏览器上

subprocess:常用Popen方法打开应用程序或用应用程序打开文件

logging:强烈建议使用!日志记录模块

都看到这儿了,还不快关注+收藏,你要白嫖啊?那点个赞呗,谢啦。

  • 28
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值