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'