自动化之图形界面库pyautogui
开篇言:py的库真的是多,封装相关功能的库真的是各具神通,里面的轮子很多。前几天一直回去看基础的语法函数这些,以及c语言数据结构这些,扎实自己的基础。
学习是一件很麻烦但是很有意思的事情(我指的是码代码),今天为大家介绍这个自动化库,提高趣味性,当然python的自动化操作还是有好多,后面会为大家继续推出。
pyautogui库的趣味操作
一:初步认识pyautogui
pyautogui是什么?
拆开来分析,毕竟还是英文单词。py+auto+gui,那就是python的自动化图形界面的一个库。
给大家推荐一个可以查阅py文档的网站,可以查看最新的库的相关操作以及版本。点击访问PyPI
可以试着去阅读,虽然都是英文,但是也是可以通过谷歌翻译翻译为中文的(如果你真的看不懂的话),个人感觉学会阅读英文文献也是程序员的一种素养。
废话有点多,我们来介绍这个库究竟是什么?大家可以在这里看到。
实现一个控制图形界面的库,完成一些自动化操作,当然也是需要配合你得程序,或者高级一点我们可以说是配合你的算法。
可以实现鼠标控制,键盘输入,截图匹配的相关操作,目前本人学到用到的也就这些。
二:相关方法的介绍
1:控制鼠标
先了解一下像素(我们以笔记本电脑像素举例)
呃呃,刚刚去百度了一下。说的比较官方,但是比较准确。
像素是指由图像的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子。
按照我们的简单的理解,像素就是电脑屏幕上的那些很小很小的方格,每个方格都有位置坐标,以及色彩rgb,像素方格组合起来显示就可以呈现出来我们可以看到的图像。就好像你的表皮细胞一样,你是肉眼看不到,但是它是组成部分。不知道这样比喻是否恰当。
我们也会听到有关分辨率,那么像素于之是什么样的关系呢?
像素(px)=英寸(in)x分辨率(ppi)
我们需要知道一下这个概念。这是电脑显示器上的分辨率,分别代表了长和宽上的像素点。值比较大的化,图像会更加清晰,美观。
我们可以通过代码来获取屏幕的分辨率
import pyautogui 导入所需要的库
print(pyautogui.size())#查看电脑横纵像素
分别打印出横纵如下,这是这个库可以用到的一个方法。具体了解到有什么用呢?继续往后看鼠标。
实现对鼠标的控制
1:打印鼠标的当前位置
print(pyautogui.position())#查看鼠标所在的位置
我们可以做一个循环监测鼠标所在的位置
import pyautogui
import time
def search_positon() :
time.sleep(1)
x1,y1= pyautogui.position()
print("您当前位置坐标为:","x:"+str(x1)+'',"y:"+str(y1))
if __name__ == "__main__" :
while True :
search_positon()
pass
我们刚刚说到像素,通过一行代码获取到显示屏的横纵像素,这个对于我们对电脑的像素坐标有了一个基本的认识。可以知道的是,x_max=1919,y_max=1079,这就是程序给出的最大坐标。因为下标从0开始,我的电脑屏幕左上角的坐标为(0,0),而电脑的的横纵分别为1920,1080。所以就理解了。那么就可以在电脑的左上角建立坐标原点,然后可以开始你的平面构思。
我们可以用到一个方法,将该方法的返回直接打印出,如果在,就返回True,如果不在就返回False
print(pyautogui.onScreen(200,202))#查看位置点是否位于屏幕上
2:控制鼠标移动
对的,还可以控制鼠标移动,我们来看具体的用到的方法。
pyautogui.moveTo(100,200,3)#这是控制鼠标移动,3代表了时间。
还有一种移动的方法
pyautogui.moveRel(200,300,4)
看起来两者区别不大,但是实际上还是有区别的,那就是moveTo()是移动到绝对位置,就是相对于你的屏幕坐标原点,而moveRel()是相对当前位置移动。
我们来看一种按键移动,就是指定按住鼠标那个键移动
pyautogui.drag(500,500,button='left',duration=4)
#button参数指定了按键,duration指定了完成任务的时间,当然这个移动也是相对当前位置移动
pyautogui.dragTo(500,500,button='left',duration=6)#这边的500是移动到具体的位置
鼠标点击
pyautogui.click(0,0,button='right')#鼠标点击指定的位置
pyautogui.click(2,2,button='left',clicks=2,interval=0.1,duration=2)#interval代表完成间隔时间,clicks指定了点击次数。
鼠标滚动
import pyautogui
#为了效果明显,我们使用一个循环进行观察
pyautogui.FAILSAFE = False
while True :
pyautogui.scroll(-200)
2:控制输入以及键盘按键
在鼠标光标的位置写入内容
pyautogui.write("Hello",interval=0.5)#间隔为1秒,字符之间
还有其它的按键方法,这边不做演示,展示一下方法
# pyautogui.press('enter')#按键盘上的键
# # pyautogui.press(['x','y','z'])#以列表的形式传入按键
# pyautogui.keyDown()#模拟按键
# pyautogui.keyUp()#按键释放
信息输入
a = pyautogui.alert(Text = "i love you",title='666') #弹出提示框
print(a)#输出一下返回内容
a1 = pyautogui.confirm("你喜欢谁",button = ['张三','王五','李四'])
print(a1)
信息输入还有密码的输入的方法
# a2 = pyautogui.password("请输入密码")
# print(a2)
3:截图以及匹配(图片识别)
这边我们介绍方法,具体看后面的一个自动化程序
#pyautogui.screenshot()#截图
#pyautogui.screenshot("picture.png")保存
#另一种保存
#a = pyautogui.screenhot()
#a.save("picture.png")#这边可以自己加路径的
#pyautogui.screenshot(region=(0,0, 0, 0))#这边指定区域截图
#匹配图片的函数
# pyautogui.locateOnScreen('picture.jpg')
# pyautogui.locateAllOnScreen('picture.jpg')#匹配多处图片
具体完成一个小小的自动化点赞程序,网上也有好多,但是个人对异常进行了处理,所以点赞会比较丝滑。往下看,举个栗子。
三:自动化点赞(处理了存在的异常)、
思路:?
如何实现自动化点赞?我的思路是这样的,预先保存一个赞的图标。这个截图是我自己用windows自带截图功能截下来的,
如果你要用程序截图的化,会很麻烦,因为我需要的赞表就这么大。如下。hhh。
然后呢,我通过这个图片作为模板,然后再页面上寻找。一旦找到,我就返回其横纵坐标,然后我就指定点击这个位置。如果没有找到,我就命令鼠标下滑,继续找,如此循环。当然你可以看到,上面那个白色的赞标,这就决定了,我会给没有赞的人点赞,或者我没有点过赞的人。
我寻找的目标是csdn动态,来看代码先
import pyautogui
import time
pyautogui.FAILSAFE =False
def dianzan():
time.sleep(0.5) # 等待 0.5 秒
try:
buttonx,buttony = pyautogui.locateCenterOnScreen(image = 'D:/python/pydoc/pystudy/665.png') # 寻找 点赞图片;
pyautogui.click(buttonx,buttony)
# 点击
print('点赞成功!')
except TypeError :
print("目前接收不了返回的参数")
while True:
if pyautogui.locateOnScreen(image = 'D:/python/pydoc/pystudy/665.png'):
dianzan() # 调用点赞函数
else:
pyautogui.scroll(-200) # 本页没有图片后,滚动鼠标;
print('没有找到目标,屏幕下滚~')
想说的是这个和你预先作为模板的图片有关,效果也是不一样的,还有自己如何选择和滚动,光标预先放置的位置。会有一部分没点上,自动化点赞了许多。
释疑
我们来解释一部分内容,就是这边我们为什么要捕获异常
try:
buttonx,buttony = pyautogui.locateCenterOnScreen(image = 'D:/python/pydoc/pystudy/665.png') # 寻找 点赞图片;
pyautogui.click(buttonx,buttony)
# 点击
print('点赞成功!')
except TypeError :
print("目前接收不了返回的参数")
buttonx,buttony会接收返回的坐标,横纵,前提是如果找到了,但是没有找到会返回none,那么你要用两个参数接收的化就肯定不行了,所以我们考虑到这点,让程序在遇到这种情况的时候抛出异常,然后继续寻找,不然的化,程序会因为没找到图片返回值接收出错而中断。所以这个是一个很巧妙的点。
脚注:对个人用这些方法的话,其实没有太多的技术含量,python这些要求我们会这些方法,调包这些,所以个人一向将python作为辅助工具,当然你要是人工智能这些高级的话就会用到数学这些算法相关的。python呢,是一门很值得去学习的语言,效率高,数据分析强,集成大量的功能,大家给python吹也是有道理的,人工智能没数据可视化这些,数据分析等等。不得不说,这门语言很优秀。
欢迎大家留言,写文章太累了。还有后面如果有新的内容的话,还会给本文加入更多自动话程序。