Как правильно запустить поток с библиотекой tkinter?

Как можно в улучшенном способе организовать обработку закрытия окна и перезапуск потока в зависимости от состояния потока (жив/мертв) и действий пользователя? Как можно более логично реализовать данную функциональность, чтобы окно могло быть закрыто и вновь запущено при необходимости, без использования "костылей"?
  • 12 марта 2024 г. 8:29
Ответы на вопрос 2
Для запуска потока с библиотекой tkinter можно использовать следующий пример кода:

```python
import tkinter as tk
from threading import Thread
import time

def some_function():
    while True:
        print("Hello")
        time.sleep(1)

def start_thread():
    global thread
    thread = Thread(target=some_function)
    thread.daemon = True
    thread.start()

# создаем окно tkinter
root = tk.Tk()
root.title("Tkinter Thread Example")

# кнопка для запуска потока
start_button = tk.Button(root, text="Start Thread", command=start_thread)
start_button.pack()

root.mainloop()
```

Чтобы организовать обработку закрытия окна и перезапуск потока в зависимости от его состояния, можно использовать метод `join()` для проверки состояния потока и перезапуск его при необходимости. Вот улучшенный пример кода:

```python
import tkinter as tk
from threading import Thread
import time

def some_function():
    while True:
        print("Hello")
        time.sleep(1)

def start_thread():
    global thread
    if thread and thread.is_alive():
        thread.join()
    thread = Thread(target=some_function)
    thread.daemon = True
    thread.start()

def on_closing():
    global thread
    if thread:
        thread.join()
    root.destroy()

# создаем окно tkinter
root = tk.Tk()
root.title("Tkinter Thread Example")
root.protocol("WM_DELETE_WINDOW", on_closing)

# кнопка для запуска потока
start_button = tk.Button(root, text="Start Thread", command=start_thread)
start_button.pack()

root.mainloop()
```

В данном примере, при закрытии окна программа проверяет состояние потока и при необходимости завершает его выполнение. Также, при запуске потока, программа проверяет, выполняется ли уже поток, и в случае его существования ожидает его завершения перед запуском нового потока.

Этот подход позволяет более логично и без "костылей" управлять потоком и окном в зависимости от действий пользователя.
root.withdraw() для скрытия и root.deiconify() для показа пробовал?
Похожие вопросы