工作中有很多重复的操作,有些可以固化成程序来完成:
有个软件因为没有激活,会定期(5分钟左右)触发关闭按钮,导致程序无法使用。如果靠人工一直去点击也是不现实的。
之前看过王者荣耀模拟器点击金币教学,固定位置的做法,虽然简单,但需要保证这个点位置在某个时间是确定的。暂时不考虑。
如果用原生语言,就连左右键、键盘输入转换码,这些基本功能都非常复杂,后来发现已融合到这个pyautogui库里:
pip install pyautogui
自动安装这个坑很多,还是去PyPI里下载好安装,有多个文件格式,安装在英文目录里,cmd运行即可;安的时候提示缺文件,还是再下载装了。
想要点击的东西,例如chrome图标,将其截图,保存在py文件目录。一定要用小写的png,今天被这个代码原文章坑了,它居然用大写
pyautogui的常用函数:
import pyautogui
x = pyautogui.locateCenterOnScreen('chrome.png', confidence=0.9)
print(x)
pyautogui.doubleClick(x)
输出结果
Point(x=262, y=465)
for pos in pyautogui.locateAllOnScreen('chrome.png', confidence=0.95):
print(pos)
x, y = pyautogui.center(pos)
print('center()', x, y)
pyautogui.click(x=x,y=y,clicks=1,button='left')
输出结果
Point(x=262, y=465)
Box(left=237, top=438, width=50, height=54)
center() 262 465
Box(left=237, top=439, width=50, height=54)
center() 262 466
Box(left=237, top=440, width=50, height=54)
center() 262 467
小例子:实现自动按计算器
x = [0]*4
x[0] = pyautogui.locateCenterOnScreen('3.png')
x[1] = pyautogui.locateCenterOnScreen('+.png')
x[2] = pyautogui.locateCenterOnScreen('4.png')
x[3] = pyautogui.locateCenterOnScreen('=.png')
print(x)
for i in range(4):
pyautogui.click(x[i])
要将计算器的各个按钮截图保存下,重点看下数组的使用;
pyautogui截图对比,除了上面的OnScreen与屏幕比,还可以跟自定义图片比,由于用不到,这里就不展开了。
在上面打开chrome程序后,可以实现其他实现的功能:延时、快捷键ctrl和t新建页面,ctrl+l定位在地址栏,输入网址,按下两次回车键,截屏保存在程序文件夹
pyautogui.PAUSE = 2
pyautogui.hotkey('ctrl', 't')
pyautogui.hotkey('ctrl', 'l')
pyautogui.typewrite("www.dangdang.com")
pyautogui.keyDown('enter')
pyautogui.keyDown('enter')
pyautogui.PAUSE = 2
im2 = pyautogui.screenshot('my_screenshot.png')
前面的问题是,如果程序在后台怎么切到前台,程序被挡了,图片对比无法正常使用…
有人推荐pywinauto,但是写的时候发现并没有这个函数…
from pywinauto.win32functions import SetForegroundWindow
这个暂时不研究了…
如果操作电脑的步骤可以很明确的写出来,而且前提是这个程序就在桌面能看到的地方在运行,那之前的pyautogui还是很方便的,类似按键精灵吧。
我想到的例子是之前登陆网页版IP摄像机进行自动对焦,如果写出来什么时候干什么事,然后再进行循环,的确可以批量完成。但是这个最好还是可以通过调用硬件接口直接去进行控制,以后研究下。
当然如果还是想通过点击来实现,上次的图片对比面临两个问题:
程序有两种类型backend:
本次重点学习的库是pywinauto
通常的单进程用Application(),罕见的跨进程Desktop()暂不考虑,比如计算器
其实这个原生的os就可以实现~u是unique的意思
import os
os.system(u"C:\\Windows\\System32\\notepad.exe")
os其他功能就不深究了,试了试都出不来,感觉是Windows不支持
pywinauto的实现方式
from pywinauto import Application
app = Application().start(r"C:\Program Files (x86)\Thunder Network\Thunder\Program\Thunder.exe")
成功打开迅雷
from pywinauto import Application
app = Application().connect(process=10276)
弊端是进程号每次重启都不固定
WIN7还是用inspect看,WIN10在任务管理器里有
app = Application().connect(handle=0x00250512)
模板里中间多了两个0,先按这样补00
弊端同上不稳定,查看只能用inspect
app = Application().connect(path=r"C:\Program Files (x86)\Thunder Network\Thunder\Program\Thunder.exe")
跟第一个打开程序很像
app = Application().connect(title_re="截屏程序.*", class_name="TMainForm")
inspect上面都有,但是不是每个控件都有这些信息,要看具体看情况~
我们以截屏程序为例,在程序连接后(app),通过window选择窗体
便可按菜单进行操作,或通过快捷键进行操作
prt_sc = app.window(title='截屏程序’)
prt_sc.menu_select(r"文件->另存为")
或
prt_sc.type_keys('%TPR')
其中%代表ALT,一般像文字带括号,都是用ALT触发,例如:工具(T)笔(P)红笔(R);还可以用^代表快捷键CTRL,另存为是CTRL+S
看上去很复杂,等明天整理下套路
这个后续再看了…