#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)