Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 29, 2023 16:26:34

invectro
Зарегистрирован: 2023-06-29
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Как в отдельном потоке выполнить код?

Создаю свой видеоредактор. Сделал 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 выводился процент выполнения записи видео.

Офлайн

#2 Июль 8, 2023 20:18:26

romario82
Зарегистрирован: 2013-04-10
Сообщения: 56
Репутация: +  2  -
Профиль   Отправить e-mail  

Как в отдельном потоке выполнить код?

Есть такой модуль threading
https://pythonim.ru/moduli/threading-python

Офлайн

#3 Июль 9, 2023 16:47:35

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Как в отдельном потоке выполнить код?

Та же ошибка что и вначале - вы при нажатии кнопки создаете тред
Вам же нужно создать его отдельно и по нажатию кнопки помещать в него задачу
Так же можете посмотреть хороший пример где треды в самом куте используют
https://realpython.com/python-pyqt-qthread/



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#4 Июль 11, 2023 18:44:54

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1348
Репутация: +  118  -
Профиль   Отправить e-mail  

Как в отдельном потоке выполнить код?

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

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version