Pyqt5 --实现小工具功能开发记录【一】

Pyqt5 --小工具功能实现【一】


主界面展示:

在这里插入图片描述

文章目录


前言

1、首先需要明晰工具的功能及其设计(包括:UI部分和逻辑程序部分):
该小工具分为四个功能模块;
【1】图片格式转化模块;
【2】图片转GIF模块;
【3】图片轮播模块;
【4】视频转图片模块;
2、首先设计UI,通过Pyqt5工具设计,自动编译为python可识别UI程序;(这里不作详述安装及使用方法,如有需要,可自行查找相关资料学习)

在这里插入图片描述

3、逻辑程序:主要分为主程序(界面修改,逻辑功能控制)和QT线程启用程序(为了执行占用资源和持续性运行的功能程序)


一、图片格式转化模块:

在这里插入图片描述

(1)功能使用说明:

1.1 点击浏览按钮,选择图片路径,点击打开按钮;

在这里插入图片描述

1.2 勾选批量选择,点击浏览按钮,选择图片存放的文件夹;

在这里插入图片描述

1.3 选择单张,选择图片转化格式,点击转化按钮,保存转换格式后的图片;

在这里插入图片描述

1.4 选择多张,选择图片转化格式,点击转化按钮,保存转换格式后的图片;

自动创建对应图片格式转化后的保存文件夹路径在这里插入图片描述

1.5 选择单张或者多张,点击修改按钮,修改图片的分辨率,自动保存至对应路径;

自动保存到目录下【图片修改分辨率保存】的文件夹内
在这里插入图片描述


二、图片转GIF模块:

(1)功能使用说明:

2.1 点击浏览按钮,选择多图片文件夹存放路径后,展示栏中自动添加图片名称;

在这里插入图片描述

2.2 勾选展示图片后,点击展示栏中的图片名称,界面自动显示对应图片;

在这里插入图片描述

2.3 双击展示栏中的图片名称,对应图片会自动添加至GIF图片生成展示栏;

在这里插入图片描述

2.4 自动生成GIF,并播放GIF;

如果不勾选自动命名,则以第一个图片命名生成GIF的名称
延时:设置GIF 图片之间切换的时间间隔![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d406056ee396405695f61c7e24d83051.gif

三、图片轮播模块:

(1)功能使用说明:

3.1 图片循环播放;

延时:图片循环切换的时间间隔在这里插入图片描述

3.2 音频播放;

循环:音乐持续循环播放在这里插入图片描述

3.2 合成视频;将循环播放的图片与音乐结合,合成视频

注意:这里存在视频时长计算:帧率【已知】 = 图片张数【已知】 /视频时长【该时间不会超过音频时长】,想要理解,自行理解代码,此处不作详述,嘿嘿,反正我就理解这么多╮( ̄▽ ̄)╭
在这里插入图片描述

四、视频转图片模块:

(1)功能使用说明:

4.1 点击浏览按钮,选择视频路径,直接播放视频;

在这里插入图片描述

4.2 选择开始时间和结束时间,将该段时间的视频分割为图片;

在这里插入图片描述

4.3 选择开始时间和结束时间,将该段时间的视频分割为新视频保存;

在这里插入图片描述

五、其他功能模块:

5.1 打开程序运行本地目录的文件夹;

在这里插入图片描述

5.2 重启小工具功能模块;

在这里插入图片描述

六、代码功能模块介绍:

文件概述:

在这里插入图片描述

需要安装的第三方包:用于视频剪辑的功能

在这里插入图片描述

安装完成后,需要找到config_defaults.py(python安装目录下的第三方库文件夹中,如:D:\python\Lib\site-packages\moviepy\config_defaults.py),随后,打开文件,修改成自己安装的对应路径即可。

在这里插入图片描述

6.1 主程序代码;【main_shixian.py】

import time
import os,logging
from UI_files.show_img_ui import Ui_MainWindow
import sys
from PyQt5.QtGui import QIcon,QColor,QDesktopServices,QPixmap, QPalette,QMovie # 用于添加图标
from PyQt5.QtWidgets import QFileDialog, QMessageBox,QMenu, QAction
from PyQt5.QtWidgets import QWidget,QApplication,QMenuBar,QListView,QMainWindow
from PyQt5.QtCore import pyqtSlot,Qt,QUrl,pyqtSignal, QThread, QBasicTimer
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtMultimedia import QMediaMetaData
import traceback
from Qthread_control.qtthread import RunThread
import PIL.Image as Image 
import imageio.v2 as imageio
import shutil 
from UI_files.loadwin_ui import Ui_loadwin
#from PyQt5.QtMultimediaWidgets import QVideoWidget

class LoadWin(QWidget, Ui_loadwin):  # 启动画面类 
    def __init__(self):
        super(LoadWin, self).__init__()
        self.setupUi(self)
        self.setWindowFlags(Qt.FramelessWindowHint)  # 无边框
        self.setStyleSheet("#Form{background-color:'#4682B4'}"
                           "#label_info{background-color:'#4682B4';color:white;font-weight:600;}"
                           )  # 设置启动窗背景色和进度信息的字体样式等
        
        self.movie = QMovie("./UI_files/icon/斩.gif")
        self.label_logo.setMovie(self.movie)
        self.label_logo.setScaledContents(True)  # 图像拉伸填充
        self.movie.start()
        self.timer = QBasicTimer()  # 定时器对象
        self.step = 0  # 进度值
        self.proess_run()
        self.ret = None
        
    # 第一步执行流程
    def proess_run(self):  # 启动进度线程
        self.cal = LoadThread()  # 线程对象
        self.cal.part_signal.connect(self.process_set_part)
        self.cal.data_signal.connect(self.show_main_win)
        self.cal.start()  # 调用线程run

    def process_set_part(self, num):
        self.step = num  # 进度从num开始
        self.progressBar.setValue(self.step)
        if num == 0:
            self.timer.start(20, self)  # 启动QBasicTimer, 每20毫秒调用一次回调函数
            self.label_info.setText("等待主页加载...")
        
    def timerEvent(self, *args, **kwargs):   # QBasicTimer的事件回调函数
        self.progressBar.setValue(self.step)  # 设置进度条的值
        if self.step < 100:
            self.step += 1
        else:
            self.cal.set_ret()

    # 显示主界面       
    def show_main_win(self, mes):
        w.close()
        print(mes)
        ui2.show()
        
class LoadThread(QThread):  # 自定义计算线程类 -----------
    part_signal = pyqtSignal(int)  # 进度信号
    data_signal = pyqtSignal(str)  # 数据传输信号

    def __init__(self):
        super().__init__()
        self.ret = None

    # 启动线程
    def run(self):
        # 该消息发送后,启用process_set_part函数
        self.part_signal.emit(0)
        while True:
            if self.ret == True:
                self.data_signal.emit("计算结果:2023 要结束了!") #发送消息使主界面功能加载
                break
            else:
                time.sleep(1)
                continue
    
    # 建立标志
    def set_ret(self):
        self.ret = True



class Power_test(Ui_MainWindow,QMainWindow):
    
    def __init__(self):
        super().__init__() # 使用超类,继承父类的属性及方法
        self.setupUi(self) # 构造窗体界面
        self.setWindowIcon(QIcon("./UI_files/icon/icon.png"))
        self.setWindowTitle("小工具V1.0 ") # 设置窗体主体
        self.intUI()
        
    def intUI(self):
        self.tab_function()
        self.player = QMediaPlayer()                # 定义播放器
        self.player.setVideoOutput(self.mywidget)   # 视频播放输出的窗口,ui自定义
        self.tab4_pushButton_pause.clicked.connect(self.playPause)
        self.current_img_path_show = None
        self.chushihua_funtion()
        self.img_name = ["png","jpg","jpeg","bmp"]
        self.tab3_pushButton3.setEnabled(False)
        self.tab3_pushButton5.setEnabled(False)
        self.tab3_comboBox1.setEditable(True)
        self.music_ret = None
        self.menu_add()
        self.video_int()

    def yichangchuli(func=None):
        def deco(self,*args, **kwargs): 
            # print(func.__name__) #获取方法名称
            try:
                res = func(self,*args, **kwargs)
                return res 
            except Exception as error:
                error = traceback.format_exc()
                print(error)
                return deco
    
    # 添加打开本地文件夹按钮
    def menu_add(self):
        add_opeen= QAction("打开",self)
        add_opeen.setShortcut('Ctrl+F')
        add_opeen.triggered.connect(self.open_local_file)
        self.menuFile.addAction(add_opeen)
        add_opeens= QAction("重启工具",self)
        add_opeens.setShortcut('Ctrl+S')
        add_opeens.triggered.connect(self.restartApp)
        self.menuFile.addAction(add_opeens)
       
    # 打开本地文件夹
    def open_local_file(self):
        path = os.getcwd()
        QDesktopServices.openUrl(QUrl.fromLocalFile(path))

    '''图片格式化===start'''
    def tab_function(self):
        self.tab1_pushButton_up.setDisabled(True)
        self.tab1_pushButton_down.setDisabled(True)
        self.tab1_lineEdit3.setPlaceholderText("请输入宽度和高度,例如:500,700")

    # 选择文件按钮    
    @pyqtSlot()
    def on_tab1_pushButton1_clicked(self):
        path = os.getcwd()
        if self.tab1_checkBox.isChecked():
            folder_path = QFileDialog.getExistingDirectory(self, "选择文件夹")
            if folder_path == "":
                return
            self.tab1_lineEdit1.setText(folder_path)
            self.tab_function()
        else:    
           
            fileInfo = QFileDialog.getOpenFileName(self, "选择文件", path,'Image files (*.jpg *.gif *.png *.jpeg )')
            if fileInfo[0] == "":
                return
            else:
                self.tab1_lineEdit1.setText(fileInfo[0])
                self.tab_function()
        self.current_img_path_show = False
    
    # 打开图片,界面显示图片
    @pyqtSlot()
    def on_tab1_pushButton_open1_clicked(self):
        # 获取图片目录
        if self.tab1_checkBox.isChecked():
            self.imgnumber = 0
            self.tab1_pushButton_up.setDisabled(False)
            self.tab1_pushButton_down.setDisabled(False)
            
            path = self.tab1_lineEdit1.text()
            if path =="":
                print("无文件夹路径加载!")
                self.statusBar_function('无文件夹路径加载!',2000)
                return
            # 列出文件名称
            img_files = os.listdir(path)
            print(img_files)
            self.imgfiles = []
            for img in img_files:
                # 只显示第一张图片
                for imggehsi in self.img_name:
                    if imggehsi in img:
                        self.imgfiles.append(img)
            if len(self.imgfiles) > 0:
                self.allnumbers = len(self.imgfiles) -1
                self.tab1_showimg.setPixmap(QPixmap(path + "/" +self.imgfiles[0]))  #选择路径
                
                self.tab1_showimg.setScaledContents(True)              #图片大小与label适应,否则图片可能显示不全
                # 当前显示图片路径
                self.current_img_path_show = path + "/" +self.imgfiles[0]
            else:
                self.statusBar_function('当前目录下无图片加载成功!',2000)
        else:
            path = self.tab1_lineEdit1.text()
            if path =="":
                print("无图片路径加载!")
                self.statusBar_function('无图片路径加载!',2000)
                return
            self.tab1_showimg.setPixmap(QPixmap(path))
            self.tab1_showimg.setScaledContents(True)
            # 当前显示图片路径
            self.current_img_path_show = path

    # 上一张图片
    @pyqtSlot()
    def on_tab1_pushButton_up_clicked(self):
        if self.imgnumber == 0:
            self.statusBar_function('当前已为第一张图片',3000)
        else:
            self.imgnumber = self.imgnumber -1
            path = self.tab1_lineEdit1.text()
            self.tab1_showimg.setPixmap(QPixmap(path + "/" +self.imgfiles[self.imgnumber] ))
            self.current_img_path = path + "/" +self.imgfiles[self.imgnumber] 
            self.tab1_showimg.setScaledContents(True)
            # 当前显示图片路径
            self.current_img_path_show = path + "/" +self.imgfiles[self.imgnumber] 

    # 下一张图片
    @pyqtSlot()
    def on_tab1_pushButton_down_clicked(self):
        try:
            if  self.imgnumber >= self.allnumbers:
                self.statusBar_function('当前已为最后一张图片',2000)
                return
            self.imgnumber = self.imgnumber +1
            if  self.imgnumber <= self.allnumbers:
                path = self.tab1_lineEdit1.text()
                self.tab1_showimg.setPixmap(QPixmap(path + "/" +self.imgfiles[self.imgnumber] ))
                self.tab1_showimg.setScaledContents(True)
                # 当前显示图片路径
                self.current_img_path_show = path + "/" +self.imgfiles[self.imgnumber] 
            else:
                self.statusBar_function('当前已为最后一张图片',2000)
                return
        except Exception:
            return

    # 保存路径
    @pyqtSlot()
    def on_tab1_pushButton2_clicked(self):
        folder_path = QFileDialog.getExistingDirectory(self, "选择文件夹")
        if folder_path == "":
            return
        self.tab1_lineEdit2.setText(folder_path)
    
    @pyqtSlot()
    def on_tab1_pushButton_open2_clicked(self):
        folder = self.tab1_lineEdit2.text()
        if folder == "":
            self.statusBar_function('未选择文件夹路径',2000)
            return
        os.startfile(folder)
    
    # 转化功能按钮
    @pyqtSlot()
    def on_tab1_pushButton_zhuanhua_clicked(self):
        # 获取图片单张或者批量参数
        shuju1 = self.tab1_comboBox1.currentText()
        # 获取图片转化格式
        geshi  =self.tab1_comboBox2.currentText()
        
        savepath = self.tab1_lineEdit2.text()
        if shuju1 == "单张":
            if self.current_img_path_show ==None:
                self.statusBar_function('未选择图片路径',2000)
                return
            elif self.current_img_path_show == False:
                self.statusBar_function('需要先打开图片',2000)
                return
            if savepath == "":
                self.statusBar_function('未选择转化图片后的保存路径',2000)
                return
            else:
                if os.path.exists(savepath) == False:
                    self.statusBar_function('保存路径填写异常',2000)
                    return
            paths = [self.current_img_path_show,geshi,savepath]
            # 将当前图片转化,保存至保存路径
            self.thread_1 = RunThread(parent="one_image_change",msg=paths)
            self.thread_1.trigger.connect(self.send_information)
            self.thread_1.start()
        elif shuju1 == "批量":
            xuanzhepath = self.tab1_lineEdit1.text()
            if os.path.isdir(xuanzhepath) == False:
                self.statusBar_function('请选择图片保存的文件夹路径',2000)
                return
            if savepath == "":
                self.statusBar_function('未选择转化图片后的保存路径',2000)
                return
            else:
                if os.path.exists(savepath) == False:
                    self.statusBar_function('保存路径填写异常',2000)
                    return
            
            paths = [xuanzhepath,geshi,savepath]
            # 将当前文件夹内的所有图片转化,保存至保存路径   
            self.thread_2 = RunThread(parent="more_image_change",msg=paths)
            self.thread_2.trigger.connect(self.send_information)
            self.thread_2.start()
        
    # 修改图片的分辨率
    @pyqtSlot()
    def on_tab1_pushButton_xiugai_clicked(self):
        # 图片路径或者文件夹路径
        path1 =self.tab1_lineEdit1.text()
        if os.path.isfile(path1):
            # 获取选择
            xuanzhe = self.tab1_comboBox3.currentText()
            if xuanzhe == "单张":
                pass
            else:
                self.statusBar_function('分辨率:应选择单张选项',2000)
                return
        elif os.path.isdir(path1):
            # 获取选择
            xuanzhe = self.tab1_comboBox3.currentText()
            if xuanzhe == "批量":
                pass
            else:
                self.statusBar_function('分辨率:应选择批量选项',2000)
                return
        else:
            self.statusBar_function('分辨率:图片路径选择异常',2000)
            return
        # 获取分辨率
        width_high = self.tab1_lineEdit3.text()
        if "," in width_high:
            w_h = tuple(width_high.split(","))
        elif "," in width_high:
            w_h = tuple(width_high.split(","))
        else:
            self.statusBar_function('分辨率:宽度和高度参数设置异常',2000)
            return
        # 保存路径
        save_path = os.getcwd()
        save_path = save_path+"//图片修改分辨率保存" +"//{}X{}".format(w_h[0],w_h[1])
        if not os.path.exists(save_path):
            os.makedirs(save_path)
        shujulist = [xuanzhe,path1,w_h,save_path]
        self.thread_2 = RunThread(parent="resize_images",msg=shujulist)
        self.thread_2.trigger.connect(self.send_information)
        self.thread_2.start()

    '''图片格式化===end'''
    
    '''共用函数 -- start'''
    def get_time(self):
        shijian = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
        return shijian

    def send_information(self,text=[]):
        #接收信息
        time_now = self.get_time()
        if text[0] == "0":
            self.textBrowser.append("<font color=\"#0000FF\">{}:检测IP地址连通.....</font> ".format(time_now))   # 设置字体颜色
        elif text[0] == "info":
            self.textBrowser.append("{}:{}".format(time_now,text[1]))
        elif text[0] == "prompt":
            time_now = ("<font color=\"#FF0000\">{}:</font> ".format(time_now)) 
            if text[2] == None:
                self.textBrowser.append("{}<font color=\"#0000FF\">{}</font> ".format(time_now,text[1]))  # 设置字体颜色
            elif text[2] == "3":
                self.tab3_textBrowser_1.append("{}<font color=\"#0000FF\">{}</font> ".format(time_now,text[1]))  # 设置字体颜色
            elif text[2] == "4":
                self.tab4_textBrowser.append("{}<font color=\"#0000FF\">{}</font> ".format(time_now,text[1]))  # 设置字体颜色
        elif text[0] == "read":
            if text[2] == None:
                self.textBrowser.append("<font color=\"#FF0000\">{}:{}</font> ".format(time_now,text[1]))  # 设置字体颜色
            elif text[2] == "3":
                self.tab3_textBrowser_1.append("{}<font color=\"#0000FF\">{}</font> ".format(time_now,text[1]))  # 设置字体颜色
            elif text[2] == "4":
                self.tab4_textBrowser.append("{}<font color=\"#0000FF\">{}</font> ".format(time_now,text[1]))  # 设置字体颜色
        elif text[0] == "green":
            time_now = ("<font color=\"#FF0000\">{}:</font> ".format(time_now)) 
            self.textBrowser.append("{}<font color=\"#00C957\">{}</font> ".format(time_now,text[1]))  # 设置字体颜
        elif text[0] == "自动打开文件夹":
            os.startfile(text[1])
        elif text[0] == "img_path":
            path0 = text[1]
            self.set_img_show(path0)
        elif text[0] == "change_bofang":
            self.tab3_pushButton3.setText("播放")
            if "音频设备初始化错误!" in text[1]:
                return
            # 重复播放
            if self.music_ret == True:
                self.on_tab3_pushButton3_clicked()
    '''共用函数  --end'''


    '''图片转GIG ---start'''
    def chushihua_funtion(self):
        self.tab2_listWidget1.itemDoubleClicked.connect(self.additem) #绑定点击事件
        self.tab2_listWidget1.itemClicked.connect(self.showimg)
        self.tab2_listWidget2.setMovement(QListView.Free)
        self.tab2_listWidget2.setDragDropMode(QListView.InternalMove)
        self.tab2_listWidget2.itemDoubleClicked.connect(self.showitem) #绑定点击事件
        self.giffution()

    def giffution(self):
        self.tab2_listWidget1.clear()
        self.tab2_pushButton_play.setEnabled(False)
    
    def showimg(self):
        selected_item = self.tab2_listWidget1.currentItem()
        if selected_item:
            item_text = selected_item.text()
            print(item_text)
        if self.tab2_checkBox_1.isChecked():
            path = self.tab2_lineEdit_1.text()
            self.tab2_label_show.setPixmap(QPixmap(path + "/" + item_text))
            self.tab2_label_show.setScaledContents(True)

    # 图片显示至列表
    def show_list(self):
        add_list = self.tab2_listWidget1
        folder_path = QFileDialog.getExistingDirectory(self, "选择文件夹")
        if folder_path == "":
            return
        add_list.clear()
        self.tab2_lineEdit_1.setText(folder_path)
        # 查找文件夹中的图片
        listfiles = os.listdir(folder_path)
        for imagefile in listfiles:
            for shuju in self.img_name:
                if shuju in imagefile:
                    add_list.addItem(imagefile)

    # 显示列表1中的功能,双击后,将数据填写在list2
    def additem(self):
        selected_item = self.tab2_listWidget1.currentItem()
        if selected_item:
            item_text = selected_item.text()
            print(item_text)
            self.tab2_listWidget2.addItem(item_text)
            self.statusBar_function('成功添加{}'.format(item_text),2000,"green")
    
    def showitem(self):
        selected_item = self.tab2_listWidget2.currentItem()
        if selected_item:
            item_text = selected_item.text()
            # print(item_text)
        number = self.tab2_listWidget2.currentRow()
        self.tab2_listWidget2.takeItem(number)
        self.statusBar_function('成功删除{}'.format(item_text),2000)

    # 获取需要组合的图片列表
    def get_images_liebiao(self):
        items = []
        for i in range(self.tab2_listWidget2.count()):
            items.append(self.tab2_listWidget2.item(i).text())
        print(items)
        if items == []:
            self.statusBar_function('图片未正确选择!',2000)
            return
        path_use = self.tab2_lineEdit_1.text()
        # 修改图片为统一分辨率
        new_path = self.resize_image(path_use,items)
        
        new_imgslist = os.listdir(new_path)
        
        gif_name = self.get_gifname(new_imgslist)
        duration = self.get_dur()
        savepath = self.get_path()
        if duration == None or savepath == None:
            return
        self.create_gif(new_imgslist,gif_name,duration,new_path)
        # 删除创建的目录
        time.sleep(0.5)
        shutil.rmtree(new_path)
        print("完成删除动作") 
    
    '''# 统一分辨率'''
    # 文件夹 files:图片列表
    def resize_image(self,path,files):  
        # 获取输入文件夹中的所有文件
        output_dir =  path +"/savefilesnow"
        # 判断输出文件夹是否存在,不存在则创建
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
        for file in files:
            img = Image.open(path +"\\"+ file)
            if img.mode == "P":
                img = img.convert('RGB')
            if img.mode == "RGBA":
                img = img.convert('RGB')
            # 宽度 高度
            img = img.resize((700, 500), Image.LANCZOS)
            img.save(os.path.join(output_dir, file))
            print(str(file) + " :图片分辨率更改成功!")
        return output_dir
    

    '''创作GIF图片'''
    # 图片列表,GIF名称,延时时间(单位毫秒),保存路径
    def create_gif(self,images, gif_name, duration,paths): 
        frames = []
        for image_name in images:
            frames.append(imageio.imread(paths + "/{}".format(image_name))) #传递图片路径给画面
        imageio.mimsave(gif_name, frames, 'GIF', duration=duration,loop=0, disposal=2)
        self.statusBar_function("GIF成功保存!",3000,"green")
        self.tab2_lineEdit_4.setText(gif_name)
        self.tab2_pushButton_play.setEnabled(True)
    
    # 生成GIF按钮
    @pyqtSlot()
    def on_tab2_pushButton_make_clicked(self):
        self.get_images_liebiao()

    # 获取延时
    def get_dur(self):
        shuju = self.tab2_lineEdit_3.text()
        if shuju.isdigit():
            return float(shuju)*1000
        else:
            self.statusBar_function("延时设置错误!",3000)
            return None
    
    # 获取保存GIF路径
    def get_path(self):
        path = self.tab2_lineEdit_2.text()
        if path == "" or path == None:
            self.statusBar_function("GIF图片保存文件夹填写异常!",3000)
            return None
        if not os.path.exists(path):
            os.makedirs(path)
        return path

    # 获取GIF名称
    def get_gifname(self,path=None):
        if self.tab2_checkBox_2.isChecked():
            savepath = self.get_path()
            if savepath == "" or savepath == None:
                self.statusBar_function("GIF图片保存文件夹填写异常!",3000)
                return
            shijian = time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime())
            gifname= savepath + "/" +shijian+".gif"
            return gifname
        else:
            savepath = self.get_path()
            if  savepath == "" or savepath == None:
                self.statusBar_function("GIF图片保存文件夹填写异常!",3000)
                return
            gifname= savepath +"/"+ str(path[0]).split(".")[0]+".gif"
            return gifname

    @pyqtSlot()
    def on_tab2_pushButton_1_clicked(self):
        self.show_list()
    
    @pyqtSlot()
    def on_tab2_pushButton_2_clicked(self):
        folder_path = QFileDialog.getExistingDirectory(self, "选择文件夹")
        if folder_path == "":
            return
        self.tab2_lineEdit_2.setText(folder_path)

    @pyqtSlot()
    def on_tab2_pushButton_3_clicked(self):
        path = os.getcwd()
        fileInfo = QFileDialog.getOpenFileName(self, "选择文件", path,'Image files ( *.gif)')
        if fileInfo[0] == "":
            return
        else:
            self.tab2_lineEdit_4.setText(fileInfo[0])
            self.tab2_pushButton_play.setEnabled(True)
    
    @pyqtSlot()
    def on_tab2_pushButton_play_clicked(self):
        path = self.tab2_lineEdit_4.text()
        movie = QMovie(path)
        self.tab2_label_show.setMovie(movie)
        self.tab2_label_show.setScaledContents(True)
        if self.tab2_pushButton_play.text() == "播放":
            movie.start()
            self.tab2_pushButton_play.setText("暂停")
        elif self.tab2_pushButton_play.text() == "暂停":
            movie.stop()
            self.tab2_pushButton_play.setText("播放")
        

    '''图片转GIf ---end'''

    '''图片轮播,插入音频 --- start'''
    @pyqtSlot()
    def on_tab3_pushButton1_clicked(self):
        folder_path = QFileDialog.getExistingDirectory(self, "选择文件夹")
        if folder_path == "":
            return
        self.tab3_lineEdit1.setText(folder_path)

        # 获取时间
        shijian = self.tab3_comboBox1.currentText()
        # 创建右键菜单
        self.tab3_label1.setContextMenuPolicy(Qt.CustomContextMenu)
        self.tab3_label1.customContextMenuRequested.connect(self.show_menu)
            
        # 启动QT线程    
        self.thread_3 = RunThread(parent="images_bofang",msg=[folder_path,shijian])
        self.thread_3.trigger.connect(self.send_information)
        self.thread_3.set_bofang_ret(zhuangtai=True)
        self.thread_3.start()
        self.tab3_pushButton1.setDisabled(True)
        
    def set_img_show(self,path=None):
        try:
            self.tab3_label1.setPixmap(QPixmap(path))
            self.tab3_label1.setScaledContents(True)
        except Exception as error:
            print("错误异常:",error)

    # Qlable中添加右键菜单
    def show_menu(self, pos):
        menu = QMenu(self)
        action1 = QAction('播放', self)
        action2 = QAction('暂停', self)
        action3 = QAction('结束播放', self)
        menu.addAction(action1)
        menu.addAction(action2)
        menu.addAction(action3)
        action1.triggered.connect(self.set_thread_ret0)
        action2.triggered.connect(self.set_thread_ret1)
        action3.triggered.connect(self.set_thread_ret2)
        menu.exec_(self.tab3_label1.mapToGlobal(pos))
       
    def set_thread_ret0(self):
        self.thread_3.set_bofang_ret(zhuangtai=True)

    def set_thread_ret1(self):
        self.thread_3.set_bofang_ret(zhuangtai=False)

    def set_thread_ret2(self):
        self.thread_3.set_bofang_ret(zhuangtai="break")
        time.sleep(0.5)
        self.tab3_pushButton1.setDisabled(False)
        self.statusBar_function('结束播放!',2000)

    # 播放音乐
    @pyqtSlot()
    def on_tab3_pushButton3_clicked(self):
        caozuo = self.tab3_pushButton3.text()
        if caozuo == "播放":
            file = self.tab3_lineEdit2.text()
            # 启动QT线程    
            self.thread_4 = RunThread(parent="music_bofang",msg=[file])
            self.thread_4.trigger.connect(self.send_information)
            self.thread_4.start()
            self.tab3_pushButton3.setText("循环")
            self.music_ret = True
            self.tab3_textBrowser_1.append("<font color=\"#0000FF\">{}:循环播放音乐中...</font> ".format(self.get_time()))   # 设置字体颜色"
        elif caozuo == "循环":
            self.tab3_pushButton3.setText("停止")
        elif caozuo == "停止":
            self.thread_4.set_caozuo_ret()
            self.tab3_pushButton3.setText("播放")
            self.music_ret = False
            self.tab3_textBrowser_1.append("<font color=\"#0000FF\">{}:暂停播放音乐!</font> ".format(self.get_time()))   # 设置字体颜色"

    # 播放音乐路径
    @pyqtSlot()
    def on_tab3_pushButton2_clicked(self):
        path = os.getcwd()
        fileInfo = QFileDialog.getOpenFileName(self, "选择文件", path,'music file (*)')
        if fileInfo[0] == "":
            return
        self.tab3_lineEdit2.setText(fileInfo[0])
        self.tab3_pushButton3.setEnabled(True)
       

    
    # 保存视频路径
    @pyqtSlot()
    def on_tab3_pushButton4_clicked(self):
        path = os.getcwd()
        folder_path = QFileDialog.getExistingDirectory(self, "选择文件夹")
        if folder_path == "":
            return
        self.tab3_lineEdit3.setText(folder_path)
        self.tab3_pushButton5.setEnabled(True)

    # 合成视频
    @pyqtSlot()
    def on_tab3_pushButton5_clicked(self):
        # 判断前提条件

        # 保存路径
        save_file = self.tab3_lineEdit3.text() 
        # 多图片路径
        images = self.tab3_lineEdit1.text()
        # 音乐路径
        music_file =self.tab3_lineEdit2.text()

        # 帧率设置
        fps = float(self.tab3_lineEdit1_2.text())
        if type(fps)== float:
            pass
        else:
            self.statusBar_function("帧率数值设置异常!",3000)
            return

        # 启动QT线程    
        self.thread_5 = RunThread(parent="video_create",msg=[images,music_file,save_file])
        self.thread_5.trigger.connect(self.send_information)
        self.thread_5.start()

    '''图片轮播,插入音频 --- end'''



    '''视频播放+转图片----start'''
    def video_int(self):
        self.starttime = None
        self.tab4_lineEdit1.setDisabled(True)
        self.tab4_lineEdit2.setDisabled(True)
        self.tab4_pushButton_split_image.setDisabled(True)
        self.tab4_pushButton_split_video.setDisabled(True)

    def video_set(self):
        # 进度条
        self.player.durationChanged.connect(self.getDuration)
        self.player.positionChanged.connect(self.getPosition)
        self.horizontalSlider.sliderMoved.connect(self.updatePosition)
        self.tab4_pushButton_split_image.setDisabled(False)
        self.tab4_pushButton_split_video.setDisabled(False)

    # 浏览播放视频
    @pyqtSlot()
    def on_tab4_pushButton_1_clicked(self):
        ret = self.video_funtion()
        if ret == True:
            self.video_set()

    def video_funtion(self):
        path = QFileDialog.getOpenFileUrl()[0]
        print(path.fileName(),type(path))
        print(path.path())
        if path.fileName() == "" or "mp4" not in path.fileName():
            self.statusBar_function("视频文件加载出错!",3000)
            return False
        try:
            self.player.setMedia(QMediaContent(path))  # 选取视频文件
            self.player.play() 
            self.video_paths = path.path().replace("/","",1)
            self.tab4_pushButton_pause.setText("暂停")
            self.send_information(text=["prompt","开始播放...","4"])
        except Exception:
            error = traceback.format_exc()
            print(error)
            self.statusBar_function("视频文件加载出错!",3000)
            return False
        return True       

     # 播放和暂停视频
    def playPause(self):
        if self.player.state()==1:
            self.player.pause()
            self.tab4_pushButton_pause.setText("播放")
            self.send_information(text=["prompt","暂停播放!","4"])
        else:
            self.player.play()
            self.tab4_pushButton_pause.setText("暂停")
            self.send_information(text=["prompt","开始播放...","4"])

    # 视频总时长获取
    def getDuration(self, d):
        '''d是获取到的视频总时长(ms)'''
        self.horizontalSlider.setRange(0, d)
        self.horizontalSlider.setEnabled(True)
        self.max_videotime =d
        self.displayTime(d)
    
    # 视频实时位置获取
    def getPosition(self, p):
        self.horizontalSlider.setValue(p)
        # self.displayTime(self.horizontalSlider.maximum()-p)
        self.displayTime(p)
        if p == self.horizontalSlider.maximum():
            self.tab4_pushButton_pause.setText("播放")
        self.media_status_changed()

    # 显示剩余时间
    def displayTime(self, ms):
        minutes = int(ms/60000)
        seconds = int((ms-minutes*60000)/1000)
        self.tab4_baifenbi.setText('{}:{}/{}:{}'.format(minutes,seconds,minutes,int(self.max_videotime/1000)))
        # 记录时间
        self.starttime = '{}:{}'.format(minutes,seconds)

    # 用进度条更新视频位置
    def updatePosition(self, v):
        self.player.setPosition(v)
        self.displayTime(self.horizontalSlider.maximum()-v)

    def media_status_changed(self):
        frame_rate = self.player.metaData(QMediaMetaData.VideoFrameRate)
        # print("Frame rate:", frame_rate)

    # 选择当前开始时间
    @pyqtSlot()
    def on_tab4_pushButton_2_clicked(self):
        print(self.starttime)
        if self.starttime == None:
            self.statusBar_function(text="未选择播放视频!",time=3000)
            return
        self.tab4_lineEdit1.setText(self.starttime)
    
    # 选择结束时间
    @pyqtSlot()
    def on_tab4_pushButton_3_clicked(self):
        print(self.starttime)
        if self.starttime == None:
            self.statusBar_function(text="未选择播放视频!",time=3000)
            return
        self.tab4_lineEdit2.setText(self.starttime)

    # 分割图片
    @pyqtSlot()
    def on_tab4_pushButton_split_image_clicked(self):
        if self.tab4_lineEdit1.text() == "" or self.tab4_lineEdit2.text() =="":
            self.statusBar_function(text="未选择起止时间!")
            return
        self.split_video_img()    

    def split_video_img(self):
        # 需要传递的数据,视频路径,开始时间和结束时间
        folder_path = self.video_paths
        starttimes = self.tab4_lineEdit1.text()
        endtimes = self.tab4_lineEdit2.text()
        shijian = [starttimes,endtimes]
        # 启动QT线程   
        self.thread_tab41 = RunThread(parent="split_video_img",msg=[folder_path,shijian])
        self.thread_tab41.trigger.connect(self.send_information)
        self.thread_tab41.start()
      

    # 分割视频
    @pyqtSlot()
    def on_tab4_pushButton_split_video_clicked(self):
        if self.tab4_lineEdit1.text() == "" or self.tab4_lineEdit2.text() =="":
            self.statusBar_function(text="未选择起止时间!")
            return
        self.split_video()

    def split_video(self):
        # 需要传递的数据,视频路径,开始时间和结束时间
        folder_path = self.video_paths
        starttimes = self.return_startvideo_time()
        endtimes = self.return_endvideo_time()
        shijian = [starttimes,endtimes]

        self.thread_tab42 = RunThread(parent="split_video",msg=[folder_path,shijian])
        self.thread_tab42.trigger.connect(self.send_information)
        self.thread_tab42.start()

    def return_startvideo_time(self):
        starttimes = self.tab4_lineEdit1.text().split(":")
        starttime = float(starttimes[0])*60 + float(starttimes[1])
        return starttime
    
    def return_endvideo_time(self):
        starttimes = self.tab4_lineEdit2.text().split(":")
        starttime = float(starttimes[0])*60 + float(starttimes[1])
        return starttime

    '''视频播放+转图片----end'''
    
    # 状态栏显示
    def statusBar_function(self,text,time=2000,color=None):
        palette = self.statusBar().palette()
        if color == None:
            # 修改字体颜色
            palette.setColor(QPalette.WindowText, QColor(255, 0, 0))
        elif color == "green":
            # 修改字体颜色
            palette.setColor(QPalette.WindowText, QColor(0, 255, 0))
        self.statusBar().setPalette(palette)
        self.statusBar().showMessage(text,time)
    
    # 重新启动APP
    def restartApp(self):
        python = sys.executable
        os.execl(python, python, *sys.argv)


    def set_data(self, mes):  # 接收进度线程的计算结果
        self.statusBar_function(mes)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    # 设置应用程序的风格
    app.setStyle('Fusion')
    w = LoadWin()
    w.show()
    ui2 = Power_test()
    sys.exit(app.exec_())

6.2 业务逻辑程序代码;【qtthread.py】

from PyQt5.QtCore import pyqtSignal,QThread
from PIL import Image
import traceback
import os
import time
from pygame import mixer
from moviepy.editor import *
from moviepy.audio.io.AudioFileClip import AudioFileClip


#业务线程
class RunThread(QThread):
  # 通过类成员对象定义信号对象
  # _signal = pyqtSignal(str)

  trigger = pyqtSignal(list)

  def __init__(self, parent=None,msg=None):
      super(RunThread, self).__init__()
      self.parent = parent
      self.msg = msg

  # def __del__(self): #等待
  #   self.wait()    

  '''处理业务逻辑'''
  def run(self):
      #识别业务命令,在进行执行
      try:
        if self.parent == "one_image_change":
          self.oneimagechange()
        elif self.parent == "more_image_change":
          self.moreimagechange()
        elif self.parent == "resize_images":
          self.xiugai_fenbianlv()
        elif self.parent == "images_bofang":
          self.images_bofang()        
          self.bofang_ret= None
        elif self.parent == "music_bofang":
          self.music_play()
          self.caozuo_ret = None
        elif self.parent == "video_create":
          self.video_create()
        elif self.parent == "split_video":
          self.split_video()
        elif self.parent == "split_video_img":
          self.split_video_img()
          
      except Exception:
        errors = traceback.format_exc()
        print(errors)


  # 单张图片转化
  def oneimagechange(self):
      img = self.msg[0]        # 输入转换前的图片存放路径
      name  = str(img).split("/")[-1].split(".")[0]
      strs = self.msg[2]  
      output = strs + "/{}.{}".format(name,self.msg[1]) # 转换后的格式
      im = Image.open(img)
      im.save(output)#保存图片
      self.send_emit(change="green",result="图片转化成功--" + output)
  
  # 多张图片转化
  def moreimagechange(self):
      # 图片存放文件夹目录
      files_saveimage = self.msg[0]
      images = os.listdir(files_saveimage)
      # 选择的格式
      geshi = self.msg[1]
      # 图片转化后保存的文件夹目录
      savepath = self.msg[2]
      if os.path.exists(savepath+"/"+geshi):
          pass
      else:
          os.mkdir(savepath+"/"+geshi)   
      for i in images:
          img = str(files_saveimage +"/" +i)
          name = str(img).split("/")[-1].split(".")[0]
          output =  savepath+"/"+geshi +"/" + name + ".{}".format(geshi) # 转换后的格式
          im = Image.open(img)
          im.save(output) # 保存图片
          self.send_emit(change="green",result="图片转化成功---" + output)
          time.sleep(0.1)
    
  # 分辨率转化
  def xiugai_fenbianlv(self):
    xuanzhe = self.msg[0]
    input_image_path = self.msg[1]
    new_width,new_height = self.msg[2] # 给元组
    output_image_path = self.msg[3]
    if  xuanzhe == "单张":
          imgname = str(input_image_path).split("/")[-1]
          image = Image.open(input_image_path)
          resized_image = image.resize((int(new_width), int(new_height)))
          resized_image.save(output_image_path +"/{}".format(imgname))
          self.send_emit(change="green",result="图片分辨率修改成功:" + output_image_path +"/{}".format(imgname))
    elif xuanzhe == "批量":
      imglist = os.listdir(input_image_path)
      for img in imglist:
        print(img)  
        image = Image.open(input_image_path + "/{}".format(img))
        resized_image = image.resize((int(new_width), int(new_height)))
        resized_image.save(output_image_path + "/{}".format(img)) 
      self.send_emit(change="green",result="图片分辨率修改成功:" + output_image_path)
      self.send_emit(change="自动打开文件夹" ,result=output_image_path)

  # 图片轮播
  def images_bofang(self):
    path =self.msg[0]
    shijina = float(self.msg[1])
    # 图片自动轮播
    images = os.listdir(path)
    while True:
      if self.bofang_ret== None or self.bofang_ret== False:
        time.sleep(1)
        print("检查中")
        continue
      elif self.bofang_ret== True:
        for image in images:
          time.sleep(shijina)
          self.send_emit(change="img_path",result="{}".format(path+"/"+image))
      elif self.bofang_ret== "break": 
        print("播放结束!")
        break

  # 修改状态
  def set_bofang_ret(self,zhuangtai=None):
    self.bofang_ret= zhuangtai

  # 停止播放音乐
  def set_caozuo_ret(self):
    mixer.music.stop()
    # 发送信息

  def send_emit(self,change="info",result="",tab=None):
    self.trigger.emit([change, result,tab])

  # 播放音乐
  def music_play(self):
    try:
      file =self.msg[0]
      print("路径:" +file)
      mixer.init()
    except Exception as error:
      print(error)
      self.send_emit(change="change_bofang",result="{}:音频设备初始化错误!".format(error))
      return
    mixer.music.load(file)
    # 设置音乐播放完成事件
    mixer.music.set_endevent()
    mixer.music.set_volume(5)
    mixer.music.play()
    shuju = mixer.music.get_busy() 
    print(shuju)
    # 获取音乐时长
    length = mixer.Sound(file).get_length()
    self.send_emit(change="prompt",result="播放音乐时长:{}".format(length/60),tab="3")
    # 监听事件
    while True: 
      ret = mixer.music.get_busy()
      if ret == True:
        continue
      else:
        print('音乐播放完成')
        self.send_emit(change="change_bofang",result="播放")
        mixer.music.stop()
        break
  
  #  生成视频
  def video_create(self):
    fps = 0.5
    image_path = self.msg[0]
    music_path = self.msg[1]
    save_path  = self.msg[2]
    print(image_path)
    print(music_path)
    print(save_path)

    try:
      # 循环遍历图片
      images = os.listdir(image_path)
      clip = ImageSequenceClip([os.path.join(image_path, img)for img in images], fps=fps)
      path = save_path + "./{}.mp4".format(self.get_time())
      clip.write_videofile(path)

      video = VideoFileClip(path)
      audio = AudioFileClip(music_path)
      video_duration = video.duration
      # 获取音频长度
      audio_duration = audio.duration
      self.send_emit(change="prompt",result="音频长度:{}".format(audio_duration),tab="3")
      # 长度必须保持一致
      if audio_duration > video_duration:
        audio = audio.subclip(0, video_duration)

      newvideo = video.set_audio(audio)
      newvideo.write_videofile(path)
      
      self.send_emit(change="prompt",result="视频合成完成:{}".format(path),tab="3")
    except Exception as error:
      print(error)
      self.send_emit(change="read",result="{}".format(error),tab="3")

  def get_time(self):
    shijian = time.strftime('%Y%m%d%H%M%S', time.localtime())
    return shijian
  

  def split_video(self):
    folder_path = self.msg[0]
    video = VideoFileClip(folder_path)
    # 定义剪辑的起始和结束时间(以秒为单位)
    start_time = self.msg[1][0]
    end_time = self.msg[1][1]

    # 对视频进行剪辑 ,开始时间,结束时间
    clipped_video = video.subclip(start_time, end_time)

    # 创建文件路径
    path = os.getcwd() + "/分割视频"
    if os.path.isdir(path):
      pass
    else:
      os.mkdir(path)
    # 导出视频
    savepath = path + "/output{}.mp4".format(self.get_time())
    clipped_video.write_videofile(savepath)
    self.send_emit(change="prompt",result="分割视频已完成:{}".format(savepath),tab="4")


  def split_video_img(self):
    folder_path = self.msg[0]
    # 定义剪辑的起始和结束时间(以秒为单位)
    start_time = self.msg[1][0]
    end_time = self.msg[1][1]
    time = 0
    dir='./分割图片/'
    if os.path.isdir(dir):
      pass
    else:
      os.mkdir(dir)
    # 对视频进行剪辑 ,开始时间,结束时间
    video = VideoFileClip(folder_path)
    clipped_video = video.subclip(start_time, end_time)

    videotimes = video.duration
    print("视频时长:",videotimes)
    frames = int(float(videotimes)/0.5)

    for i in range(1,frames+1):
      filename = os.path.join(dir+str(i)+'.jpg')
      time = time + 0.5
      clipped_video.save_frame(filename,t=time)
    self.send_emit(change="prompt",result="分割图片已完成:{}".format(dir),tab="4")

6.3 加载界面py文件;【loadwin_ui.py】

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'f:\personaldata\img_video_chuli_gongju\UI_files\loadwin.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_loadwin(object):
    def setupUi(self, loadwin):
        loadwin.setObjectName("loadwin")
        loadwin.resize(455, 349)
        self.gridLayout = QtWidgets.QGridLayout(loadwin)
        self.gridLayout.setObjectName("gridLayout")
        self.label_logo = QtWidgets.QLabel(loadwin)
        self.label_logo.setMinimumSize(QtCore.QSize(0, 280))
        self.label_logo.setText("")
        self.label_logo.setObjectName("label_logo")
        self.gridLayout.addWidget(self.label_logo, 0, 0, 1, 1)
        self.label_info = QtWidgets.QLabel(loadwin)
        self.label_info.setObjectName("label_info")
        self.gridLayout.addWidget(self.label_info, 1, 0, 1, 1)
        self.progressBar = QtWidgets.QProgressBar(loadwin)
        self.progressBar.setProperty("value", 24)
        self.progressBar.setObjectName("progressBar")
        self.gridLayout.addWidget(self.progressBar, 2, 0, 1, 1)

        self.retranslateUi(loadwin)
        QtCore.QMetaObject.connectSlotsByName(loadwin)

    def retranslateUi(self, loadwin):
        _translate = QtCore.QCoreApplication.translate
        loadwin.setWindowTitle(_translate("loadwin", "Form"))
        self.label_info.setText(_translate("loadwin", "TextLabel"))

6.4 主界面py程序代码;【show_img_ui.py】

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'f:\personaldata\img_video_chuli_gongju\UI_files\show_img.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(605, 535)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout_5 = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout_5.setObjectName("gridLayout_5")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.tab)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.tab1_checkBox = QtWidgets.QCheckBox(self.tab)
        self.tab1_checkBox.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_checkBox.setObjectName("tab1_checkBox")
        self.gridLayout_3.addWidget(self.tab1_checkBox, 0, 5, 1, 1)
        self.tab1_pushButton2 = QtWidgets.QPushButton(self.tab)
        self.tab1_pushButton2.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_pushButton2.setObjectName("tab1_pushButton2")
        self.gridLayout_3.addWidget(self.tab1_pushButton2, 1, 3, 1, 1)
        self.tab1_pushButton_open2 = QtWidgets.QPushButton(self.tab)
        self.tab1_pushButton_open2.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_pushButton_open2.setObjectName("tab1_pushButton_open2")
        self.gridLayout_3.addWidget(self.tab1_pushButton_open2, 1, 4, 1, 1)
        self.tab1_label3 = QtWidgets.QLabel(self.tab)
        self.tab1_label3.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_label3.setFrameShape(QtWidgets.QFrame.Panel)
        self.tab1_label3.setFrameShadow(QtWidgets.QFrame.Raised)
        self.tab1_label3.setObjectName("tab1_label3")
        self.gridLayout_3.addWidget(self.tab1_label3, 7, 0, 1, 1)
        self.tab1_label1 = QtWidgets.QLabel(self.tab)
        self.tab1_label1.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_label1.setFrameShape(QtWidgets.QFrame.Panel)
        self.tab1_label1.setFrameShadow(QtWidgets.QFrame.Raised)
        self.tab1_label1.setObjectName("tab1_label1")
        self.gridLayout_3.addWidget(self.tab1_label1, 0, 0, 1, 1)
        self.tab1_comboBox1 = QtWidgets.QComboBox(self.tab)
        self.tab1_comboBox1.setObjectName("tab1_comboBox1")
        self.tab1_comboBox1.addItem("")
        self.tab1_comboBox1.addItem("")
        self.gridLayout_3.addWidget(self.tab1_comboBox1, 2, 7, 1, 1)
        self.tab1_pushButton_down = QtWidgets.QPushButton(self.tab)
        self.tab1_pushButton_down.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_pushButton_down.setObjectName("tab1_pushButton_down")
        self.gridLayout_3.addWidget(self.tab1_pushButton_down, 7, 2, 1, 1)
        self.tab1_pushButton_zhuanhua = QtWidgets.QPushButton(self.tab)
        self.tab1_pushButton_zhuanhua.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_pushButton_zhuanhua.setObjectName("tab1_pushButton_zhuanhua")
        self.gridLayout_3.addWidget(self.tab1_pushButton_zhuanhua, 4, 7, 1, 1)
        self.tab1_pushButton1 = QtWidgets.QPushButton(self.tab)
        self.tab1_pushButton1.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_pushButton1.setObjectName("tab1_pushButton1")
        self.gridLayout_3.addWidget(self.tab1_pushButton1, 0, 3, 1, 1)
        self.tab1_label2 = QtWidgets.QLabel(self.tab)
        self.tab1_label2.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_label2.setFrameShape(QtWidgets.QFrame.Panel)
        self.tab1_label2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.tab1_label2.setObjectName("tab1_label2")
        self.gridLayout_3.addWidget(self.tab1_label2, 1, 0, 1, 1)
        self.tab1_lineEdit1 = QtWidgets.QLineEdit(self.tab)
        self.tab1_lineEdit1.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_lineEdit1.setStyleSheet("background-color: rgb(213, 213, 213);")
        self.tab1_lineEdit1.setObjectName("tab1_lineEdit1")
        self.gridLayout_3.addWidget(self.tab1_lineEdit1, 0, 1, 1, 2)
        self.tab1_lineEdit2 = QtWidgets.QLineEdit(self.tab)
        self.tab1_lineEdit2.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_lineEdit2.setObjectName("tab1_lineEdit2")
        self.gridLayout_3.addWidget(self.tab1_lineEdit2, 1, 1, 1, 2)
        self.tab1_comboBox2 = QtWidgets.QComboBox(self.tab)
        self.tab1_comboBox2.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_comboBox2.setStyleSheet("background-color: rgb(0, 170, 0);")
        self.tab1_comboBox2.setObjectName("tab1_comboBox2")
        self.tab1_comboBox2.addItem("")
        self.tab1_comboBox2.addItem("")
        self.tab1_comboBox2.addItem("")
        self.tab1_comboBox2.addItem("")
        self.tab1_comboBox2.addItem("")
        self.gridLayout_3.addWidget(self.tab1_comboBox2, 3, 7, 1, 1)
        self.tab1_pushButton_up = QtWidgets.QPushButton(self.tab)
        self.tab1_pushButton_up.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_pushButton_up.setObjectName("tab1_pushButton_up")
        self.gridLayout_3.addWidget(self.tab1_pushButton_up, 7, 1, 1, 1)
        self.tab1_pushButton_open1 = QtWidgets.QPushButton(self.tab)
        self.tab1_pushButton_open1.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_pushButton_open1.setObjectName("tab1_pushButton_open1")
        self.gridLayout_3.addWidget(self.tab1_pushButton_open1, 0, 4, 1, 1)
        self.textBrowser = QtWidgets.QTextBrowser(self.tab)
        self.textBrowser.setMaximumSize(QtCore.QSize(150, 16777215))
        self.textBrowser.setObjectName("textBrowser")
        self.gridLayout_3.addWidget(self.textBrowser, 5, 7, 1, 1)
        self.tab1_comboBox3 = QtWidgets.QComboBox(self.tab)
        self.tab1_comboBox3.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_comboBox3.setObjectName("tab1_comboBox3")
        self.tab1_comboBox3.addItem("")
        self.tab1_comboBox3.addItem("")
        self.gridLayout_3.addWidget(self.tab1_comboBox3, 7, 3, 1, 1)
        self.tab1_pushButton_xiugai = QtWidgets.QPushButton(self.tab)
        self.tab1_pushButton_xiugai.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_pushButton_xiugai.setObjectName("tab1_pushButton_xiugai")
        self.gridLayout_3.addWidget(self.tab1_pushButton_xiugai, 7, 7, 1, 1)
        self.tab1_lineEdit3 = QtWidgets.QLineEdit(self.tab)
        self.tab1_lineEdit3.setMinimumSize(QtCore.QSize(0, 25))
        self.tab1_lineEdit3.setObjectName("tab1_lineEdit3")
        self.gridLayout_3.addWidget(self.tab1_lineEdit3, 7, 5, 1, 1)
        self.tab1_label_4 = QtWidgets.QLabel(self.tab)
        self.tab1_label_4.setFrameShape(QtWidgets.QFrame.Panel)
        self.tab1_label_4.setFrameShadow(QtWidgets.QFrame.Raised)
        self.tab1_label_4.setObjectName("tab1_label_4")
        self.gridLayout_3.addWidget(self.tab1_label_4, 7, 4, 1, 1)
        self.tab1_showimg = QtWidgets.QLabel(self.tab)
        self.tab1_showimg.setMinimumSize(QtCore.QSize(300, 250))
        self.tab1_showimg.setStyleSheet("background-color: rgb(255, 239, 219);")
        self.tab1_showimg.setFrameShape(QtWidgets.QFrame.Panel)
        self.tab1_showimg.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.tab1_showimg.setText("")
        self.tab1_showimg.setObjectName("tab1_showimg")
        self.gridLayout_3.addWidget(self.tab1_showimg, 2, 0, 5, 6)
        self.tabWidget.addTab(self.tab, "")
        self.tab_4 = QtWidgets.QWidget()
        self.tab_4.setObjectName("tab_4")
        self.gridLayout = QtWidgets.QGridLayout(self.tab_4)
        self.gridLayout.setObjectName("gridLayout")
        self.tab2_checkBox_1 = QtWidgets.QCheckBox(self.tab_4)
        self.tab2_checkBox_1.setObjectName("tab2_checkBox_1")
        self.gridLayout.addWidget(self.tab2_checkBox_1, 1, 1, 1, 1)
        self.tab2_pushButton_play = QtWidgets.QPushButton(self.tab_4)
        self.tab2_pushButton_play.setMinimumSize(QtCore.QSize(0, 25))
        self.tab2_pushButton_play.setObjectName("tab2_pushButton_play")
        self.gridLayout.addWidget(self.tab2_pushButton_play, 11, 4, 1, 1)
        self.tab2_pushButton_make = QtWidgets.QPushButton(self.tab_4)
        self.tab2_pushButton_make.setMinimumSize(QtCore.QSize(0, 25))
        self.tab2_pushButton_make.setObjectName("tab2_pushButton_make")
        self.gridLayout.addWidget(self.tab2_pushButton_make, 7, 1, 1, 1)
        self.tab2_label_1 = QtWidgets.QLabel(self.tab_4)
        self.tab2_label_1.setMinimumSize(QtCore.QSize(0, 25))
        self.tab2_label_1.setObjectName("tab2_label_1")
        self.gridLayout.addWidget(self.tab2_label_1, 0, 1, 1, 1)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem, 3, 3, 1, 1)
        self.tab2_label_2 = QtWidgets.QLabel(self.tab_4)
        self.tab2_label_2.setMinimumSize(QtCore.QSize(0, 25))
        self.tab2_label_2.setObjectName("tab2_label_2")
        self.gridLayout.addWidget(self.tab2_label_2, 2, 1, 1, 1)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem1, 0, 5, 1, 1)
        self.tab2_label_3 = QtWidgets.QLabel(self.tab_4)
        self.tab2_label_3.setMinimumSize(QtCore.QSize(0, 25))
        self.tab2_label_3.setObjectName("tab2_label_3")
        self.gridLayout.addWidget(self.tab2_label_3, 3, 1, 1, 1)
        self.tab2_listWidget1 = QtWidgets.QListWidget(self.tab_4)
        self.tab2_listWidget1.setMaximumSize(QtCore.QSize(300, 16777215))
        self.tab2_listWidget1.setObjectName("tab2_listWidget1")
        item = QtWidgets.QListWidgetItem()
        self.tab2_listWidget1.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.tab2_listWidget1.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.tab2_listWidget1.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.tab2_listWidget1.addItem(item)
        self.gridLayout.addWidget(self.tab2_listWidget1, 0, 0, 6, 1)
        self.tab2_pushButton_1 = QtWidgets.QPushButton(self.tab_4)
        self.tab2_pushButton_1.setMinimumSize(QtCore.QSize(100, 25))
        self.tab2_pushButton_1.setMaximumSize(QtCore.QSize(150, 16777215))
        self.tab2_pushButton_1.setObjectName("tab2_pushButton_1")
        self.gridLayout.addWidget(self.tab2_pushButton_1, 0, 2, 1, 1)
        self.tab2_label_4 = QtWidgets.QLabel(self.tab_4)
        self.tab2_label_4.setMinimumSize(QtCore.QSize(0, 25))
        self.tab2_label_4.setObjectName("tab2_label_4")
        self.gridLayout.addWidget(self.tab2_label_4, 11, 1, 1, 1)
        self.tab2_checkBox_2 = QtWidgets.QCheckBox(self.tab_4)
        self.tab2_checkBox_2.setObjectName("tab2_checkBox_2")
        self.gridLayout.addWidget(self.tab2_checkBox_2, 6, 1, 1, 1)
        self.tab2_listWidget2 = QtWidgets.QListWidget(self.tab_4)
        self.tab2_listWidget2.setMinimumSize(QtCore.QSize(0, 230))
        self.tab2_listWidget2.setMaximumSize(QtCore.QSize(300, 16777215))
        self.tab2_listWidget2.setObjectName("tab2_listWidget2")
        self.gridLayout.addWidget(self.tab2_listWidget2, 6, 0, 6, 1)
        self.tab2_lineEdit_2 = QtWidgets.QLineEdit(self.tab_4)
        self.tab2_lineEdit_2.setMinimumSize(QtCore.QSize(0, 25))
        self.tab2_lineEdit_2.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.tab2_lineEdit_2.setObjectName("tab2_lineEdit_2")
        self.gridLayout.addWidget(self.tab2_lineEdit_2, 2, 3, 1, 2)
        self.tab2_pushButton_2 = QtWidgets.QPushButton(self.tab_4)
        self.tab2_pushButton_2.setMinimumSize(QtCore.QSize(100, 25))
        self.tab2_pushButton_2.setMaximumSize(QtCore.QSize(150, 16777215))
        self.tab2_pushButton_2.setObjectName("tab2_pushButton_2")
        self.gridLayout.addWidget(self.tab2_pushButton_2, 2, 2, 1, 1)
        self.tab2_pushButton_3 = QtWidgets.QPushButton(self.tab_4)
        self.tab2_pushButton_3.setMinimumSize(QtCore.QSize(0, 25))
        self.tab2_pushButton_3.setMaximumSize(QtCore.QSize(150, 16777215))
        self.tab2_pushButton_3.setObjectName("tab2_pushButton_3")
        self.gridLayout.addWidget(self.tab2_pushButton_3, 11, 2, 1, 1)
        self.tab2_label_show = QtWidgets.QLabel(self.tab_4)
        self.tab2_label_show.setEnabled(True)
        self.tab2_label_show.setMinimumSize(QtCore.QSize(400, 250))
        self.tab2_label_show.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.tab2_label_show.setStyleSheet("background-color: rgb(192, 200, 188);")
        self.tab2_label_show.setFrameShape(QtWidgets.QFrame.Panel)
        self.tab2_label_show.setFrameShadow(QtWidgets.QFrame.Raised)
        self.tab2_label_show.setText("")
        self.tab2_label_show.setObjectName("tab2_label_show")
        self.gridLayout.addWidget(self.tab2_label_show, 4, 2, 7, 4)
        self.tab2_lineEdit_3 = QtWidgets.QLineEdit(self.tab_4)
        self.tab2_lineEdit_3.setMinimumSize(QtCore.QSize(50, 25))
        self.tab2_lineEdit_3.setMaximumSize(QtCore.QSize(150, 16777215))
        self.tab2_lineEdit_3.setObjectName("tab2_lineEdit_3")
        self.gridLayout.addWidget(self.tab2_lineEdit_3, 3, 2, 1, 1)
        self.tab2_lineEdit_1 = QtWidgets.QLineEdit(self.tab_4)
        self.tab2_lineEdit_1.setMinimumSize(QtCore.QSize(0, 25))
        self.tab2_lineEdit_1.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.tab2_lineEdit_1.setObjectName("tab2_lineEdit_1")
        self.gridLayout.addWidget(self.tab2_lineEdit_1, 0, 3, 1, 2)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem2, 11, 5, 1, 1)
        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem3, 2, 5, 1, 1)
        self.tab2_lineEdit_4 = QtWidgets.QLineEdit(self.tab_4)
        self.tab2_lineEdit_4.setMinimumSize(QtCore.QSize(0, 25))
        self.tab2_lineEdit_4.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.tab2_lineEdit_4.setObjectName("tab2_lineEdit_4")
        self.gridLayout.addWidget(self.tab2_lineEdit_4, 11, 3, 1, 1)
        self.tab2_checkBox_1.raise_()
        self.tab2_pushButton_play.raise_()
        self.tab2_pushButton_make.raise_()
        self.tab2_label_1.raise_()
        self.tab2_label_2.raise_()
        self.tab2_label_3.raise_()
        self.tab2_listWidget1.raise_()
        self.tab2_pushButton_1.raise_()
        self.tab2_label_4.raise_()
        self.tab2_checkBox_2.raise_()
        self.tab2_listWidget2.raise_()
        self.tab2_lineEdit_2.raise_()
        self.tab2_pushButton_2.raise_()
        self.tab2_pushButton_3.raise_()
        self.tab2_label_show.raise_()
        self.tab2_lineEdit_3.raise_()
        self.tab2_lineEdit_4.raise_()
        self.tab2_lineEdit_1.raise_()
        self.tabWidget.addTab(self.tab_4, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.tab_2)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.tab3_lineEdit1 = QtWidgets.QLineEdit(self.tab_2)
        self.tab3_lineEdit1.setMinimumSize(QtCore.QSize(100, 25))
        self.tab3_lineEdit1.setMaximumSize(QtCore.QSize(900, 16777215))
        self.tab3_lineEdit1.setObjectName("tab3_lineEdit1")
        self.gridLayout_2.addWidget(self.tab3_lineEdit1, 0, 1, 1, 2)
        self.tab3_label_3 = QtWidgets.QLabel(self.tab_2)
        self.tab3_label_3.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_label_3.setFrameShape(QtWidgets.QFrame.Panel)
        self.tab3_label_3.setFrameShadow(QtWidgets.QFrame.Raised)
        self.tab3_label_3.setObjectName("tab3_label_3")
        self.gridLayout_2.addWidget(self.tab3_label_3, 7, 0, 1, 1)
        self.tab3_pushButton2 = QtWidgets.QPushButton(self.tab_2)
        self.tab3_pushButton2.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_pushButton2.setMaximumSize(QtCore.QSize(100, 16777215))
        self.tab3_pushButton2.setObjectName("tab3_pushButton2")
        self.gridLayout_2.addWidget(self.tab3_pushButton2, 6, 4, 1, 1)
        self.tab3_label_4 = QtWidgets.QLabel(self.tab_2)
        self.tab3_label_4.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_label_4.setFrameShape(QtWidgets.QFrame.Panel)
        self.tab3_label_4.setFrameShadow(QtWidgets.QFrame.Raised)
        self.tab3_label_4.setObjectName("tab3_label_4")
        self.gridLayout_2.addWidget(self.tab3_label_4, 0, 4, 1, 1)
        self.tab3_label1 = QtWidgets.QLabel(self.tab_2)
        self.tab3_label1.setMinimumSize(QtCore.QSize(200, 200))
        self.tab3_label1.setStyleSheet("background-color: rgb(186, 186, 186);")
        self.tab3_label1.setFrameShape(QtWidgets.QFrame.WinPanel)
        self.tab3_label1.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.tab3_label1.setText("")
        self.tab3_label1.setObjectName("tab3_label1")
        self.gridLayout_2.addWidget(self.tab3_label1, 1, 0, 5, 11)
        spacerItem4 = QtWidgets.QSpacerItem(60, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem4, 0, 8, 1, 1)
        self.tab3_lineEdit2 = QtWidgets.QLineEdit(self.tab_2)
        self.tab3_lineEdit2.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_lineEdit2.setObjectName("tab3_lineEdit2")
        self.gridLayout_2.addWidget(self.tab3_lineEdit2, 6, 1, 1, 3)
        self.tab3_label_5 = QtWidgets.QLabel(self.tab_2)
        self.tab3_label_5.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_label_5.setFrameShape(QtWidgets.QFrame.Panel)
        self.tab3_label_5.setFrameShadow(QtWidgets.QFrame.Raised)
        self.tab3_label_5.setObjectName("tab3_label_5")
        self.gridLayout_2.addWidget(self.tab3_label_5, 0, 6, 1, 1)
        self.tab3_pushButton3 = QtWidgets.QPushButton(self.tab_2)
        self.tab3_pushButton3.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_pushButton3.setObjectName("tab3_pushButton3")
        self.gridLayout_2.addWidget(self.tab3_pushButton3, 6, 5, 1, 1)
        self.tab3_comboBox1 = QtWidgets.QComboBox(self.tab_2)
        self.tab3_comboBox1.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_comboBox1.setStyleSheet("background-color: rgb(193, 193, 193);")
        self.tab3_comboBox1.setObjectName("tab3_comboBox1")
        self.tab3_comboBox1.addItem("")
        self.tab3_comboBox1.addItem("")
        self.tab3_comboBox1.addItem("")
        self.gridLayout_2.addWidget(self.tab3_comboBox1, 0, 5, 1, 1)
        self.tab3_pushButton5 = QtWidgets.QPushButton(self.tab_2)
        self.tab3_pushButton5.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_pushButton5.setObjectName("tab3_pushButton5")
        self.gridLayout_2.addWidget(self.tab3_pushButton5, 7, 5, 1, 1)
        self.tab3_pushButton1 = QtWidgets.QPushButton(self.tab_2)
        self.tab3_pushButton1.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_pushButton1.setObjectName("tab3_pushButton1")
        self.gridLayout_2.addWidget(self.tab3_pushButton1, 0, 3, 1, 1)
        self.tab3_label_2 = QtWidgets.QLabel(self.tab_2)
        self.tab3_label_2.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_label_2.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.tab3_label_2.setFrameShape(QtWidgets.QFrame.Panel)
        self.tab3_label_2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.tab3_label_2.setObjectName("tab3_label_2")
        self.gridLayout_2.addWidget(self.tab3_label_2, 6, 0, 1, 1)
        self.tab3_label_1 = QtWidgets.QLabel(self.tab_2)
        self.tab3_label_1.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_label_1.setFrameShape(QtWidgets.QFrame.Panel)
        self.tab3_label_1.setFrameShadow(QtWidgets.QFrame.Raised)
        self.tab3_label_1.setObjectName("tab3_label_1")
        self.gridLayout_2.addWidget(self.tab3_label_1, 0, 0, 1, 1)
        self.tab3_pushButton4 = QtWidgets.QPushButton(self.tab_2)
        self.tab3_pushButton4.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_pushButton4.setObjectName("tab3_pushButton4")
        self.gridLayout_2.addWidget(self.tab3_pushButton4, 7, 4, 1, 1)
        self.tab3_lineEdit3 = QtWidgets.QLineEdit(self.tab_2)
        self.tab3_lineEdit3.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_lineEdit3.setObjectName("tab3_lineEdit3")
        self.gridLayout_2.addWidget(self.tab3_lineEdit3, 7, 1, 1, 3)
        self.tab3_lineEdit1_2 = QtWidgets.QLineEdit(self.tab_2)
        self.tab3_lineEdit1_2.setMinimumSize(QtCore.QSize(0, 25))
        self.tab3_lineEdit1_2.setObjectName("tab3_lineEdit1_2")
        self.gridLayout_2.addWidget(self.tab3_lineEdit1_2, 0, 7, 1, 1)
        self.tab3_textBrowser_1 = QtWidgets.QTextBrowser(self.tab_2)
        self.tab3_textBrowser_1.setObjectName("tab3_textBrowser_1")
        self.gridLayout_2.addWidget(self.tab3_textBrowser_1, 6, 6, 2, 5)
        self.tabWidget.addTab(self.tab_2, "")
        self.tab_3 = QtWidgets.QWidget()
        self.tab_3.setObjectName("tab_3")
        self.gridLayout_4 = QtWidgets.QGridLayout(self.tab_3)
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.tab4_baifenbi = QtWidgets.QLabel(self.tab_3)
        self.tab4_baifenbi.setObjectName("tab4_baifenbi")
        self.gridLayout_4.addWidget(self.tab4_baifenbi, 1, 4, 1, 1)
        self.horizontalSlider = QtWidgets.QSlider(self.tab_3)
        self.horizontalSlider.setMinimumSize(QtCore.QSize(0, 25))
        self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalSlider.setObjectName("horizontalSlider")
        self.gridLayout_4.addWidget(self.horizontalSlider, 1, 3, 1, 1)
        self.tab4_pushButton_split_video = QtWidgets.QPushButton(self.tab_3)
        self.tab4_pushButton_split_video.setMinimumSize(QtCore.QSize(0, 25))
        self.tab4_pushButton_split_video.setObjectName("tab4_pushButton_split_video")
        self.gridLayout_4.addWidget(self.tab4_pushButton_split_video, 3, 2, 1, 1)
        self.tab4_lineEdit2 = QtWidgets.QLineEdit(self.tab_3)
        self.tab4_lineEdit2.setMinimumSize(QtCore.QSize(0, 25))
        self.tab4_lineEdit2.setMaximumSize(QtCore.QSize(100, 16777215))
        self.tab4_lineEdit2.setObjectName("tab4_lineEdit2")
        self.gridLayout_4.addWidget(self.tab4_lineEdit2, 3, 1, 1, 1)
        self.tab4_pushButton_pause = QtWidgets.QPushButton(self.tab_3)
        self.tab4_pushButton_pause.setMinimumSize(QtCore.QSize(50, 25))
        self.tab4_pushButton_pause.setMaximumSize(QtCore.QSize(100, 16777215))
        self.tab4_pushButton_pause.setObjectName("tab4_pushButton_pause")
        self.gridLayout_4.addWidget(self.tab4_pushButton_pause, 1, 1, 1, 1)
        self.mywidget = QVideoWidget(self.tab_3)
        self.mywidget.setStyleSheet("background-color: rgb(0, 0, 0);")
        self.mywidget.setObjectName("mywidget")
        self.gridLayout_4.addWidget(self.mywidget, 0, 0, 1, 5)
        self.tab4_pushButton_1 = QtWidgets.QPushButton(self.tab_3)
        self.tab4_pushButton_1.setMinimumSize(QtCore.QSize(60, 25))
        self.tab4_pushButton_1.setObjectName("tab4_pushButton_1")
        self.gridLayout_4.addWidget(self.tab4_pushButton_1, 1, 0, 1, 1)
        self.tab4_pushButton_3 = QtWidgets.QPushButton(self.tab_3)
        self.tab4_pushButton_3.setMinimumSize(QtCore.QSize(0, 25))
        self.tab4_pushButton_3.setObjectName("tab4_pushButton_3")
        self.gridLayout_4.addWidget(self.tab4_pushButton_3, 3, 0, 1, 1)
        self.tab4_textBrowser = QtWidgets.QTextBrowser(self.tab_3)
        self.tab4_textBrowser.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.tab4_textBrowser.setObjectName("tab4_textBrowser")
        self.gridLayout_4.addWidget(self.tab4_textBrowser, 2, 3, 2, 2)
        self.tab4_label_1 = QtWidgets.QLabel(self.tab_3)
        self.tab4_label_1.setObjectName("tab4_label_1")
        self.gridLayout_4.addWidget(self.tab4_label_1, 1, 2, 1, 1)
        self.tab4_pushButton_2 = QtWidgets.QPushButton(self.tab_3)
        self.tab4_pushButton_2.setMinimumSize(QtCore.QSize(0, 25))
        self.tab4_pushButton_2.setObjectName("tab4_pushButton_2")
        self.gridLayout_4.addWidget(self.tab4_pushButton_2, 2, 0, 1, 1)
        self.tab4_lineEdit1 = QtWidgets.QLineEdit(self.tab_3)
        self.tab4_lineEdit1.setMinimumSize(QtCore.QSize(0, 25))
        self.tab4_lineEdit1.setMaximumSize(QtCore.QSize(100, 16777215))
        self.tab4_lineEdit1.setObjectName("tab4_lineEdit1")
        self.gridLayout_4.addWidget(self.tab4_lineEdit1, 2, 1, 1, 1)
        self.tab4_pushButton_split_image = QtWidgets.QPushButton(self.tab_3)
        self.tab4_pushButton_split_image.setMinimumSize(QtCore.QSize(0, 25))
        self.tab4_pushButton_split_image.setObjectName("tab4_pushButton_split_image")
        self.gridLayout_4.addWidget(self.tab4_pushButton_split_image, 2, 2, 1, 1)
        self.tabWidget.addTab(self.tab_3, "")
        self.gridLayout_5.addWidget(self.tabWidget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 605, 23))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.menubar.addAction(self.menuFile.menuAction())

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(3)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.tab1_checkBox.setText(_translate("MainWindow", "批量选择"))
        self.tab1_pushButton2.setText(_translate("MainWindow", "浏览"))
        self.tab1_pushButton_open2.setText(_translate("MainWindow", "打开"))
        self.tab1_label3.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">图片查看:</p></body></html>"))
        self.tab1_label1.setText(_translate("MainWindow", "路径选择:"))
        self.tab1_comboBox1.setItemText(0, _translate("MainWindow", "单张"))
        self.tab1_comboBox1.setItemText(1, _translate("MainWindow", "批量"))
        self.tab1_pushButton_down.setText(_translate("MainWindow", "下一张"))
        self.tab1_pushButton_zhuanhua.setText(_translate("MainWindow", "转化"))
        self.tab1_pushButton1.setText(_translate("MainWindow", "浏览"))
        self.tab1_label2.setText(_translate("MainWindow", "保存路径:"))
        self.tab1_comboBox2.setItemText(0, _translate("MainWindow", "png"))
        self.tab1_comboBox2.setItemText(1, _translate("MainWindow", "jpeg"))
        self.tab1_comboBox2.setItemText(2, _translate("MainWindow", "jpg"))
        self.tab1_comboBox2.setItemText(3, _translate("MainWindow", "bmp"))
        self.tab1_comboBox2.setItemText(4, _translate("MainWindow", "pdf"))
        self.tab1_pushButton_up.setText(_translate("MainWindow", "上一张"))
        self.tab1_pushButton_open1.setText(_translate("MainWindow", "打开"))
        self.tab1_comboBox3.setItemText(0, _translate("MainWindow", "单张"))
        self.tab1_comboBox3.setItemText(1, _translate("MainWindow", "批量"))
        self.tab1_pushButton_xiugai.setText(_translate("MainWindow", "修改"))
        self.tab1_label_4.setText(_translate("MainWindow", "分辨率:"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "图片格式转化"))
        self.tab2_checkBox_1.setText(_translate("MainWindow", "展示图片"))
        self.tab2_pushButton_play.setText(_translate("MainWindow", "播放"))
        self.tab2_pushButton_make.setText(_translate("MainWindow", "生成GIF"))
        self.tab2_label_1.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">图片路径:</p></body></html>"))
        self.tab2_label_2.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">GIF保存路径:</p></body></html>"))
        self.tab2_label_3.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">延时(s):</p></body></html>"))
        __sortingEnabled = self.tab2_listWidget1.isSortingEnabled()
        self.tab2_listWidget1.setSortingEnabled(False)
        item = self.tab2_listWidget1.item(0)
        item.setText(_translate("MainWindow", "222"))
        item = self.tab2_listWidget1.item(1)
        item.setText(_translate("MainWindow", "333"))
        item = self.tab2_listWidget1.item(2)
        item.setText(_translate("MainWindow", "4444"))
        item = self.tab2_listWidget1.item(3)
        item.setText(_translate("MainWindow", "111"))
        self.tab2_listWidget1.setSortingEnabled(__sortingEnabled)
        self.tab2_pushButton_1.setText(_translate("MainWindow", "浏览"))
        self.tab2_label_4.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">GIF选择:</p></body></html>"))
        self.tab2_checkBox_2.setText(_translate("MainWindow", "自动命名"))
        self.tab2_pushButton_2.setText(_translate("MainWindow", "浏览"))
        self.tab2_pushButton_3.setText(_translate("MainWindow", "浏览"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _translate("MainWindow", "图片转GIF"))
        self.tab3_label_3.setText(_translate("MainWindow", "视频路径:"))
        self.tab3_pushButton2.setText(_translate("MainWindow", "浏览"))
        self.tab3_label_4.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">延时:</p></body></html>"))
        self.tab3_label_5.setText(_translate("MainWindow", "帧率:"))
        self.tab3_pushButton3.setText(_translate("MainWindow", "播放"))
        self.tab3_comboBox1.setItemText(0, _translate("MainWindow", "1"))
        self.tab3_comboBox1.setItemText(1, _translate("MainWindow", "2"))
        self.tab3_comboBox1.setItemText(2, _translate("MainWindow", "3"))
        self.tab3_pushButton5.setText(_translate("MainWindow", "合成"))
        self.tab3_pushButton1.setText(_translate("MainWindow", "浏览"))
        self.tab3_label_2.setText(_translate("MainWindow", "音频路径:"))
        self.tab3_label_1.setText(_translate("MainWindow", "路径选择:"))
        self.tab3_pushButton4.setText(_translate("MainWindow", "浏览"))
        self.tab3_lineEdit1_2.setText(_translate("MainWindow", "0.5"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "图片轮播"))
        self.tab4_baifenbi.setText(_translate("MainWindow", "0"))
        self.tab4_pushButton_split_video.setText(_translate("MainWindow", "分割视频"))
        self.tab4_pushButton_pause.setText(_translate("MainWindow", "暂停"))
        self.tab4_pushButton_1.setText(_translate("MainWindow", "浏览"))
        self.tab4_pushButton_3.setText(_translate("MainWindow", "结束时间"))
        self.tab4_label_1.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">进度条:</p></body></html>"))
        self.tab4_pushButton_2.setText(_translate("MainWindow", "开始时间"))
        self.tab4_pushButton_split_image.setText(_translate("MainWindow", "分割图片"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "视频转图片"))
        self.menuFile.setTitle(_translate("MainWindow", "File"))
from PyQt5.QtMultimediaWidgets import QVideoWidget

6.5 加载界面原始UI文件;【loadwin.ui】Pyqt5工具可打开

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>loadwin</class>
 <widget class="QWidget" name="loadwin">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>455</width>
    <height>349</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="0" column="0">
    <widget class="QLabel" name="label_logo">
     <property name="minimumSize">
      <size>
       <width>0</width>
       <height>280</height>
      </size>
     </property>
     <property name="text">
      <string/>
     </property>
    </widget>
   </item>
   <item row="1" column="0">
    <widget class="QLabel" name="label_info">
     <property name="text">
      <string>TextLabel</string>
     </property>
    </widget>
   </item>
   <item row="2" column="0">
    <widget class="QProgressBar" name="progressBar">
     <property name="value">
      <number>24</number>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

6.6 主界面原始UI文件;【show_img.ui】Pyqt5工具可打开

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>605</width>
    <height>535</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout_5">
    <item row="0" column="0">
     <widget class="QTabWidget" name="tabWidget">
      <property name="currentIndex">
       <number>3</number>
      </property>
      <widget class="QWidget" name="tab">
       <attribute name="title">
        <string>图片格式转化</string>
       </attribute>
       <layout class="QGridLayout" name="gridLayout_3">
        <item row="0" column="5">
         <widget class="QCheckBox" name="tab1_checkBox">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>批量选择</string>
          </property>
         </widget>
        </item>
        <item row="1" column="3">
         <widget class="QPushButton" name="tab1_pushButton2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>浏览</string>
          </property>
         </widget>
        </item>
        <item row="1" column="4">
         <widget class="QPushButton" name="tab1_pushButton_open2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>打开</string>
          </property>
         </widget>
        </item>
        <item row="7" column="0">
         <widget class="QLabel" name="tab1_label3">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="frameShape">
           <enum>QFrame::Panel</enum>
          </property>
          <property name="frameShadow">
           <enum>QFrame::Raised</enum>
          </property>
          <property name="text">
           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;图片查看:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
          </property>
         </widget>
        </item>
        <item row="0" column="0">
         <widget class="QLabel" name="tab1_label1">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="frameShape">
           <enum>QFrame::Panel</enum>
          </property>
          <property name="frameShadow">
           <enum>QFrame::Raised</enum>
          </property>
          <property name="text">
           <string>路径选择:</string>
          </property>
         </widget>
        </item>
        <item row="2" column="7">
         <widget class="QComboBox" name="tab1_comboBox1">
          <item>
           <property name="text">
            <string>单张</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>批量</string>
           </property>
          </item>
         </widget>
        </item>
        <item row="7" column="2">
         <widget class="QPushButton" name="tab1_pushButton_down">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>下一张</string>
          </property>
         </widget>
        </item>
        <item row="4" column="7">
         <widget class="QPushButton" name="tab1_pushButton_zhuanhua">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>转化</string>
          </property>
         </widget>
        </item>
        <item row="0" column="3">
         <widget class="QPushButton" name="tab1_pushButton1">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>浏览</string>
          </property>
         </widget>
        </item>
        <item row="1" column="0">
         <widget class="QLabel" name="tab1_label2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="frameShape">
           <enum>QFrame::Panel</enum>
          </property>
          <property name="frameShadow">
           <enum>QFrame::Raised</enum>
          </property>
          <property name="text">
           <string>保存路径:</string>
          </property>
         </widget>
        </item>
        <item row="0" column="1" colspan="2">
         <widget class="QLineEdit" name="tab1_lineEdit1">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="styleSheet">
           <string notr="true">background-color: rgb(213, 213, 213);</string>
          </property>
         </widget>
        </item>
        <item row="1" column="1" colspan="2">
         <widget class="QLineEdit" name="tab1_lineEdit2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
         </widget>
        </item>
        <item row="3" column="7">
         <widget class="QComboBox" name="tab1_comboBox2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="styleSheet">
           <string notr="true">background-color: rgb(0, 170, 0);</string>
          </property>
          <item>
           <property name="text">
            <string>png</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>jpeg</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>jpg</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>bmp</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>pdf</string>
           </property>
          </item>
         </widget>
        </item>
        <item row="7" column="1">
         <widget class="QPushButton" name="tab1_pushButton_up">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>上一张</string>
          </property>
         </widget>
        </item>
        <item row="0" column="4">
         <widget class="QPushButton" name="tab1_pushButton_open1">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>打开</string>
          </property>
         </widget>
        </item>
        <item row="5" column="7">
         <widget class="QTextBrowser" name="textBrowser">
          <property name="maximumSize">
           <size>
            <width>150</width>
            <height>16777215</height>
           </size>
          </property>
         </widget>
        </item>
        <item row="7" column="3">
         <widget class="QComboBox" name="tab1_comboBox3">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <item>
           <property name="text">
            <string>单张</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>批量</string>
           </property>
          </item>
         </widget>
        </item>
        <item row="7" column="7">
         <widget class="QPushButton" name="tab1_pushButton_xiugai">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>修改</string>
          </property>
         </widget>
        </item>
        <item row="7" column="5">
         <widget class="QLineEdit" name="tab1_lineEdit3">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
         </widget>
        </item>
        <item row="7" column="4">
         <widget class="QLabel" name="tab1_label_4">
          <property name="frameShape">
           <enum>QFrame::Panel</enum>
          </property>
          <property name="frameShadow">
           <enum>QFrame::Raised</enum>
          </property>
          <property name="text">
           <string>分辨率:</string>
          </property>
         </widget>
        </item>
        <item row="2" column="0" rowspan="5" colspan="6">
         <widget class="QLabel" name="tab1_showimg">
          <property name="minimumSize">
           <size>
            <width>300</width>
            <height>250</height>
           </size>
          </property>
          <property name="styleSheet">
           <string notr="true">background-color: rgb(255, 239, 219);</string>
          </property>
          <property name="frameShape">
           <enum>QFrame::Panel</enum>
          </property>
          <property name="frameShadow">
           <enum>QFrame::Sunken</enum>
          </property>
          <property name="text">
           <string/>
          </property>
         </widget>
        </item>
       </layout>
      </widget>
      <widget class="QWidget" name="tab_4">
       <attribute name="title">
        <string>图片转GIF</string>
       </attribute>
       <layout class="QGridLayout" name="gridLayout">
        <item row="1" column="1">
         <widget class="QCheckBox" name="tab2_checkBox_1">
          <property name="text">
           <string>展示图片</string>
          </property>
         </widget>
        </item>
        <item row="11" column="4">
         <widget class="QPushButton" name="tab2_pushButton_play">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>播放</string>
          </property>
         </widget>
        </item>
        <item row="7" column="1">
         <widget class="QPushButton" name="tab2_pushButton_make">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>生成GIF</string>
          </property>
         </widget>
        </item>
        <item row="0" column="1">
         <widget class="QLabel" name="tab2_label_1">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;图片路径:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
          </property>
         </widget>
        </item>
        <item row="3" column="3">
         <spacer name="horizontalSpacer_5">
          <property name="orientation">
           <enum>Qt::Horizontal</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
            <width>40</width>
            <height>20</height>
           </size>
          </property>
         </spacer>
        </item>
        <item row="2" column="1">
         <widget class="QLabel" name="tab2_label_2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;GIF保存路径:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
          </property>
         </widget>
        </item>
        <item row="0" column="5">
         <spacer name="horizontalSpacer_3">
          <property name="orientation">
           <enum>Qt::Horizontal</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
            <width>40</width>
            <height>20</height>
           </size>
          </property>
         </spacer>
        </item>
        <item row="3" column="1">
         <widget class="QLabel" name="tab2_label_3">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;延时(s):&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
          </property>
         </widget>
        </item>
        <item row="0" column="0" rowspan="6">
         <widget class="QListWidget" name="tab2_listWidget1">
          <property name="maximumSize">
           <size>
            <width>300</width>
            <height>16777215</height>
           </size>
          </property>
          <item>
           <property name="text">
            <string>222</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>333</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>4444</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>111</string>
           </property>
          </item>
         </widget>
        </item>
        <item row="0" column="2">
         <widget class="QPushButton" name="tab2_pushButton_1">
          <property name="minimumSize">
           <size>
            <width>100</width>
            <height>25</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>150</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="text">
           <string>浏览</string>
          </property>
         </widget>
        </item>
        <item row="11" column="1">
         <widget class="QLabel" name="tab2_label_4">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;GIF选择:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
          </property>
         </widget>
        </item>
        <item row="6" column="1">
         <widget class="QCheckBox" name="tab2_checkBox_2">
          <property name="text">
           <string>自动命名</string>
          </property>
         </widget>
        </item>
        <item row="6" column="0" rowspan="6">
         <widget class="QListWidget" name="tab2_listWidget2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>230</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>300</width>
            <height>16777215</height>
           </size>
          </property>
         </widget>
        </item>
        <item row="2" column="3" colspan="2">
         <widget class="QLineEdit" name="tab2_lineEdit_2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>16777215</width>
            <height>16777215</height>
           </size>
          </property>
         </widget>
        </item>
        <item row="2" column="2">
         <widget class="QPushButton" name="tab2_pushButton_2">
          <property name="minimumSize">
           <size>
            <width>100</width>
            <height>25</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>150</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="text">
           <string>浏览</string>
          </property>
         </widget>
        </item>
        <item row="11" column="2">
         <widget class="QPushButton" name="tab2_pushButton_3">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>150</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="text">
           <string>浏览</string>
          </property>
         </widget>
        </item>
        <item row="4" column="2" rowspan="7" colspan="4">
         <widget class="QLabel" name="tab2_label_show">
          <property name="enabled">
           <bool>true</bool>
          </property>
          <property name="minimumSize">
           <size>
            <width>400</width>
            <height>250</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>16777215</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="styleSheet">
           <string notr="true">background-color: rgb(192, 200, 188);</string>
          </property>
          <property name="frameShape">
           <enum>QFrame::Panel</enum>
          </property>
          <property name="frameShadow">
           <enum>QFrame::Raised</enum>
          </property>
          <property name="text">
           <string/>
          </property>
         </widget>
        </item>
        <item row="3" column="2">
         <widget class="QLineEdit" name="tab2_lineEdit_3">
          <property name="minimumSize">
           <size>
            <width>50</width>
            <height>25</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>150</width>
            <height>16777215</height>
           </size>
          </property>
         </widget>
        </item>
        <item row="0" column="3" colspan="2">
         <widget class="QLineEdit" name="tab2_lineEdit_1">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>16777215</width>
            <height>16777215</height>
           </size>
          </property>
         </widget>
        </item>
        <item row="11" column="5">
         <spacer name="horizontalSpacer_2">
          <property name="orientation">
           <enum>Qt::Horizontal</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
            <width>40</width>
            <height>20</height>
           </size>
          </property>
         </spacer>
        </item>
        <item row="2" column="5">
         <spacer name="horizontalSpacer_4">
          <property name="orientation">
           <enum>Qt::Horizontal</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
            <width>40</width>
            <height>20</height>
           </size>
          </property>
         </spacer>
        </item>
        <item row="11" column="3">
         <widget class="QLineEdit" name="tab2_lineEdit_4">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>16777215</width>
            <height>16777215</height>
           </size>
          </property>
         </widget>
        </item>
       </layout>
       <zorder>tab2_checkBox_1</zorder>
       <zorder>tab2_pushButton_play</zorder>
       <zorder>tab2_pushButton_make</zorder>
       <zorder>tab2_label_1</zorder>
       <zorder>tab2_label_2</zorder>
       <zorder>tab2_label_3</zorder>
       <zorder>tab2_listWidget1</zorder>
       <zorder>tab2_pushButton_1</zorder>
       <zorder>tab2_label_4</zorder>
       <zorder>tab2_checkBox_2</zorder>
       <zorder>tab2_listWidget2</zorder>
       <zorder>tab2_lineEdit_2</zorder>
       <zorder>tab2_pushButton_2</zorder>
       <zorder>tab2_pushButton_3</zorder>
       <zorder>tab2_label_show</zorder>
       <zorder>tab2_lineEdit_3</zorder>
       <zorder>tab2_lineEdit_4</zorder>
       <zorder>tab2_lineEdit_1</zorder>
      </widget>
      <widget class="QWidget" name="tab_2">
       <attribute name="title">
        <string>图片轮播</string>
       </attribute>
       <layout class="QGridLayout" name="gridLayout_2">
        <item row="0" column="1" colspan="2">
         <widget class="QLineEdit" name="tab3_lineEdit1">
          <property name="minimumSize">
           <size>
            <width>100</width>
            <height>25</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>900</width>
            <height>16777215</height>
           </size>
          </property>
         </widget>
        </item>
        <item row="7" column="0">
         <widget class="QLabel" name="tab3_label_3">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="frameShape">
           <enum>QFrame::Panel</enum>
          </property>
          <property name="frameShadow">
           <enum>QFrame::Raised</enum>
          </property>
          <property name="text">
           <string>视频路径:</string>
          </property>
         </widget>
        </item>
        <item row="6" column="4">
         <widget class="QPushButton" name="tab3_pushButton2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>100</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="text">
           <string>浏览</string>
          </property>
         </widget>
        </item>
        <item row="0" column="4">
         <widget class="QLabel" name="tab3_label_4">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="frameShape">
           <enum>QFrame::Panel</enum>
          </property>
          <property name="frameShadow">
           <enum>QFrame::Raised</enum>
          </property>
          <property name="text">
           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;延时:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
          </property>
         </widget>
        </item>
        <item row="1" column="0" rowspan="5" colspan="11">
         <widget class="QLabel" name="tab3_label1">
          <property name="minimumSize">
           <size>
            <width>200</width>
            <height>200</height>
           </size>
          </property>
          <property name="styleSheet">
           <string notr="true">background-color: rgb(186, 186, 186);</string>
          </property>
          <property name="frameShape">
           <enum>QFrame::WinPanel</enum>
          </property>
          <property name="frameShadow">
           <enum>QFrame::Sunken</enum>
          </property>
          <property name="text">
           <string/>
          </property>
         </widget>
        </item>
        <item row="0" column="8">
         <spacer name="horizontalSpacer">
          <property name="orientation">
           <enum>Qt::Horizontal</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
            <width>60</width>
            <height>20</height>
           </size>
          </property>
         </spacer>
        </item>
        <item row="6" column="1" colspan="3">
         <widget class="QLineEdit" name="tab3_lineEdit2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
         </widget>
        </item>
        <item row="0" column="6">
         <widget class="QLabel" name="tab3_label_5">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="frameShape">
           <enum>QFrame::Panel</enum>
          </property>
          <property name="frameShadow">
           <enum>QFrame::Raised</enum>
          </property>
          <property name="text">
           <string>帧率:</string>
          </property>
         </widget>
        </item>
        <item row="6" column="5">
         <widget class="QPushButton" name="tab3_pushButton3">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>播放</string>
          </property>
         </widget>
        </item>
        <item row="0" column="5">
         <widget class="QComboBox" name="tab3_comboBox1">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="styleSheet">
           <string notr="true">background-color: rgb(193, 193, 193);</string>
          </property>
          <item>
           <property name="text">
            <string>1</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>2</string>
           </property>
          </item>
          <item>
           <property name="text">
            <string>3</string>
           </property>
          </item>
         </widget>
        </item>
        <item row="7" column="5">
         <widget class="QPushButton" name="tab3_pushButton5">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>合成</string>
          </property>
         </widget>
        </item>
        <item row="0" column="3">
         <widget class="QPushButton" name="tab3_pushButton1">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>浏览</string>
          </property>
         </widget>
        </item>
        <item row="6" column="0">
         <widget class="QLabel" name="tab3_label_2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>16777215</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="frameShape">
           <enum>QFrame::Panel</enum>
          </property>
          <property name="frameShadow">
           <enum>QFrame::Raised</enum>
          </property>
          <property name="text">
           <string>音频路径:</string>
          </property>
         </widget>
        </item>
        <item row="0" column="0">
         <widget class="QLabel" name="tab3_label_1">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="frameShape">
           <enum>QFrame::Panel</enum>
          </property>
          <property name="frameShadow">
           <enum>QFrame::Raised</enum>
          </property>
          <property name="text">
           <string>路径选择:</string>
          </property>
         </widget>
        </item>
        <item row="7" column="4">
         <widget class="QPushButton" name="tab3_pushButton4">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>浏览</string>
          </property>
         </widget>
        </item>
        <item row="7" column="1" colspan="3">
         <widget class="QLineEdit" name="tab3_lineEdit3">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
         </widget>
        </item>
        <item row="0" column="7">
         <widget class="QLineEdit" name="tab3_lineEdit1_2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>0.5</string>
          </property>
         </widget>
        </item>
        <item row="6" column="6" rowspan="2" colspan="5">
         <widget class="QTextBrowser" name="tab3_textBrowser_1"/>
        </item>
       </layout>
      </widget>
      <widget class="QWidget" name="tab_3">
       <attribute name="title">
        <string>视频转图片</string>
       </attribute>
       <layout class="QGridLayout" name="gridLayout_4">
        <item row="1" column="4">
         <widget class="QLabel" name="tab4_baifenbi">
          <property name="text">
           <string>0</string>
          </property>
         </widget>
        </item>
        <item row="1" column="3">
         <widget class="QSlider" name="horizontalSlider">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="orientation">
           <enum>Qt::Horizontal</enum>
          </property>
         </widget>
        </item>
        <item row="3" column="2">
         <widget class="QPushButton" name="tab4_pushButton_split_video">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>分割视频</string>
          </property>
         </widget>
        </item>
        <item row="3" column="1">
         <widget class="QLineEdit" name="tab4_lineEdit2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>100</width>
            <height>16777215</height>
           </size>
          </property>
         </widget>
        </item>
        <item row="1" column="1">
         <widget class="QPushButton" name="tab4_pushButton_pause">
          <property name="minimumSize">
           <size>
            <width>50</width>
            <height>25</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>100</width>
            <height>16777215</height>
           </size>
          </property>
          <property name="text">
           <string>暂停</string>
          </property>
         </widget>
        </item>
        <item row="0" column="0" colspan="5">
         <widget class="QVideoWidget" name="mywidget" native="true">
          <property name="styleSheet">
           <string notr="true">background-color: rgb(0, 0, 0);</string>
          </property>
         </widget>
        </item>
        <item row="1" column="0">
         <widget class="QPushButton" name="tab4_pushButton_1">
          <property name="minimumSize">
           <size>
            <width>60</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>浏览</string>
          </property>
         </widget>
        </item>
        <item row="3" column="0">
         <widget class="QPushButton" name="tab4_pushButton_3">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>结束时间</string>
          </property>
         </widget>
        </item>
        <item row="2" column="3" rowspan="2" colspan="2">
         <widget class="QTextBrowser" name="tab4_textBrowser">
          <property name="maximumSize">
           <size>
            <width>16777215</width>
            <height>16777215</height>
           </size>
          </property>
         </widget>
        </item>
        <item row="1" column="2">
         <widget class="QLabel" name="tab4_label_1">
          <property name="text">
           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;进度条:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
          </property>
         </widget>
        </item>
        <item row="2" column="0">
         <widget class="QPushButton" name="tab4_pushButton_2">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>开始时间</string>
          </property>
         </widget>
        </item>
        <item row="2" column="1">
         <widget class="QLineEdit" name="tab4_lineEdit1">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="maximumSize">
           <size>
            <width>100</width>
            <height>16777215</height>
           </size>
          </property>
         </widget>
        </item>
        <item row="2" column="2">
         <widget class="QPushButton" name="tab4_pushButton_split_image">
          <property name="minimumSize">
           <size>
            <width>0</width>
            <height>25</height>
           </size>
          </property>
          <property name="text">
           <string>分割图片</string>
          </property>
         </widget>
        </item>
       </layout>
      </widget>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>605</width>
     <height>23</height>
    </rect>
   </property>
   <widget class="QMenu" name="menuFile">
    <property name="title">
     <string>File</string>
    </property>
   </widget>
   <addaction name="menuFile"/>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <customwidgets>
  <customwidget>
   <class>QVideoWidget</class>
   <extends>QWidget</extends>
   <header location="global">qvideowidget.h</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

小工具自制点赞GIF

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

山中坐

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值