Мой младший брат только начинает программировать, и для своего проекта Science Fair он симулирует стаю птиц в небе. Он написал большую часть своего кода, и он отлично работает, но птицам нужно двигаться каждое мгновение .
Однако Tkinter тратит время на собственный цикл обработки событий, поэтому его код не запускается. Выполнение root.mainloop()
запускается, запускается и продолжает работать, и единственное, что он запускает, - это обработчики событий.
Есть ли способ запустить его код вместе с основным циклом (без многопоточности это сбивает с толку, и это должно быть простым), и если да, то что это такое?
Прямо сейчас он придумал уродливый хак, привязав свою move()
функцию к такому <b1-motion>
, что пока он удерживает кнопку и шевелит мышью, она работает. Но должен быть способ получше.
threading
модуля.Решение опубликовано Bjorn результатов в «RuntimeError: Вызов Tcl из разной кухни объединены» сообщения на моем компьютере (RedHat Enterprise 5, питон 2.6.1). Бьорн мог не получить это сообщение, поскольку, согласно одному месту, которое я проверил , неправильная обработка потоков с помощью Tkinter непредсказуема и зависит от платформы.
Проблема, похоже, в том, что это
app.start()
считается ссылкой на Tk, поскольку приложение содержит элементы Tk. Я зафиксировал это путем заменыapp.start()
сself.start()
внутренней стороны__init__
. Я также сделал так, чтобы все ссылки Tk находились либо внутри вызывающей функции,mainloop()
либо внутри функций, которые вызываются вызывающей функциейmainloop()
(это, по-видимому, критично, чтобы избежать ошибки «разные апартаменты»).Наконец, я добавил обработчик протокола с обратным вызовом, так как без этого программа завершается с ошибкой, когда окно Tk закрывается пользователем.
Пересмотренный код выглядит следующим образом:
источник
run
методу? Кажется, я не могу понять, как ...__init__(..)
, сохраняете ихself
и используете вrun(..)
while app.is_alive(): etc
При написании собственного цикла, как в симуляции (я предполагаю), вам нужно вызвать
update
функцию, которая делает то, чтоmainloop
делает: обновляет окно с вашими изменениями, но вы делаете это в своем цикле.источник
task
вызов, вы получите вложенные циклы событий, и это плохо. Если вы полностью не понимаете, как работают циклы событий, вам следует избегать звонковupdate
любой ценой.Другой вариант - позволить tkinter выполняться в отдельном потоке. Один из способов сделать это так:
Однако будьте осторожны, многопоточное программирование сложно, и действительно легко выстрелить себе в ногу. Например, вы должны быть осторожны при изменении переменных-членов приведенного выше примера класса, чтобы не прерывать цикл обработки событий Tkinter.
источник
Это первая рабочая версия того, что будет считывателем GPS и представителем данных. tkinter - очень хрупкая вещь, в которой слишком мало сообщений об ошибках. Он не поднимает ничего и не говорит, почему большую часть времени. Очень сложно исходить от хорошего разработчика WYSIWYG-форм. Во всяком случае, это выполняется небольшая процедура 10 раз в секунду и представляет информацию в форме. Потребовалось время, чтобы это произошло. Когда я попробовал установить значение таймера 0, форма так и не появилась. У меня сейчас болит голова! Мне достаточно 10 или более раз в секунду. Надеюсь, это поможет кому-то другому. Майк Морроу
источник