Проблема с обновлением индикатора выполнения пользовательского интерфейса при рендеринге с помощью кода Moviepy. (каждыйPython

Программы на Python
Ответить
Anonymous
 Проблема с обновлением индикатора выполнения пользовательского интерфейса при рендеринге с помощью кода Moviepy. (каждый

Сообщение Anonymous »

Я собираюсь сделать индикатор выполнения с помощью Moviepy в своей программе видеоредактора.

когда я рендерю видео (из кода Moviepy). Появится окно индикатора прогресса, показывающее % прогресса рендеринга. Я могу использовать класс MyUILogger для расчета % прогресса рендеринга. И он может отображаться в окне % прогресса (пользовательский интерфейс из tkinter).
Но у меня возникла проблема при рендеринге. Когда код Moviepy рендерит все, что отображается в пользовательском интерфейсе (окно индикатора выполнения), будет ошеломлен, % Progress рендеринга не может обновлять данные и останавливаться на 0, пока рендеринг не завершится.
Мне просто нужно обновление % окна индикатора выполнения в реальном времени во время рендеринга Moviepy. Я знаю, что не слишком много знаю о Moviepy и Threading. Поэтому я хотел бы знать, как его использовать и спроектировать, чтобы он работал. если вы знаете о пользовательском интерфейсе индикатора выполнения в Moviepy. скажите мне, пожалуйста.
Это то, что я делаю.
1. Когда программа выполняет рендеринг.
Появится окно индикатора выполнения, а затем запустите write_videofile ( Moviepy)
*** (потоки все еще не используются)

Код: Выделить всё

def RUN():
def Render():
from moviepy import VideoFileClip, CompositeVideoClip
import proglog
import tkinter as tk

class MyUILogger(proglog.ProgressBarLogger):
def bars_callback(self, bar, attr, value, old_value=None):
total = self.bars[bar]['total']
percentage = (value / total) * 100

# Send results to terminal and windowProgressBar UI
print(f"กำลังประมวลผล ({bar}): {percentage:.2f}%")
image_label2 = tk.Label(windowProgressBar, text=percentage).place(x=110, y=80)

#---- Fuction of Render --------------------------
clip = VideoFileClip("Test Short chip.mp4")
final_clip = CompositeVideoClip(clip)
my_logger = MyUILogger()
final_clip.write_videofile("Test 2 F002.mp4", fps=clip.fps, logger=my_logger)

##---- Function of RUN ------------------------------------------
import tkinter as tk

windowProgressBar = tk.Tk()
windowProgressBar.title("Loading...")
windowProgressBar.geometry("430x150+720+600")  # กำหนดขนาด window ย่อย
image_label1 = tk.Label(windowProgressBar, text="Loading...            %").place(x=50, y=80)
image_label = tk.Label(windowProgressBar, text=0).place(x=110, y=80)

windowProgressBar.after(100, Render)
Результат: окно ProgressBar появляется и останавливается на отметке 0 % во время рендеринга write_videofile. Он не будет ничего обновлять в пользовательском интерфейсе до завершения рендеринга. а затем % в окне ProgressBar изменится на 100%. На Терминале отображалось только обновление %.
2. Используйте Theading
Кто-то сказал мне, что, возможно, вам следует использовать Theading. но я никогда раньше не использовал ее.
Я использую функцию 1 — ProgressBar, а функцию 2 (ProgressVideo) — Render write_videofile.

Код: Выделить всё

def RUN():
def Render():
from moviepy import VideoFileClip ,CompositeVideoClip
import proglog
import tkinter as tk

class MyUILogger(proglog.ProgressBarLogger):
def bars_callback(self, bar, attr, value, old_value=None):
global percentage
total = self.bars[bar]['total']
percentage = (value / total) * 100

# Send results to terminal and windowProgressBar UI
print(f"กำลังประมวลผล ({bar}): {percentage:.2f}%")
image_label2 = tk.Label(windowProgressBar, text=percentage).place(x=110, y=80)

def ProgressBar():
image_label2 = tk.Label(windowProgressBar, text=percentage).place(x=110, y=80)

def RenderVideo():
final_clip.write_videofile("Test 2 F002.mp4", fps=clip.fps, logger=my_logger)

#---- Fuction of Render --------------------------
clip = VideoFileClip("Test Short chip.mp4")
final_clip = CompositeVideoClip(clip)
my_logger = MyUILogger()

thread1 = threading.Thread(target=ProgressBar)
thread2 = threading.Thread(target=RenderVideo)
thread1.start()
thread2.start()
thread1.join()
thread2.join()

##---- Function of RUN ------------------------------------------
import tkinter as tk
import threading

windowProgressBar = tk.Tk()
windowProgressBar.title("Loading...")
windowProgressBar.geometry("430x150+720+600")  # กำหนดขนาด window ย่อย
image_label1 = tk.Label(windowProgressBar, text="Loading...            %").place(x=50, y=80)
image_label2 = tk.Label(windowProgressBar, text=0).place(x=110, y=80)

windowProgressBar.after(100, Render)
Результат: программа будет запускать только код, который используется только в Терминале. если я попытаюсь создать окно сборки кода, например

Код: Выделить всё

windowProgressBar = tk.Tk()
в функции ProgressBar и запустите ее с помощью threading.Thread. Он не появится.
*** Конечно, некоторые проблемы возникают из-за того, что я недостаточно разбираюсь в многопоточности. Поэтому, пожалуйста, научите меня, как правильно использовать потоки при рендеринге Moviepy и индикаторе выполнения пользовательского интерфейса. Или у вас есть такой код, пожалуйста, покажите мне. Спасибо.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»