前言:首先十分感谢B站up主“不高兴就喝水”的视频,作为0基础的观众,我直接下载了包。
然后。。。。。。开始痛苦的学习起来了。
忘了,我是有点呆的秋人(昵称还在审核中)
好,开始回顾痛苦~
首先,我根据使用说明书,我下载了最新的python3.12,后面因为一些兼容原因我换成了python3.11,同时我也下载了pycharm 社区版。我安装完各个库以后,双击打开water.py文件,屏幕快速闪了一下,也没有程序框弹出,我接连试了几次都是相同的情况。我没有去纠结为什么这个问题,因为我认为可以先通过pycharm来先学习代码。下面是我逐字逐句学习代码的过程:其中的一些基础语法def if elif while这些就是直面的英语理解就可以了,百度一下几分钟就可以理解了。
第一步 理解鼠标操作的逻辑
def function_name(parameters):
# 函数体
# 执行函数的代码逻辑
#需要用到的库,大白话就是我们要用的方法方式
import pyautogui
import time
import xlrd
import pyperclip
#定义鼠标事件
#pyautogui库其他用法 https://blog.csdn.net/qingfengxd1/article/details/108270159
#定义鼠标操作方法,在这里的时候我花了40分钟时间去搞懂lOrR是什么意思,直至后面我才意识到是鼠标左右键的缩写
#因为我是逐行逐句去看代码就开始思考reTry的默认值是多少,这里也纠结了一下,后面看完全篇才发现是尾巴赋值。retry大白话就是重试的意思。
#reTry:这是一个布尔值参数,只有True和False这两种状态。
#如果找不到图像,并且 reTry 参数为 True,则会不断重试查找图像并点击,直到找到为止
#i += 1:将 i 的值加 1,用于追踪重试的次数
def mouseClick(clickTimes,lOrR,img,reTry):
if reTry == 1:
while True:
#获取应用程序位置
location=pyautogui.locateCenterOnScreen(img,confidence=0.9)
if location is not None:
#interval 单击之间等待秒数,clickTimes是鼠标的点击次数
#duration为执行此次动作的设置时间,0为立即执行
#x y鼠标的坐标,confidence是查找图片精确度 默认为1;locateCenterOnScreen定位函数
#lOrR是鼠标左键右键 left righ
pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR)
break
print("未找到匹配图片,0.1秒后重试")
time.sleep(0.1)
elif reTry == -1:
while True:
location=pyautogui.locateCenterOnScreen(img,confidence=0.9)
if location is not None:
pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR)
time.sleep(0.1)
elif reTry > 1:
i = 1
while i < reTry + 1:
location=pyautogui.locateCenterOnScreen(img,confidence=0.9)
if location is not None:
pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR)
print("重复")
i += 1
time.sleep(0.1)
第二步是对数据的检查方法和逻辑 的理解
# 数据检查 def是定义这个函数用法规则,方便我们后续直接调用,sheet1.nrows就是表格里面的行
# cmdType.value 1.0 左键单击 2.0 左键双击 3.0 右键单击 4.0 输入 5.0 等待 6.0 滚轮
# ctype 空:0
# 字符串:1
# 数字:2
# 日期:3
# 布尔:4
# error:5
#if sheet1.nrows < 2::检查数据表的行数是否小于 2。因为cmd表格第一行是表头
#如果是,输出提示信息 "没数据啊哥",并将 checkCmd 设置为 False,表示数据检查未通过。
def dataCheck(sheet1):
checkCmd = True
#行数检查
if sheet1.nrows<2:
print("没数据啊哥")
checkCmd = False
#每行数据检查
i = 1
while i < sheet1.nrows:
# 第1列 操作类型检查
#(1)[0]第2行第1列 i是行 从0开始
cmdType = sheet1.row(i)[0]
#如果操作类型不是数字类型(ctype != 2)或不属于特定的几个值,输出提示信息 "第 x 行,第1列数据有毛病",并将 checkCmd 设置为 False
if cmdType.ctype != 2 or (cmdType.value != 1.0 and cmdType.value != 2.0 and cmdType.value != 3.0
and cmdType.value != 4.0 and cmdType.value != 5.0 and cmdType.value != 6.0):
print('第',i+1,"行,第1列数据有毛病")
checkCmd = False
# 第2列 内容检查
cmdValue = sheet1.row(i)[1]
# 读图点击类型指令,内容必须为字符串类型
#字符串是一种数据类型,用于表示文本数据。
#字符串是由字符组成的序列,可以包含字母、数字、符号和空格等字符
if cmdType.value ==1.0 or cmdType.value == 2.0 or cmdType.value == 3.0:
if cmdValue.ctype != 1:
print('第',i+1,"行,第2列数据有毛病")
checkCmd = False
# 输入类型,内容不能为空
if cmdType.value == 4.0:
if cmdValue.ctype == 0:
print('第',i+1,"行,第2列数据有毛病")
checkCmd = False
# 等待类型,内容必须为数字
if cmdType.value == 5.0:
if cmdValue.ctype != 2:
print('第',i+1,"行,第2列数据有毛病")
checkCmd = False
# 滚轮事件,内容必须为数字
if cmdType.value == 6.0:
if cmdValue.ctype != 2:
print('第',i+1,"行,第2列数据有毛病")
checkCmd = False
i += 1
return checkCmd
第三步 理解我们cmd表格中的第一列和第二列如何通过定义mainwork来组合搭配实现功能
#任务 img 在这段代码中是用于表示与操作相关的图片名称或标识的变量。
def mainWork(img):
i = 1
while i < sheet1.nrows:
#取本行指令的操作类型
cmdType = sheet1.row(i)[0]
if cmdType.value == 1.0:
#取图片名称
img = sheet1.row(i)[1].value
reTry = 1
#ctype 为 2 表示数字类型 0为空
if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0:
reTry = sheet1.row(i)[2].value
mouseClick(1,"left",img,reTry)
print("单击左键",img)
#2代表双击左键
elif cmdType.value == 2.0:
#取图片名称
img = sheet1.row(i)[1].value
#取重试次数
reTry = 1
if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0:
reTry = sheet1.row(i)[2].value
mouseClick(2,"left",img,reTry)
print("双击左键",img)
#3代表右键
elif cmdType.value == 3.0:
#取图片名称
img = sheet1.row(i)[1].value
#取重试次数
reTry = 1
if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0:
reTry = sheet1.row(i)[2].value
mouseClick(1,"right",img,reTry)
print("右键",img)
#4代表输入,其中pyperclip.copy 将其复制到剪贴板,
#然后使用 pyautogui.hotkey 进行模拟按键操作,将输入值粘贴到当前焦点位置,并打印相应信息
elif cmdType.value == 4.0:
inputValue = sheet1.row(i)[1].value
pyperclip.copy(inputValue)
pyautogui.hotkey('ctrl','v')
time.sleep(0.5)
print("输入:",inputValue)
#5代表等待
elif cmdType.value == 5.0:
#取图片名称
waitTime = sheet1.row(i)[1].value
time.sleep(waitTime)
print("等待",waitTime,"秒")
#6代表滚轮
elif cmdType.value == 6.0:
#取图片名称
scroll = sheet1.row(i)[1].value
pyautogui.scroll(int(scroll))
print("滚轮滑动",int(scroll),"距离")
i += 1
第四步 理解主要代码,就是我们上面已经定义完了 鼠标 表格 以及如何配合实现功能的规则。这一步相当于我们在下棋,棋子的本身的功能我们已经赋予了。
#来判断当前脚本是否作为主程序直接运行
if __name__ == '__main__':
file = 'cmd.xls'
#打开文件,通过 xlrd.open_workbook() 函数打开文件,将文件的内容读取到 wb 变量中。
#然后使用 wb.sheet_by_index(0) 获取文件的第一个表格页,并将其赋值给变量 sheet1。
#这样就得到了需要操作的表格数据
wb = xlrd.open_workbook(filename=file)
#通过索引获取表格sheet页
sheet1 = wb.sheet_by_index(0)
print('欢迎使用不高兴就喝水牌RPA~')
#数据检查
checkCmd = dataCheck(sheet1)
if checkCmd:
key=input('选择功能: 1.做一次 2.循环到死 \n')
if key=='1':
#循环拿出每一行指令
mainWork(sheet1)
#while True 是一个无限循环的语句
elif key=='2':
while True:
mainWork(sheet1)
time.sleep(0.1)
print("等待0.1秒")
else:
print('输入有误或者已经退出!')
最后,虽然文章只有一点点内容,但是只有自己亲自动手去花时间理解操作才发现,3天时间已经过去(本人上班族,只是兴趣想试一试),写这篇文章的目的也是让自己继续坚持下去,激励自己同时记录自己,可以以后复习。
有什么需要改进或错误的地方,望大家指正~
我是有点呆的秋人~