|
0 / 0 / 0
Регистрация: 09.05.2022
Сообщений: 7
|
|||||||||||
Tkinter + Threading: Tcl_AsyncDelete: async handler deleted by the wrong thread09.05.2022, 23:19. Показов 3242. Ответов 12
Всем привет. Коллеги, помогите решить проблему Tcl_AsyncDelete: async handler deleted by the wrong thread.
Описание программы: Занимается парсингом футбольных матчей, даёт возможность поставить матчи очередь проверки, и отдельный класс бегает проверяет очередь на то подошло ли время, если подошло - делает запрос на сайт для получения инфы, проверяет по логике и если всё ок - отправляет в группу телеграмма. Приложил ниже пример одного из окон и вкратце запуск приложения + чекер Окна открываются через
0
|
|||||||||||
| 09.05.2022, 23:19 | |
|
Ответы с готовыми решениями:
12
Multiprocessing и аналог threading.Thread System::Threading::Thread Потоки в CLR |
|
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
|
|
| 10.05.2022, 10:54 | |
|
Виджеты Tkinter не любят, когда к ним обращаются из других потоков. По преведённому коду мало, что можно сказать.
Добавлено через 5 минут Приведите строку, которая даёт это ошибку, чтоли.
0
|
|
|
0 / 0 / 0
Регистрация: 09.05.2022
Сообщений: 7
|
|||||||||||
| 10.05.2022, 16:28 [ТС] | |||||||||||
|
Дело в том, что он не жалуется на определённую строку, но попробую отследить на какую именно тригерится.
Про виджеты я прочитал, поэтому не затрагиваю их из второго потока, там цикл бегает только по базе / запросам к сайту и к телеграмму. Добавлено через 5 часов 15 минут несколько раз уже завершило работу на строке
0
|
|||||||||||
|
0 / 0 / 0
Регистрация: 09.05.2022
Сообщений: 7
|
|
| 11.05.2022, 00:22 [ТС] | |
|
В общем - да. Я сделал кучу флагов и срабатывает действительно на строке указанной выше. Причем как воспроизводится проблема:
Запускаешь программу, бегаешь по окнам - воспроизведется ошибка, когда условие перехода на данный участок кода будет успешно. После этого запускаешь программу снова, не бегая по окнам - всё работает стабильно, даже при попадании на данный участок. Откроешь / закроешь какие-либо окна - снова будет ошибка.
0
|
|
|
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
|
||
| 11.05.2022, 09:17 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 09.05.2022
Сообщений: 7
|
|
| 11.05.2022, 11:12 [ТС] | |
|
Абсолютно никак.
Заполнение/Обновление таблиц на gui идёт в момент вызова самого окна с таблицей
0
|
|
|
1568 / 741 / 321
Регистрация: 02.05.2020
Сообщений: 1,660
|
|
| 11.05.2022, 12:04 | |
|
А попробуйте создавать и запускать новый поток после
app = App(), а не до.
0
|
|
|
0 / 0 / 0
Регистрация: 09.05.2022
Сообщений: 7
|
||||||||||||||||
| 12.05.2022, 17:06 [ТС] | ||||||||||||||||
|
Попробовал - проблема так же остаётся.
Проверил что ошибка воспроизводится только если ты открывал/закрывал другие окна. Немного больше вводной инфы: При первом запуске открывается окно с одной кнопкой (1й скрин), после нажатия идёт парсинг и открывает "разводящую страницу" с кнопками навигации по другим окнам. Если с разводящей страницы не переходить никуда - всё отрабатывает корректно. Если поставить вместо разводящей страницы открывать любое другое окно - всё работает корректно. Но если с разводящей открыть другое окно (или открыть и закрыть его) - всё падает с ошибкой Tcl_AsyncDelete при подходе условий к выводу в телегу. Разводящая открывается по коду:
0
|
||||||||||||||||
| 12.05.2022, 19:39 | ||||||
|
Ну, Xerber, заинтриговали
![]() Не хотите/ не можете показать свой код - нет проблем, давайте возьмём что-нибудь в качестве модельки и попробуем научить её работать правильно. Например, вот отсюда https://solveforum.com/forums/... ad.288388/ :
Стартовое, правда, само не гаснет, но его можно и ручками закрыть. А после этого можно закрыть основное и получить ту же самую ошибку, что и у Вас. Что тут не так? Чего ей не хватает-то?
0
|
||||||
|
0 / 0 / 0
Регистрация: 09.05.2022
Сообщений: 7
|
|||||||||||||||||||||
| 12.05.2022, 21:03 [ТС] | |||||||||||||||||||||
|
Странно что есть функция check в load которая не вызывается, но мне и тут не понятно почему вылазит данная ошибка если мы закрываем окно из первого треда. Я так понимаю замысел был передать loaded в другой тред для закрытия окна, но она не глобальная даже..
Пытался связать со своим случаем - не получается т.к. мои потоки абсолютно не общаются друг с другом и не ожидают чего-то. Вы правы, вот код треда
0
|
|||||||||||||||||||||
| 13.05.2022, 01:01 | |
|
Xerber, вот это номер... Как Вы лихо воспроизводите все окна от корневого tkinter.Tk(). Ну, не стоит этого делать-то!
Такое окно (главное окно), по определению, может быть только в одном единственном экземпляре на всё приложение, как и соответствующий ему главный цикл обработки событий mainloop. А требующиеся дополнительные окна верхнего верхнего уровня вообще-то создаются с помощью tkinter.TopLevel(). Я даже не буду дальше смотреть (уж, простите), только добавлю, что в tkinter за графический интерфейс отвечает именно главный поток. Дополнительные потоки могут только готовить какие-то данные, на основании которых главный поток будет создавать и отрисовывать элементы графического интерфейса. А тот пример, что я Вам привёл, как раз наглядно показывает до чего доводит нарушение этого правила. Вы свой код знаете лучше. Посмотрите, не запускаете ли Вы какое-нибудь окно в дополнительном потоке, как это сделал автор вышеуказанного примера, не изменяете ли Вы элементы GUI непосредственно из дополнительного потока и т.д. Ведь все операции по созданию, изменению и удалению элементов GUI должны выполняться именно из главного потока. Наверняка можно найти массу примеров здесь или на других ресурсах...
0
|
|
|
0 / 0 / 0
Регистрация: 09.05.2022
Сообщений: 7
|
|
| 13.05.2022, 14:08 [ТС] | |
|
Спасибо за информацию про tkinter.TopLevel(), я обязательно изучу данный вопрос и перепишу код.
> в tkinter за графический интерфейс отвечает именно главный поток. Дополнительные потоки могут только готовить какие-то данные, на основании которых главный поток будет создавать и отрисовывать элементы графического интерфейса. Это я читал и мой второй поток никаким образом не взаимодействует с gui, только вносит изменения в базу. mainloop так же присутствует только в 1 экземпляре, более нигде не упоминается. Дополнительные потоки так же не создаются не в каком окне
0
|
|
| 13.05.2022, 16:14 | ||||||
|
Xerber, не в обиду, но косяк-то с tkinter.Tk() настолько явный, что грех было на него не указать. С другой стороны, расчитывать тут на полный аудит такого объёмного кода тоже, наверное, не следует, но помочь, по крайней мере, попытаюсь. Вот Вы всё прошерстили и железно уверены, что GUI тут не при чём. С другой стороны, нет никаких данных о том, что такая ситуация может возникать только исключительно из-за GUI. Может быть виноват кто-то другой?
Хотя я уже, конечно, как говорится "не знал да и забыл" этот tkinter, что-то он мне сразу не пошёл, поэтому то, что отмечу сейчас может тоже оказаться не при чём. В коде окон и в коде дополнительного потока встречаются некие конструкции примерно такого вида:
Я бы на Вашем месте не парился с полноценным приложением, а слепил бы для начала легковесную модельку, чтобы отработать все тёмные места. Ну, Вы в блог ко мне заглядывали - видели чего я там творю
0
|
||||||
| 13.05.2022, 16:14 | |
|
Помогаю со студенческими работами здесь
13
Threading.Thread Передача значений методу Can't create handler inside thread that has not called Looper.prepare() Can't create handler inside thread that has not called Looper.prepare()
System.Threading.Thread.Sleep запускается не там, где прописан Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git
main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели
8ATzM_2aurI
|
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2.
Задача: запретить редактирование документа, если он открыт у другого пользователя.
/ / . . .
|
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои.
А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
|
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
kYBz3eJf3jQ
|
|
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
|
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
|
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора
Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если. . .
|
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
|