когда я рендерю видео (из кода 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)
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()
*** Конечно, некоторые проблемы возникают из-за того, что я недостаточно разбираюсь в многопоточности. Поэтому, пожалуйста, научите меня, как правильно использовать потоки при рендеринге Moviepy и индикаторе выполнения пользовательского интерфейса. Или у вас есть такой код, пожалуйста, покажите мне. Спасибо.
Мобильная версия