2013-06-18 3 views
-1

Я играю с контроллером движения, поэтому, чтобы «щелкнуть» кнопку, я выясню, какая кнопка ближе всего к середине в любой заданной точке, а затем с помощью кнопки button.invoke ().Python tkinter button.invoke method problem

Я уверен, что кнопки и настройка работают, потому что всякий раз, когда я нажимаю кнопки, они работают нормально. Однако, когда кнопка вызывается с помощью метода «button.invoke», все это просто зависает.

Дополнительная информация, которая может быть полезна: - Гви обновляется в своей собственной резьбе через функцию .mainloop. - Все работает нормально при нажатии мышью - Метод button.invoke() отлично работает - при выполнении простой операции печати. Он только зависает при переключении кадра.

Любая помощь будет большой, спасибо.

+4

Можете ли вы поделиться некоторым кодом, чтобы показать нам немного больше работы, особенно вокруг того, что происходит внутри 'button.invoke()'? – Oren

+1

Кроме того, вызывается 'button.invoke' из другого потока, чем' mainloop'? Это не является законным в tkinter; он может работать в некоторых случаях, но не в других, или один и тот же случай может работать иногда, но не всегда, или он может работать на одной платформе или версии Tk, но не на другом и т. д., но если он когда-либо работает, это происходит только потому, что вы везучий; это не предполагается. – abarnert

+0

Я думаю, что вы столкнулись с проблемой на голове. Проблема состоит в том, что в потоке A выполняется mainloop(), который просто ждет чего-то, поэтому он никогда не покинет эту строку. Thread B вызывает кнопку при использовании контроллера движения. Я должен по-настоящему изменить свой вопрос на этом этапе: «Как я могу запустить« Mainloop »только в течение конечного времени? Или измените что-то такое, что mainloop обработает изменение» – user2498925

ответ

0

Вы говорите, что mainloop работает в отдельном потоке, откуда вы создаете виджеты? Если это так, это ваша проблема. Вы можете только вызывать функции tkinter из одного потока.

+0

Извините, я должен был быть более ясным. Итак, вот в чем проблема: Thead A - ответственный за создание GUI в его инициализации, а работающий «a.mainloop()» Это нормально, когда он обнаруживает свои собственные нажатия кнопок. Резьба B - управляет камерой движения. Поскольку идея заключается в том, чтобы не использовать мышь, я использую метод closeest_button.invoke(). Однако - это означает, что команда запускается из потока B, потому что в отличие от нажатия кнопки это не изменение на gui (не нажатие кнопки phyical, просто выполняет соответствующую команду), который нить A затем поднимает в своем основном цикле - он вызывает команду. – user2498925

+0

@ user2498925: вы не можете запустить метод 'invoke' из другого потока. Общее решение заключается в том, что ваш поток помещает что-то в поточную безопасную очередь, а затем периодически просматривает очередь GUI. Есть примеры этого в stackoverflow. –

+0

Проблема с этим, однако, в том, что поток GUI выполняет функцию mainloop. И не будет выполнять никаких других строк до тех пор, пока графический интерфейс не умрет. – user2498925