PyQt6 и неработающий оператор emit в программе с тремя классами

Перед тем, как писать сюда, пробовал найти пути решения проблемы, но в моей программе три класса, а в примерах решения подобных проблем в интернете - всего 2. Я понимаю, что возможно нужно прописать super(), но куда его вставлять и что от чего наследовать, я не совсем понимаю. Помогите, пожалуйста, разобраться!

Программа должна генерировать видео из аудио и изображения

Задача: сделать так, чтобы не фризился интерфейс во время конвертации. Я уже начал её решать, но .emit() подводит. Код:

import os
import sys

from moviepy.editor import *
import soundfile as sf

from proglog import ProgressBarLogger

from PyQt6.QtWidgets import (QMainWindow,QPushButton, 
                             QProgressBar, QApplication, QWidget)
from PyQt6.QtCore import QObject, QThread, pyqtSignal
from PyQt6 import QtWidgets
from PyQt6.QtCore import QCoreApplication, QRect

class UI(QMainWindow):
    def __init__(self):
        super(UI, self).__init__()

        self.setWindowTitle("верть, v. 2.0")
        self.resize(321, 610)
        self.centralwidget = QWidget()
        self.verticalLayoutWidget = QWidget(self.centralwidget)

        _translate = QCoreApplication.translate
        UI.startbutton = QPushButton(self.verticalLayoutWidget)
        UI.startbutton.setText(_translate("vert", "Выполнить"))
        UI.startbutton.clicked.connect(convert.convert)
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)

        UI.videoprog = QProgressBar(self.verticalLayoutWidget)
        UI.videoprog.setValue(0)
        self.verticalLayout.addWidget(self.videoprog) 
        
        self.verticalLayoutWidget.setGeometry(QRect(10, 20, 301, 571))
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)

        UI.setCentralWidget(self, self.centralwidget)

        UI.img = "C:\\Users\\...\\.png" # расположение изображения
        UI.ogg = "C:\\Users\\...\\.ogg" # расположение ogg-файла

        self.worker_thread = QThread()
        self.worker = convert()

        self.worker.progress.connect(self.update_progress)
        self.worker.finished.connect(self.complete)
        self.worker.moveToThread(self.worker_thread)
        self.worker_thread.start()

    def update_progress(self):
        UI.videoprog.setValue(MyBarLogger.index)
    
    def complete(self):
        UI.videoprog.setValue(MyBarLogger.index)

class convert(QObject):
    finished = pyqtSignal(int)
    progress = pyqtSignal(int)
    def convert(self):
            data, samplerate = sf.read(UI.ogg)
            wav = sf.write("kartinka.wav", data, samplerate)
            audioclip = AudioFileClip("kartinka.wav")
            video_length = audioclip.duration
            clip = [ImageClip(UI.img).set_duration(video_length)]

            videoclip2 = concatenate_videoclips(clip, method="compose").set_audio(audioclip)

            address = ["C:\\Users\\...", os.path.basename(UI.ogg), ".mp4"] # вставить нужную директорию
            videoclip2.write_videofile("".join(address), fps=1, logger=my_logger)

            self.finished.emit(int(MyBarLogger.index/MyBarLogger.total*100))
        
class MyBarLogger(ProgressBarLogger):
    def callback(self, **changes):
        try:
            MyBarLogger.index = self.state['bars']['t']['index']
            MyBarLogger.total = self.state['bars']['t']['total']
            UI.videoprog.setMaximum(MyBarLogger.total)
            convert.progress.emit(MyBarLogger.index) # ПРОБЛЕМА
            
        except KeyError as e:
            pass

app = QApplication(sys.argv)
UIwindow = UI()
UIwindow.show()
my_logger = MyBarLogger()
app.exec()

Текст ошибки:


Traceback (most recent call last):
  File "c:\Users\Grosscheff\Desktop\═ютр  яряър\import sys.py", line 69, in convert
    videoclip2.write_videofile("".join(address), fps=1, logger=my_logger)
  File "<decorator-gen-55>", line 2, in write_videofile
  File "C:\Users\Grosscheff\AppData\Local\Programs\Python\Python310\lib\site-packages\moviepy\decorators.py", line 54, in requires_duration
    return f(clip, *a, **k)
  File "<decorator-gen-54>", line 2, in write_videofile
  File "C:\Users\Grosscheff\AppData\Local\Programs\Python\Python310\lib\site-packages\moviepy\decorators.py", line 135, in use_clip_fps_by_default   
    return f(clip, *new_a, **new_kw)
  File "<decorator-gen-53>", line 2, in write_videofile
  File "C:\Users\Grosscheff\AppData\Local\Programs\Python\Python310\lib\site-packages\moviepy\decorators.py", line 22, in convert_masks_to_RGB       
    return f(clip, *a, **k)
  File "C:\Users\Grosscheff\AppData\Local\Programs\Python\Python310\lib\site-packages\moviepy\video\VideoClip.py", line 300, in write_videofile      
    ffmpeg_write_video(self, filename, fps, codec,
  File "C:\Users\Grosscheff\AppData\Local\Programs\Python\Python310\lib\site-packages\moviepy\video\io\ffmpeg_writer.py", line 220, in ffmpeg_write_video
    for t,frame in clip.iter_frames(logger=logger, with_times=True,
  File "C:\Users\Grosscheff\AppData\Local\Programs\Python\Python310\lib\site-packages\moviepy\Clip.py", line 471, in iter_frames
    for t in logger.iter_bar(t=np.arange(0, self.duration, 1.0/fps)):
  File "C:\Users\Grosscheff\AppData\Local\Programs\Python\Python310\lib\site-packages\proglog\proglog.py", line 190, in iter_bar
    self(**{bar + '__total': len(iterable)})
  File "C:\Users\Grosscheff\AppData\Local\Programs\Python\Python310\lib\site-packages\proglog\proglog.py", line 257, in __call__
    self.callback(**kw)
  File "c:\Users\Grosscheff\Desktop\═ютр  яряър\import sys.py", line 79, in callback
    convert.progress.emit(MyBarLogger.index) # ╧╨╬┴╦┼╠└
AttributeError: 'PyQt6.QtCore.pyqtSignal' object has no attribute 'emit'

Ответы (0 шт):