@ganstar565

Как обойти ошибку Tcl_AsyncDelete: async handler deleted by the wrong thread?

Вот проблемный участок кода:
spoiler
responses = []
def part3():
	global responses
	for i in end:
		if i in end2:
			responses.append(prompt(i))
			continue

		alert(i.capitalize())



th1 = tr.Timer(15, part2,).start()
th2 = tr.Timer(20, part3,)
th2.start()


Ошибку вызывает функция prompt из модуля pyautogui.
prompt - вызывает окошко для для ввода текста.
alert - просто текстовое окошко из того же модуля, ошибки не вызывает.
пробовал использовать другой модуль с схожим функционалом, ошибка сохряняется.
try\except не спасает т.к. ошибка принтится, а не рейзится.
Функцию необходимо запускать в Timer() из модуля threading.
Какие ещё есть способы обойти эту ошибку?
  • Вопрос задан
  • 35 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Поясню ответ выше: насколько я знаю, графические интерфейсы строго однопоточны. Как минимум под Windows это так, а потому ни один графический фреймворк не поддерживает обращение к окнам и их элементам из других потоков.
Как следствие, если ты хочешь организовать фоновый поток с "обратной связью" в GUI, обычно требуется использовать очередь, например, queue.Queue. В эту очередь фоновый поток должен класть сообщения, объясняющие, что надо сделать - например, сведения о прогрессе операции, или команды на смену состояния, или ещё что. Это зависит от твоей задачи.
Тогда основной поток программы, который и отвечает за GUI, должен использовать средства фреймворка для периодической проверки очереди на предмет сообщений. Например, в обычном tkinter это будет реализовано через метод after().
Если в очереди есть сообщения, основной поток читает их и выполняет соответствующие действия - например, меняет положение прогресс-бара, включает/выключает кнопки, и т.д.
Если фоновый (рабочий) поток живёт долго, то может иметь смысл организовать вторую очередь для передачи команд из GUI-потока в рабочий. Идея та же самая: рабочий поток ждёт появления команды в своей входной очереди, и выполняет её, а потом сбрасывает уведомления в исходящую очередь.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Оконные интерфейсы несовместимы с многопоточным выполнением.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы