【AI飞】AutoIT入门七(实战):python操控autoit解决csf视频批量转换(有点难,AI都不会)

 背景:

终极目标:通过python调用大模型,获得结果,然后根据返回信息,控制AutoIT操作电脑软件,执行具体工作。让AI更具有执行力。

已完成部分:

 关于python调用大模型的,可以参考之前的文章:

AI入门7:python三种API方式调用本地Ollama+DeepSeek_deepseek大模型下载到本地后,如何在python代码中调用-CSDN博客

AI入门8:通过vsCode用python访问公网deepseek-r1等模型(Tocken模式)-CSDN博客

AutoIT介绍,和如何安装及配置,以及运行了第一个hello程序,然后学习了基本工具的使用和基本语法,对桌面对象的操控,以及python控制autoit的基本理论,见前面文档:

【AI飞】AutoIT入门一:AutoIT来了,准备让AI动起来-CSDN博客

【AI飞】AutoIT入门二:Autolt v3 Window Info,和SciTE Script Editor的使用及鼠标操作-CSDN博客

【AI飞】AutoIT入门三:Autolt基本语法-CSDN博客

【AI飞】AutoIT入门四(重点):Autolt代替你操控计算机就快要实现了~-CSDN博客

【AI飞】AutoIT入门5(GUI-选学):autoit构建GUI,用得上吗-CSDN博客

【AI飞】AutoIT入门六(拐点):python操控autoit-CSDN博客

本文,继续python调用AutoIT之后,我实实在在的做了一个具体应用,过程曲折,特此总结记录。

本节目标

用AutoIT模拟手工操作,只有在没有其他程序可以替代,且需要重复操作执行,才有必要用AutoIT,我现在就有一堆CSF格式视频,需要转换成现在播放器能播放的。

CSF格式是之前大学课堂录制流行的格式,找了很久的批量转换方法,连AI都没有好的解决办法,尝试了半天,下载安装了ScenicEditor,其中带了个“CSF文件格式转换工具”,只能一个一个视频的转,所以才用python控制autoit批量执行操作。

 准备

需要安装autoit,入门第一篇中有,另外需要开发环境:Trae或者vscode,其安装配置可以参考之前的文档

【Ai工具】trae和传统编程环境vs+代码助手的PK,结果大捷_trae cn与通义灵码对比写代码-CSDN博客

还没安装python的朋友,可以参考之前的文档,Trae就是仿照vsCode,操作不能说一模一样,简直没有差别:

【菜鸟飞】用vsCode搭建python运行环境_code运行python环境-CSDN博客

 第一个python操控autoit的程序见:

【AI飞】AutoIT入门六(拐点):python操控autoit-CSDN博客

开始

直接展示一下成功的结果代码,和实现逻辑,再说其中的“坑”在哪里。

实现业务逻辑

转换一个文件的过程是这样:

运行“CSF文件格式转换工具”,初始界面如下:

进行一次转换,需要进行如下设置:

选择“源文件路径”,就是要转换的文件,选择之后,主界面的下拉框才有相关选项,

然后,是按照上图设置配置项,特别是目标屏幕文件,得修改默认值为当前设置,然后,点击“配置”按钮,进行配置屏幕流量和屏幕帧率。

程序逻辑

轮询源文件夹,把每一个文件,按上面的过程,处理一遍。

调试好的程序

代码如下

import os
import autoit
import time

# CSF文件格式转换工具路径
csf2wmv_exe_path = r"E:\Program Files (x86)\ScenicEditor\csf2wmv.exe"
# 源文件路径
source_folder = r"E:\教程\"

def is_csf2wmv_running():
    """检查 csf2wmv 程序是否已经在运行"""
    return autoit.win_exists("[TITLE:CSF文件转换工具]")

def setup_conversion_tool(csf_file_path, target_folder):
    """设置转换工具的参数"""
    # 如果程序未运行,则启动程序
    if not is_csf2wmv_running():
        autoit.run(csf2wmv_exe_path)
        # 等待主窗口出现
        if not autoit.win_wait("[TITLE:CSF文件转换工具]", 10):
            print("错误: CSF文件转换工具窗口未在10秒内出现")
            return False

    # 点击“...”按钮选择源文件路径
    autoit.control_click("[TITLE:CSF文件转换工具]", "Button2")  # 点击“...”按钮
    
    # 等待文件选择对话框出现
    if not autoit.win_wait("[CLASS:#32770; TITLE:打开]", 5):
        print("错误: 文件选择对话框未在5秒内出现")
        return False

    time.sleep(1)
    # 在文件选择对话框中选择文件
    autoit.control_set_text("[CLASS:#32770; TITLE:打开]", "Edit1", csf_file_path)
     # 等待文件选择完成
    time.sleep(1)
    #autoit.control_focus("[CLASS:#32770; TITLE:打开]", "Button1")  # 确保焦点在“打开”按钮上
    autoit.control_click("[CLASS:#32770; TITLE:打开]", "Button2")  # 点击“打开”按钮
    
    # 等待文件选择完成
    time.sleep(1)
    
    # 设置目标文件夹
    autoit.control_focus("[TITLE:CSF文件转换工具]", "Edit2")
    autoit.control_set_text("[TITLE:CSF文件转换工具]", "Edit2", target_folder)
    time.sleep(2)
    #autoit.mouse_move(808,202)
    #time.sleep(1)
    autoit.mouse_click("left", 908,302, 1, 0)
    time.sleep(1)
    autoit.mouse_click("left", 908,337, 1, 0)
    time.sleep(3)      
    # 设置其他选项(根据需要调整)

    # 目标视音频2文件 
    try:
        autoit.control_focus("[TITLE:CSF文件转换工具]", "ComboBox5")  # 选择屏幕流
        autoit.control_send("[TITLE:CSF文件转换工具]", "ComboBox5", "不转换音频")
        time.sleep(3)        
        autoit.control_focus("[TITLE:CSF文件转换工具]", "ComboBox6")  # 选择音频流
        autoit.control_send("[TITLE:CSF文件转换工具]", "ComboBox6", "不转换视频")
 
    except Exception as e:
        "print(csf_file_path)"

    try:
        # 目标视音频1文件  
        autoit.control_focus("[TITLE:CSF文件转换工具]", "ComboBox2")  # 选择视频流
        autoit.control_send("[TITLE:CSF文件转换工具]", "ComboBox2", "不转换视频")    
        time.sleep(3)   
        autoit.control_focus("[TITLE:CSF文件转换工具]", "ComboBox1")  # 选择视频流
        autoit.control_send("[TITLE:CSF文件转换工具]", "ComboBox1", "不转换音频")    
    except Exception as e:
        "print(csf_file_path) "       

    # 目标屏幕文件 
    time.sleep(3)    
    autoit.control_focus("[TITLE:CSF文件转换工具]", "ComboBox3")  # 选择视频流
    autoit.control_send("[TITLE:CSF文件转换工具]", "ComboBox3", "Screen 01")
    time.sleep(3)        
    autoit.control_focus("[TITLE:CSF文件转换工具]", "ComboBox4")  # 选择音频流
    autoit.control_send("[TITLE:CSF文件转换工具]", "ComboBox4", "Audio 01")
    time.sleep(2)        

    # 新增:点击“配置”按钮
    autoit.control_click("[TITLE:CSF文件转换工具]", "Button9")  # 假设“配置”按钮的控制名为"Button3"
    time.sleep(1)

    # 在弹出的配置界面中设置参数
    if autoit.win_wait("[TITLE:屏幕配置]", 5):  # 等待配置界面出现
        # 设置屏幕属性
        autoit.control_focus("[TITLE:屏幕配置]", "Edit1")  # 屏幕流率
        time.sleep(1)
        autoit.control_set_text("[TITLE:屏幕配置]", "Edit1", "1200")
        time.sleep(2)
        autoit.control_focus("[TITLE:屏幕配置]", "Edit3")  # 屏幕帧率
        time.sleep(1)
        autoit.control_set_text("[TITLE:屏幕配置]", "Edit3", "25")
        time.sleep(1)

        # 点击“OK”按钮保存配置
        autoit.control_click("[TITLE:屏幕配置]", "Button1")  # 假设“OK”按钮的控制名为"Button1"
        time.sleep(1)

    return True

def start_conversion():
    """开始转换"""
    if not autoit.control_click("[TITLE:CSF文件转换工具]", "Button1"):
        print("错误: 无法点击'开始转换'按钮")
        return False
    return True
    
def main():
    # 遍历文件夹中的 .csf 文件
    for filename in os.listdir(source_folder):
        if filename.endswith(".csf"):
            csf_file_path = os.path.join(source_folder, filename)
            target_folder = source_folder  # 假设与源文件在同一目录下
            
            if setup_conversion_tool(csf_file_path, target_folder):
                if start_conversion():
                    print(f"成功启动转换文件: {filename}")
                    # 等待转换完成(这里简单地等待一段时间,实际应根据具体情况进行调整)
                    print(f"正在转换文件: {filename}")
                    time.sleep(20)  # 根据实际情况调整等待时间
                    print(f"成功转换文件: {filename}")
                else:
                    print(f"失败启动转换文件: {filename}")
            else:
                print(f"失败设置转换工具参数: {filename}")

    # 转换完成后关闭程序(如果需要)
    if is_csf2wmv_running():
        #autoit.win_close("[TITLE:CSF文件转换工具]")
        print("所有文件转换完成,程序已关闭。")

    print("所有文件转换完成。")

if __name__ == "__main__":
    main()

程序也不长,但是坑太多,AI都整不出来,最后还费了很多时间,连猜带蒙,才搞出来。

来,盘点一下遇到的哪些“坑”

控件定位坑

有图有真相:

一个button,对应了这个选择文件的区域,从AutoIt Window Info里,你根本看不出来,源文件选择的按钮是哪一个,AI给的程序,它写的是“Button1”,执行调试的时候,只是下面那个按钮被点开,我试着改了一下,结果是button2,对应代码:

坑不,工具定位不到区域里的对象,界面控件序号是无序的。。。

 不确定坑

同一个区域,有的控件能单独被工具捕捉定位,有的不能,特别是你需要定位的,它定位不了,这个下拉框的参数要改,结果你不知道它是老几。。。

这个也在上面区域里,它能被定位到: 

 我试了很久,不能相信它对控件还有歧视,扫雷似的,探查半天,没找到规律。。。

控件灵异坑

看下代码,其中,49、51行,是用鼠标点击操作,模拟了第一个选择视频流的下拉菜单操作,代码看着是重复的,但是去掉49、51行,下面的下拉菜单控件,程序就找不到,运行就报错,找不到对象,控件啥时候出现,怎么出现,这个未解之谜,至今没找到原因。

上面这几个坑,AI完全避不开,怎么问都问不出所以然。 

霸占系统坑 

程序执行 一起来,如果你碰了鼠标,或切换它用的窗口,它就找不到对象了,所以程序运行起来,你的电脑就被霸占了,只能看着它点来点去,别的啥也别想干了。。。

有用的经验

sleep的使用

代码里有很多Sleep,AI给的程序中,没加,执行的时候,不是控件找不到,就是数据设置不上,交互界面,不一定比人操作速度快,得等等程序。。。

界面对象探查

让AI写了一个桌面对象探查的程序,代码如下:

import autoit
import time

def get_window_info(title):
    """获取指定窗口的信息"""
    if not autoit.win_exists(title):
        print(f"窗口 '{title}' 不存在")
        return None
    
    # 获取窗口类名列表
    class_list = autoit.win_get_class_list(title)
    class_name = class_list.split("|")[0] if class_list else None  # 取第一个类名
    
    window_info = {
        "title": autoit.win_get_title(title),
        "text": autoit.win_get_text(title),
        "class": class_name,
        "pos": autoit.win_get_pos(title),
        "handle": autoit.win_get_handle(title)
    }
    return window_info

def get_controls_info(title):
    """获取指定窗口内所有控件的信息"""
    controls_info = []
    
    # 获取窗口句柄
    hwnd = autoit.win_get_handle(title)
    if not hwnd:
        print(f"无法获取窗口 '{title}' 的句柄")
        return controls_info
    
    # 遍历窗口内的所有控件
    control_id = 0
    while True:
        control = autoit.control_get_handle(title, "[ID:" + str(control_id) + "]")
        if not control:
            break
        
        control_info = {
            "id": control_id,
            "class": autoit.control_get_classname(title, "[ID:" + str(control_id) + "]"),
            "text": autoit.control_get_text(title, "[ID:" + str(control_id) + "]"),
            "pos": autoit.control_get_pos(title, "[ID:" + str(control_id) + "]")
        }
        controls_info.append(control_info)
        
        control_id += 1
    
    return controls_info

def main():
    # 窗口标题
    window_title = "CSF文件转换工具"
    
    # 获取窗口信息
    window_info = get_window_info(window_title)
    if window_info:
        print("-------窗口信息:----------")
        for key, value in window_info.items():
            print(f"  {key}: {value}")
        print("-------窗口信息:结束----------")
    # 获取控件信息
    controls_info = get_controls_info(window_title)
    if controls_info:
        print("\n======》控件信息:")
        for control in controls_info:
            print("  控件信息:")
            for key, value in control.items():
                print(f"    {key}: {value}")

if __name__ == "__main__":
    # 确保 CSF文件转换工具 窗口已经打开
    print("请确保 'CSF文件转换工具' 窗口已经打开...")
    time.sleep(2)  # 等待2秒,确保窗口已经打开
    
    main()

窗口信息能探索出来,控件信息AI改了多次,探查不出来,窗口信息中,class参数收集了窗口控件的类型和文本信息,具有一定参考性:

我把输出的text和class信息,对应起来,和控件界面对照了一下:

可以参考着,调试代码:

看着有点用。

结尾:

千言万语,就一句话:AI的尽头,还是是人脑,嘿嘿😊😊😊。。。

另一句话,pyautoit的资料真的少,连中文API文档都没有,都没有。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正经教主

有钱捧个钱场,没钱捧个人场👌

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值