ARTICLE AD BOX
I'm going to do Progress bar with moviepy on my video editor program.
when i render video (from moviepy code). it will appear Progress bar window that it show % progress of render. I can use Class MyUILogger to calculate % progress of render And it can show on % Progress bar window (UI from tkinter ).
But I got problem while rendering. When moviepy code are rendering everything that show on UI (Progress bar window) will stunned , % Progress of render cannot update data and stop at 0 until rendering is finish.
I just need Progress bar window update % by real time while moviepy render. I know I don't know about Moviepy and Threading too much. So i would like to know how to use and design it for make it work. if you know about Progress bar UI on Moviepy. please tell me.
This is what i use to do.
1. When program are rendering.
It will appear Progress bar window, and then run write_videofile ( moviepy) ***(still not use threading)
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)Result : ProgressBar window appear and stop at 0% while write_videofile rendering. It will not update anything on UI until rendering is complete. and then % on ProgressBar window will change to 100% . It only shown % update on Terminal.
2.Use Theading
Some one tell me maybe you should use Theading. but i never use it nefore.
I use Function 1 is ProgressBar and Function 2 (ProgressVideo) is 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)Result : program will run only code that on Terminal only. if i try to code build window such as
windowProgressBar = tk.Tk()on function ProgressBar and run it with threading.Thread. It will not appear.
*** Of cause, some problem happen because i don't know about threading enough. So please teach me how to use threading on moviepy rendering and UI progress bar correctly. Or you have some code like this please show me. Thank you.
