首页 网站首页 商业资讯 操作 查看内容

Python自动操作GUI神器PyAutoGUI

私域流量网 操作 2023-4-4 13:18 7496人围观

本文共3500余字,估计阅读时候12分钟,本文知乎毗连:Python自动操纵GUI神器PyAutoGUI,本文同步公布于silaoA的博客和微信公众号平台。 关注进修领会更多的Cygwin、Linux、Python技术。

平常利用计较机,号令行法式可以说是为批量操纵文件而生,但作为普通用户,最多的还是经过鼠标键盘操纵五花八门的图形界面法式。试想下面一个场景:有不计其数个文件,都需要经过图形界面停止一样的一套编辑、保存工作,靠手工一遍一遍地反复做,累死人不说,时候久了必定出现毛病,作为法式猿,怎样能忍反复3次以上的工作,必须操纵法式自动化。要想图形界面也能像号令行法式那样切确控制,就需要GUI自动化工具了。不能不赞Python生态之丰富,GUI自动化自动化工具也有多种库可选,比如Windows平台的pywin32,以及本文配角——跨平台的PyAutoGUI

目 录

  • 0x00 PyAutoGUI简介
  • 0x01 PyAutoGUI利用入门
    • 安装
    • 快速上手
      • 1. 通勤奋用
      • 2. 鼠标控制
      • 3. 键盘控制
      • 4. 消息窗口
      • 5. 截图相关
  • 0x02 使命示例
  • 参考
  • 更多阅读

0x00 PyAutoGUI简介

pywin32间接包装了几近一切的Windows API,可以方便地从Python间接挪用,把Windows API依照功用分了一些大类,每一个大类作为一个模块,常见如win32apiwin32guiwin32com等,其中win32com利用微软独门的COM接口技术停止进程间通讯,可以实现控制GUI法式。但条件是,这些法式得支持COM接口。win32api则加倍原始,完全经过Win32 API挪用获得/天生窗口句柄、发送消息事务,非常烦琐。

PyAutoGUI的思绪与此完全分歧,它是接收了鼠标、键盘利用权,根基上完全照搬人的操纵,底层不必套牢在Windows系统,没错,它是跨平台的。官网地址:https://github.com/asweigart/pyautogui。原本,这类GUI自动化工具的初衷是给GUI法式自动化测试用,发生点击鼠标、敲击键盘的行为,在日志中记录下消息事务和GUI法式的响应成果,事后分析GUI法式能够存在的bug。不外,既然能发生点击鼠标、敲击键盘的行为,我们便可以用来控制GUI法式批量完成文件编辑、保存工作。

依照官方的说法,PyAutoGUI给人类用的GUI自动化神器,简单高效、函数分类清楚,它被awesome-python、awesome-python-cn收录。

0x01 PyAutoGUI利用入门

安装

保举经过pip安装,一行号令搞定。

python -m pip install -U pyautogui

PyAutoGUI依靠于pyscreezepymsgboxpytweening,上述号令会自动安装这3个库。安装完成后可以发现,在site-packages\pyautogui有6个文件,名字带java、osx、win、x11的是在分歧平台的实现计划,再在__init__.py__main__.py中检测当前系统平台停止封装。其中,java平台的实现文件为空,猜测是未来计划支持的,先占个坑。

__init__.py
__main__.py
_pyautogui_java.py # 空文件,猜测是未来支持
_pyautogui_osx.py
_pyautogui_win.py
_pyautogui_x11.py

快速上手

PyAutoGUI设想简洁,相关标记经过内部import以后,被封装在pyautogui单个模块中,是以Python法式中只要import pyautogui以后即可经过.标记拜候pyautogui中的函数、变量。pyautogui中函数大致分为通勤奋用、鼠标控制、键盘控制、消息窗口、截图5大类。

1. 通勤奋用

In [1]: import pyautogui

In [2]: pyautogui.size() # 获得屏幕尺寸(分辨率×分辨率)
Out[2]: Size(width=1920, height=1080)

In [3]: pyautogui.position() # 获得鼠标当前位置
Out[3]: Point(x=846, y=437)

In [4]: pyautogui.onScreen(100,200) # 判定坐标能否在屏幕范围内
Out[4]: True

In [5]: pyautogui.onScreen(100,2000) # 判定坐标能否在屏幕范围内
Out[5]: False

坐标系统相当重要,后续鼠标位置、图片巨细都按照这套系统界说。PyAutoGUI相沿了传统的坐标系统,并未重新界说,以下图所示。x的取值范围是[0, 宽度分辨率-1],y的取值范围是[0, 高度分辨率-1]。




屏幕坐标系统

2. 鼠标控制

鼠标移动,包括绝对位置移动和相对位置移动。

In [7]: sizex,sizey=pyautogui.size() # 保存屏幕尺寸

# 绝对位置移动,移动至屏幕正中心,鼠标移动过渡时候duration设为1秒
In [9]: pyautogui.moveTo(sizex/2,sizey/2,duration=1)

# 相对位置移动,向右100、向上200,鼠标移动过渡时候duration设为0.5秒
In [10]: pyautogui.moveRel(100, -200, duration=0.5)

鼠标点击,一个click()函数把点鼠标的活包干,进程也可分化为mouseDown()mouseUp();还有在click()之上封装的rightClick()middleClick()doubleClick()tripleClick()等函数。鼠标点击之前答应指定要移动的方针位置,若方针位置不在运转当前Python法式的终端/IDE范围内,则能够对其他GUI法式触发鼠标点击事务,从而引发其响应,即焦点移动至其他GUI法式。

# 移动至屏幕中心点击一下左键,过渡时候0.5秒
In [16]: pyautogui.click(sizex/2,sizey/2, duration=0.5)

# 不指定x、y,在当前位置点击一下右键
In [17]: pyautogui.click(button='right')

# 移动至(100,100)点击3次左键,点击间隔0.1s,鼠标移动过渡时候0.5秒
In [18]: pyautogui.click(100,100, clicks=3,interval=0.1,duration=0.5)

# 移动至(100,100)点击2次右键,点击间隔0.5s,鼠标移动过渡时候0.2秒
In [19]: pyautogui.click(100,100, clicks=2,interval=0.5,button='right',duration=0.2)

转动鼠标滚轮。

# 鼠标位置不动,向上回滚2个单元,项目文档对转动量参数说明不详
In [22]: pyautogui.scroll(2)

# 鼠标移动至(1000,700),前下转动10个单元
# 运转发现鼠标并没有动
In [26]: pyautogui.scroll(-10,1000,700)

鼠标拖曳,指从当前位置按下鼠标,移动至方针位置再开释的进程,指定方针位置一样有绝对位置和相对位置两种方式,和移动鼠标函数很像。别的,试用下来,未发现drag()函数和dragRel()的差别。

# 将鼠标从当前位置拖至屏幕中心,默许左键
In [32]: pyautogui.dragTo(sizex/2,sizey/2)

# 将鼠标从当前位置向左100像素、向右200像素拖动,过渡时候0.5秒,指定右键
In [33]: pyautogui.dragRel(-100,200,duration=0.5,button='right')

3. 键盘控制

控制按键,也是一个press()函数根基把活包干,按键行动往细分化包括keyDown()keyUp()两个进程;在此根本上封装,有typewrite()hotkey()两个高阶一点的函数,别离用于输入字符串和按快速键。

# 键名用字符串暗示,支持的一切键名,存在pyautogui.KEYBOARD_KEYS变量中,包括26个字母、数字、标记、F1~F20、偏向等等一切按键
In [4]: pyautogui.press('a') # 按字母A键,字母支持巨细写

# 法式向终端输入了字符a,若法式运转时输入法为中文状态,由于没有继续输入空格或回车,输入法仅列出候选字,并不会输入到终端
In [5]: a

# 传入键名列表(按键p、按键y、空格),按键之间间隔0.1秒(默许0)
In [6]: pyautogui.press(['p','y','space'], interval=0.1)

# 运转前将输入法切换到中文状态,往终端间接输入了“培育”
In [7]: 培育

# typewrite方式一:传入字符串,不支持中笔墨符,由于函数没法晓得输入法需要什么按键才能获得中笔墨符
In [9]: pyautogui.typewrite('hello, PyAutoGUI!\n')

# 法式把字符串"'hello, PyAutoGUI!"和换行符输入到了终端
In [10]: hello, PyAutoGUI!
...:

# typewrite方式二:传入键名列表,按键之间间隔0.1秒(默许0)
In [11]: pyautogui.typewrite(['s','r','f','space'], interval=0.1)

# 运转前将输入法切换到中文状态,往终端间接输入了“输入法”3个字
In [12]: 输入法

# 巨细写字母是自动支持的,照旧尝试一次切换到大写
In [13]: pyautogui.typewrite(['capslock','p','y'])

# CapsLock按键灯被点亮,法式往终端输入了"PY"
In [14]: PY

# hotkey屏障了需要频频keyDown、keyUp的细节,参数是肆意个键名,而非列表
In [18]: pyautogui.hotkey('ctrl', 'shift', 'esc') #调出使命治理

In [19]:pyautogui.hotkey('alt','ctrl','delete') # 并未调出重启界面

4. 消息窗口

PyAutoGUI操纵pymsgbox的功用,以JavaScript气概函数供给消息框功用,包括alert()confirm()prompt()password(),连参数都是分歧的,熟悉JavaScript的朋友不会陌生。

In [24]: pyautogui.alert(text='警告',title='PyAutoGUI消息框',button='OK')
Out[24]: 'OK' # 点击的按键被返回

In [28]: pyautogui.confirm(text='请挑选',title='PyAutoGUI消息框',buttons=['1','2'
...: ,'3'])
Out[28]: '2' # 点击的按键被返回

In [30]: pyautogui.prompt(text='请输入',title='PyAutoGUI消息框',default='请输入')
Out[30]: 'input by 伪码人' # 点OK按钮后返回输入内容

In [32]: pyautogui.password(text='输入密码',title='PyAutoGUI消息框',default='',mask='*')
Out[32]: 'We_Coder' # 点OK按钮后返回输入内容


PyAutoGUI的4种消息框

5. 截图相关

PyAutoGUI供给了screenshot()函数停止屏幕截图,返回是Image工具,这是在Pillow库中界说的,是以需要安装Pillow库才能一般工作。

# imageFilename参数,截图要保存的文件全途径名,默许`None`,不保存;
# region参数,截图地区,由左上角坐标、宽度、高度4个值肯定,假如指定地区超越了屏幕范围,超越部分会被黑色添补,默许`None`,截全屏
In [41]: pyautogui.screenshot('shot.png',region=(1000,600,600,400))
Out[41]: <PIL.Image.Image image mode=RGB size=600x400 at 0x20C87497390>


PyAutoGUI截图600×400

PyAutoGUI还有个图片婚配功用,它是在屏幕按像素婚配,定位图片在屏幕上的坐标位置,locateOnScreen()函数返回region工具,即左上角坐标、宽度、高度4个值组成的元组,再用center()函数计较出中心坐标,locateCenterOnScreen()函数则一步到位,返回中心坐标。假如把需要点击的菜单、按钮事前保存成图片,可以用来自动查找菜单、按钮位置,再交由click()函数控制鼠标去点击。

loc = pyautogui.locateCenterOnScreen("icon_xx.png", region=(0, 0,sizex/2, sizey/10) ) # region参数限制查找范围,加速查找速度
pyautogui.moveTo(*loc, duration=0.5) # 移动鼠标
pyautogui.click(clicks=1) #点击

0x02 使命示例

前文只是PyAutoGUI相关函数的说明,要真正熟悉它,必须连系具体使命。现有这样一个使命,不计其数个CAD图散布在几十个文件夹中,需要对每个图停止编辑操纵,借使这个操纵就是简单扭转下视角,再保存。AutoCAD法式自己是有剧本功用的,是以可以操纵AutoCAD来完本钱使命,综合斟酌以下缘由促使我转向PyAutoGUI的线路上来:

  1. AutoCAD是贸易软件,本人希望尽能够地削减对贸易软件的依靠;
  2. AutoCAD的剧本功用非常有限,没有循环,难以顺应如此大都量的文件操纵,而且去熟悉AutoCAD剧本能够比PyAutoGUI更花时候;
  3. 操纵PyAutoGUI熟悉GUI控制后,可以套在此外GUI法式上,未来仍有益用代价,假如利用AutoCAD则始终被限制在AutoCAD的操纵范围内,代价低,而且与第一条相悖。

决议走PyAutoGUI的线路,做了以下工作:

  1. 找到另一个轻量看图软件,支持简单的编辑功用,恰好包括扭转视角;
  2. 手工操纵键盘鼠标,操纵这个看图软件完成1个文件的编辑、保存流程
  3. 将触及操纵的菜单、按钮等截图保存起来备用,将上述流程代码化,落地功效就是1个操纵函数;
  4. 由于看图软件应需要时候,移动、点击鼠标等操纵的过渡时候需要调试肯定;
  5. 完成1个文件的操纵流程后,在主函数编写文件婚配、循环等功用,在循环中挪用操纵函数,早期只拿10个文件批量操纵,调试无误后,主函数的文件婚配点窜成全部文件夹,包括不计其数个文件。

操纵函数代码。

import os
import pyautogui as pag

__sizex__, __sizey__ = pag.size() #获得屏幕尺寸

def cad_turn(cad_file, outd):
'''
cad_file : 要操纵的CAD文件
outd : 文件输前路子
'''

c = pag.locateCenterOnScreen(__icon_open__, region=(0,0,__sizex__/10,__sizey__/20) ) # 翻开图标,图标事前截图保存
pag.moveTo(*c, duration=0.05)
pag.click( button="left") # 点击翻开按钮

pag.moveRel(__sizex__/4, __sizey__/4) # 确保文件翻开窗口获得焦点
pag.typewrite(message=cad_file,interval=0.1) # 输入文件途径
pag.press('enter')

c = pag.locateCenterOnScreen(__icon_view__, region=(__sizex__/4, 0,__sizex__/2, __sizey__/10) ) # 扭转视图图标
pag.moveTo(*c, duration=2)
pag.click(clicks=7, interval=1, button="left") # 点击扭转视角按钮

c = pag.locateCenterOnScreen(__icon_saveas__, region=(0, 0, __sizex__/10, __sizey__/20) ) # 另存为图标
pag.moveTo(*c, duration=0.2)
pag.click( button="left") # 点击另存为按钮

pag.moveRel(__sizex__/4, __sizey__/4) # 确保文件翻开窗口获得焦点
pag.typewrite(message=os.path.join(out, fbase+'-se'), interval=0.1) # 输入保存途径
pag.press('enter')

# 封闭一切能够存在的窗口,避免占用太多内存
while( True ):
try :
pag.moveTo(__sizex__/2, __sizey__/2, duration=0.3) # 延时
c = pag.locateCenterOnScreen(__icon_close__, region=(__sizex__/5, 0, __sizex__*3/5, __sizey__/20) )
pag.moveTo(*c, duration=0.1) # 移到“x”按钮
pag.click( button="left") # 点击“x”按钮
except TypeError:
break

主函数代码。

if __name__ == "__main__":
p = r'x/y/z/CAD文件地点途径'
cad_src = glob_file_list( p, r"*.DXF") # 婚配出要操纵的文件
total = len(cad_src)
if(total == 0):
print('无文件需处置,退出...')
try:
for idx,x in enumerate(cad_src, start=1):
print("[{}/{}] 处置{}...".format(idx, total, x))
cad_turn(x, "out")
except Exception as e:
print("毛病:{}".format(e))

开启看图软件,输入法切换到英文状态,再运转Python法式,结果见视频。

参考

  • https://github.com/asweigart/pyautogui
  • https://github.com/mhammond/pywin32
  • https://github.com/vinta/awesome-python
  • https://github.com/jobbole/awesome-python-cn

更多阅读

  • 前一篇 Python操纵Excel文件(3):文雅干将openxlpy
  • 伪码人专栏目录导航(延续更新...)
  • Cygwin系列(九):Cygwin进修线路
  • 微软WSL——Linux桌面版未来之光
  • GNU Wget 爬虫?试一试
  • silaoA的博客.https://silaoa.github.io

如本文对你有帮助,或内容引发极端舒适,接待分享转发与留言交换





►本文为原创文章,如需转载请私信知乎账号silaoA或联系公众号伪码人(We_Coder)。

最初,好书保举。

高端人脉微信群

高端人脉微信群

人脉=钱脉,我们相信天下没有聚不拢的人脉,扫码进群找到你所需的人脉,对接你所需的资源。

商业合作微信

商业合作微信

本站创始人微信,13年互联网营销经验,擅长引流裂变、商业模式、私域流量,高端人脉资源丰富。

我有话说......
  • 贺老师 2023-4-4 13:31
    要截图位置不发生变化,很快就可以找到。不管有没有截图的,都会去点击的。[潜水],不知道是不是我设置错误
  • 新百胜微信多少 2023-4-4 13:30
    一样啊,弹窗什么特征,把弹窗共性部分截图存起来,运行起来以后靠pyautogui去查找看有没有。这和查找按钮是一样的。
  • 无人岛屿颈 2023-4-4 13:30
    如何判断是否有弹窗,部分有弹窗,部分没有。不清楚咋个去判断了。谢谢[酷]
  • 鸿晟信合研究院 2023-4-4 13:29
    可以。思路是先运行一次,弹框出来后,把按钮截图存起来,代码里用pyautogui查找按钮中心,再去点击这个位置。本文里边有示例代码。
  • sy-yun 2023-4-4 13:28
    请问有办法实现以下功能吗,有一个程序弹出一个框,需要去点击框上的某个按钮,但是框弹出的位置在屏幕上并不固定。谢谢。
  • 美团无货源创业 2023-4-4 13:27
    我另外看到一个补丁式的办法:使用pyperclip库,先copy想要输入的内容到剪贴板,再控制按键Ctrl+V,把内容粘贴出来。pyperclip的作者,同时也是pyautogui的作者,https://github.com/asweigart 。

查看全部评论>>

相关推荐

国产操作系统发布:手机、电脑应用都能兼容

国产操作系统发布:手机、电脑应用都能兼容

近日深度操作系统官方宣布,国产操作系统deepin 20.6版本正式上线,新版本升级了Stabl

键盘操作方法大全

键盘操作方法大全

【键盘操作方法大全】键盘可不仅仅能帮我们打字哦,还有很多快捷的操作你都知道吗?除

电脑的一些基本常识和操作

电脑的一些基本常识和操作

关于电脑的一些基本常识和操作(电脑初学者必备)  众所周知,在21世纪的今天,电脑

操作系统实验一到实验九合集(哈工大李治军)

操作系统实验一到实验九合集(哈工大李治军)

知乎Markdown适配不行,希望在我的博客中查看文章作者寄语操作系统实验的学习是一个循

看完这篇Linux基本的操作就会了

看完这篇Linux基本的操作就会了

前言只有光头才能变强这个学期开了Linux的课程了,授课的老师也是比较负责任的一位。

搞懂软考,看这一篇就够了

搞懂软考,看这一篇就够了

大家好,我是你们的新朋友叨叨张,很高兴能够在这里和大家相遇,今天我要分享的主题是

0基础入门Photoshop基础操作(一)

0基础入门Photoshop基础操作(一)

大家好我是正经人你以为上来就要教封面上那个效果吗?当然不是,那个是我好几年前做的

从操作系统的进化中,读懂MagicOS

从操作系统的进化中,读懂MagicOS

操作系统的数十年沉浮1946年诞生第一台计算机时,还没有操作系统。程序员靠着「打孔」

还不会使用 GitHub ? GitHub 教程来了!万字图文详解

还不会使用 GitHub ? GitHub 教程来了!万字图文详解

在编程届有个共识,想要成为一个合格的程序员必须要掌握 GitHub 的用法!接下来,我们

Git使用教程,最详细,最傻瓜,最浅显,真正手把手教

Git使用教程,最详细,最傻瓜,最浅显,真正手把手教

(预警:因为详细,所以行文有些长,新手边看边操作效果出乎你的预料)一:Git是什么

Win10系统常用的快捷键(绝对很详细)

Win10系统常用的快捷键(绝对很详细)

前言介绍快捷键,也就是刷刷按几下键盘上的组合键就可以达到鼠标点很多下才能实现的效

上海医保转入杭州- “浙里办”简易操作

上海医保转入杭州- “浙里办”简易操作

我在上篇文章说过,上海医保需要社保(即养老保险)成功转入杭州后才能进行转移,申请

史上最全高中化学实验总结(操作+方法)

史上最全高中化学实验总结(操作+方法)

高中化学实验真复杂,包学习APP为你整理最全总结,不怕记不住!一、中学化学实验操作

大学四年自学走来,关于怎么学「操作系统」和「计算机网络 ... ...

大学四年自学走来,关于怎么学「操作系统」和「计算机网络 ... .

最近收到不少读者留言,关于怎么学「操作系统」和「计算机网络」的留言,小林写这一块

用这6款软件记笔记,不要太爽!丨上进青年研习社

用这6款软件记笔记,不要太爽!丨上进青年研习社

文/小渔俗话说:“好记性不如烂笔头。”在无纸时代,记笔记当然也不一定要用烂笔头了

8个流氓软件,这辈子是不可能安装的。

8个流氓软件,这辈子是不可能安装的。

之前安利过不少值得安装或使用的软件,但这一次我想换个角度,写一些强烈不建议安装的

KMS服务,一句命令激活windows/office!

KMS服务,一句命令激活windows/office!

服务器地址:http://kms.03k.org(点击检查是否可用);服务作用:在线激活windows和off

Windows10 快速启动

Windows10 快速启动

从Windows8开始,Windows的开机速度有了极大的提高,这得益于一项新的功能:快速启动

最后教一次:完美解决电脑上的流氓软件

最后教一次:完美解决电脑上的流氓软件

国产流氓软件之所以流氓就流氓在 “ 买一赠N ”装一个软件,就会给你附赠N个流氓软件

推荐10个超好玩的网站,一打开就停不下来!

推荐10个超好玩的网站,一打开就停不下来!

推荐10个超好玩的网站,窥探别人的记忆,敲键盘听歌,办公偷懒神器,看中国古今妖怪…

电话咨询: 15924191378
添加微信