Как отобразить ход преобразования write_audiofile из moviepy в приложении PyQt5?

#python #pyqt5 #progress-bar #moviepy

#python #pyqt5 #индикатор выполнения #moviepy

Вопрос:

Я хочу преобразовать файл mp4 в файл mp3 с помощью функции write_audiofile из библиотеки moviepy и отобразить прогресс в приложении PyQt5 с помощью progressbar.

когда я использую:

 mp4audio.write_audiofile(filename, logger="bar")
  

он показывает индикатор выполнения в консоли, так могу ли я каким-то образом получить доступ к этой переменной прогресса и использовать ее для обновления моего индикатора выполнения в приложении PyQt5?

Я тоже пробовал это:

 from proglog import ProgressBarLogger
from my_library import my_routine

class MyBarLogger(ProgressBarLogger):

    def callback(self, **changes):
        # Every time the logger is updated, this function is called with
        # the `changes` dictionnary of the form `parameter: new value`.

        for (parameter, new_value) in changes.items():
            print ('Parameter %s is now %s' % (parameter, value))

logger = MyBarLogger()
my_routine(logger=logger)

  

но он записывает сообщения только при запуске и при завершении. Не прогресс.

 Parameter message is now MoviePy - Writing audio in C:/Users/.../file.mp3
Parameter message is now MoviePy - Done.
  

Кто-нибудь знает решение, пожалуйста?

Комментарии:

1. Похоже, что moviepy использует proglog , поэтому вы можете реализовать свой собственный подкласс ProgressBarLogger, переопределить его callback и использовать его экземпляр в качестве logger параметра для write_audiofile() .

Ответ №1:

Похоже, что он не очень хорошо документирован, proglog но callback ProgressBarLogger получает доступ к одноразовым сообщениям, но bars_callback необходим для самого прогресса:

 class MyBarLogger(ProgressBarLogger):
    def callback(self, **changes):
        # Every time the logger message is updated, this function is called with
        # the `changes` dictionary of the form `parameter: new value`.
        for (parameter, value) in changes.items():
            print ('Parameter %s is now %s' % (parameter, value))
    def bars_callback(self, bar, attr, value,old_value=None):
        # Every time the logger progress is updated, this function is called        
        percentage = (value / self.bars[bar]['total']) * 100
        print(bar,attr,percentage)