PySide6开发实战案例:字幕格式转换助手

本文介绍了一款利用Python和pyside6开发的桌面应用程序,可以方便地将多种字幕格式如srt、smi等互相转换,支持单个或批量操作,并且通过调用SubtitleEdit进行实际转换。开发者分享了项目开发过程,包括工具选择、技术点和打包步骤。
摘要由CSDN通过智能技术生成

一、项目说明:

       有时候,我们想把srt格式的字幕文件,转换成 lrc 格式的字幕文件,怎么办?批量转换呢?

于是,自己使用开源软件,手撸了一个简单的字幕转换工具。下载链接在文末尾。

        通过使用python、pyside6学习开发《字幕转换助手》这款Windows桌面端软件。软件支持将常见的字幕格式 'srt', 'smi', 'vtt', 'stl', 'sbv', 'sub', 'ass', 'ttml', 'dfxp', 'xml', 'lrc' 进行格式相互转换。

        通过项目的练手,掌握pycharm环境下使用PySide6开发桌面端软件、并打包发布的整个流程。

1.1、项目简介:

        想转就转字幕转换助手,使用pyside6进行图形界面开发,支持常见字幕格式文件之间相互转换,不仅支持单个文件,也支持批量字幕文件格式转换。在软件内部代码中,主要调用了SubtitleEdit.exe这款开源软件。

1.2.2、主窗口分2个区:左侧菜单区、右侧工作区

二、项目架构

2.1、开发设备

       Windows10 64位电脑

2.2、开发工具

       PyCharm Community Edition 2022.1.1、Python 3.8.10、PySide6、Pyinstaller、auto-py-to-exe

2.3、技术点

       UI设计: 使用pyside6-designer.exe设计,

       Ui编译:使用pyside6-uic.exe编译成py文件,

       逻辑功能实现:Python      

       主要第三软件:SubtitleEdit.exe

       项目打包:auto-py-to-exe

2.4、项目搭建

    2.4.0、构建项目虚拟环境

Pycharm打开后,在File菜单选择New Project,打开界面,新建项目名Subtitle_Assistant,同时新建一个Base interpreter为Python 3.8的虚拟环境venv,如下:      

    2.4.1、pyside6配置:

 Pycharm终端Terminal,虚拟环境下输入:pip install pyside6==6.4.3  回车后等待安装成功:Successfully installed PySide6-6.4.3 PySide6-Addons-6.4.3 PySide6-Essentials-6.4.3 shiboken6-6.4.3

2.4.2、配置外部工具pyside6-designer.exe、pyside6-uic.exe、Pyside6-rcc.exe

参考:PySide6开发实战案例:艺术签名助手_pyside6 window程序开发-CSDN博客

         2.4.3、项目结构        

入口函数,位于app.py里的main函数。其中,

img存放图标图片文件;

src文件夹存放各模块程序源代码文件;

ui文件夹存放pyside designer设计的ui 文件;

venv文件夹为项目虚拟环境文件夹;

三、模块功能实现:

3.1、主界面

    3.1.1、界面UI

              在Pycharm中打开Tools菜单进入External Tools,选择使用pyside6-designer.exe设计主窗口界面,保存为 index.ui文件。

    3.1.2、UI转py文件

          index.ui文件完成后使用pyside6-uic.exe编译成 ui_index.py文件,供src/index_module/index.py文件引入,补充界面设计,并添加业务逻辑。

四、核心代码:

4.1、subtitle_convert_page.py的部分代码:

                        # 1、对于目标格式为lrc:
                        if self.target_format == 'lrc':
                                # 如果源文件格式srt,则
                                if source_format == 'srt':
                                    # srt转lrc,调用srt_to_lrc.py模块中的函数,其它格式转换,采用2、其它格式
                                    # srt文件转成lrc格式的文本字符串
                                    lrc_str = srt_to_lrc(file_path_wait_handle)
                                    # 将lrc格式的文本字符串写入到lrc文件中
                                    with open(out_file_path, "w+", encoding='utf-8') as fo:
                                        fo.write(lrc_str)

                                    # 如果转换后目标文件存在,则表示转换成功:
                                    if os.path.isfile(out_file_path):
                                        # 表格中“处理状态”字段值设置为“处理完成!”
                                        self.set_handle_status_item(row_index, "处理完成!")
                                    else:
                                        # 表格中“处理状态”字段值设置为“出错啦!”
                                        self.set_handle_status_item(row_index, "出错啦!")


                                # 如果源文件格式不是srt,则先将其转为srt,再srt转lrc
                                elif source_format != 'srt':
                                    # 命令行输入文件
                                    cmd_in_file = f'{file_path_wait_handle}'
                                    # 命令行输出格式
                                    cmd_out_format = "srt"

                                    # 命令行输出文件,srt文件保存文件夹
                                    cmd_out_folder = f'/outputfolder:"{self.out_dir_lineEdit_2.text()}"'
                                    # 命令行转格式字符串
                                    cmd = f'{SubtitleEdit_path} /convert "{cmd_in_file}" {cmd_out_format} {cmd_out_folder}'
                                    # print("转换字幕cmd:", cmd)
                                    # 执行命令行
                                    result_state = os.system(cmd)
                                    if result_state == 0:
                                        # 转换成srt文件后,再将srt文件转为lrc文件
                                        srt_file_path = out_file_path.replace('.lrc', '.srt')
                                        # srt文件转成lrc格式的文本字符串
                                        lrc_str = srt_to_lrc(srt_file_path)
                                        # 将lrc格式的文本字符串写入到lrc文件中
                                        with open(out_file_path, "w+", encoding='utf-8') as fo:
                                            fo.write(lrc_str)

                                        # 如果转换后目标文件存在,则表示转换成功:
                                        if os.path.isfile(out_file_path):
                                            # 表格中“处理状态”字段值设置为“处理完成!”
                                            self.set_handle_status_item(row_index, "处理完成!")
                                    else:
                                        # 表格中“处理状态”字段值设置为“出错啦!”
                                        self.set_handle_status_item(row_index, "出错啦!")

                        # 2、其它格式转换
                        else:
                            # Subtitle Edit 命令行选项参考:https://www.nikse.dk/subtitleedit/help
                            # 语法:SubtitleEdit /convert "pattern" "name-of-format-without-spaces" [/encoding:?] [/fps:?] [/outputfolder:?]:
                            # 举例:SubtitleEdit /convert sub1.srt sami    将srt转成sami格式

                            # 命令行输入文件
                            cmd_in_file = f'{file_path_wait_handle}'
                            # 命令行输出格式
                            cmd_out_format = f'{self.target_format}'
                            # 命令行输出文件
                            cmd_out_folder = f'/outputfolder:"{self.out_dir_lineEdit_2.text()}"'
                            # 命令行转格式字符串
                            cmd = f'{SubtitleEdit_path} /convert "{cmd_in_file}" {cmd_out_format} {cmd_out_folder}'
                            # print("转换字幕cmd:", cmd)
                            # 执行命令行
                            result_state = os.system(cmd)
                            if result_state == 0:
                                # 表格中“处理状态”字段值设置为“处理完成!”
                                self.set_handle_status_item(row_index, "处理完成!")
                            else:
                                # 表格中“处理状态”字段值设置为“出错啦!”
                                self.set_handle_status_item(row_index, "出错啦!")
        else:
            # 弹出警告消息框提示
            QMessageBox.warning(self, "警告", "请添加文件!")

五、打包项目:

参考:PySide6开发实战案例:艺术签名助手_pyside6 window程序开发-CSDN博客

打包软件下载地址: 想转就转字幕转换助手

    

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值