Найти - Пользователи
Полная версия: Как в отдельном потоке выполнить код?
Начало » Python для новичков » Как в отдельном потоке выполнить код?
1
invectro
Создаю свой видеоредактор. Сделал GUI интерфейс на PyQT6.
Вся работа с видео происходит с помощью библиотеки - moviepy.

Есть функция - create_video. Она создает и сохраняет в нужную папку финальный вариант видео (после всех манипуляций).

 def create_video():
  // здесь выполняются манипуляции с видео, код вырезал.
  // в конце происходит запись в файл
   video.write_videofile('.../output/video.mp4')

Проблема в том, что когда запускаю эту функцию (нажатием на кнопку), то зависает вся программа. Не возможно ничего сделать. А ведь видео может обрабатываться по 10 минут. После выполнения кода, все работает как надо.

Погуглил, понял что нужно делать эту функцию в отдельном потоке. Сделал поток и ничего не изменилось. Прошу помочь, вот код:

 // в начале кода объявил
from threading import Thread   
// по нажатию кнопки эта функция запускает create_video
def btn_create_onclick():
    t1 = Thread(target=create_video)
    t1.start()
    t1.join()

Хотелось бы не просто сделать её в отдельном потоке, а еще чтобы в Progress Bar выводился процент выполнения записи видео.
romario82
Есть такой модуль threading
https://pythonim.ru/moduli/threading-python
ZerG
Та же ошибка что и вначале - вы при нажатии кнопки создаете тред
Вам же нужно создать его отдельно и по нажатию кнопки помещать в него задачу
Так же можете посмотреть хороший пример где треды в самом куте используют
https://realpython.com/python-pyqt-qthread/
xam1816
  
import time
import threading
import tkinter as tk
from tkinter import ttk
class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.button = tk.Button(self, command=self.start_action,
                                text="начать")
        self.button.pack(padx=50, pady=20)
    def start_action(self):
        thread = threading.Thread(target=self.run_action)
        print(threading.main_thread().name)
        print(thread.name)
        thread.start()
    def run_action(self):
        print("Запуск длительного действия...")
        progress_bar = ttk.Progressbar(self, mode="determinate", length=400, maximum=101)
        progress_bar.pack(pady=10)
        for i in range(10):
            progress_bar.step(10)
            time.sleep(1)
        print("Длительное действие завершено!")
if __name__ == "__main__":
    app = App()
    app.mainloop()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB