Запустить поток Tk.mainloop () с другим потоком - PullRequest
0 голосов
/ 22 мая 2019

Я хочу выполнить некоторый код во время работы Tk.mainloop (), поэтому я думаю, что мне нужен модуль потоков.

Я попытался поместить Tk.mainloop() в метод run класса потока, а затем поместил код, который хочу запустить, пока mainloop работает в другом потоке.

from threading import Thread
import tkinter as tk

class MyThread(Thread):
    def __init__(self):
        Thread.__init__(self)

    def run():
        # window is tk.Tk()
        window.mainloop()

class MyCode(Thread):
# my code

TkinterThread = MyThread()
TkinterThread.start()
OtherThread = MyCode()
OtherThread.start()

и ткинтер сообщает мне об ошибке

RuntimeError: Calling Tcl from different apartment

поэтому я искал в интернете и понял, что основной цикл может быть запущен только из потока, потому что работает только в одном из них. Итак, есть ли способ запустить другой поток, пока работает mainloop?

1 Ответ

1 голос
/ 22 мая 2019

Вы можете запускать код в других потоках.Проблема не в том, что несколько потоков per se , а в том, что у вас есть код tkinter в более чем одном потоке.Весь код tkinter должен быть в одном потоке.

Обычно лучше сделать это основным потоком (и создать виджеты, и запустить mainloop), и запустить другой код во вторичном потоке или процессе.Вы можете использовать потокобезопасную очередь для отправки информации между потоками, например, при передаче результатов обратно в графический интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...