Тривиальная кнопка tkinter работает на Python 3.5, изначально не отвечает на Python 3.6, 3.7 - PullRequest
2 голосов
/ 08 марта 2019

На Python 3.6 и 3.7 на MacOS 10.12.6, tkinter.Button изначально не реагирует на щелчки - но тот же код отлично работает на Python 3.5.

Если я запускаю следующий скрипт:

import tkinter as tk

root = tk.Tk()
button = tk.Button(root, text='Button')
button.pack()
root.mainloop()

, то в Python 3.6 и 3.7, как и ожидалось, появляется окно с одной кнопкой, которое визуально не отключается, но при нажатиина это никак не влияет.

Изменение размера окна или нажатие в другом месте в нем не решает проблему.Однако если я выведу другое приложение на передний план, а затем выведу приложение Python на передний план, все будет отлично, и я не смогу заставить проблему снова появиться.

В Python 3.5, запуск тестового скриптавызывает приложение и кнопка сразу реагирует на нажатия - как и ожидалось.Эксперимент не смог воспроизвести какие-либо проблемы в 3.5.Сценарий также отлично работает в Python 2.7, если tkinter заменен на Tkinter.

Изменение менеджера компоновки pack на grid дало точно такие же результаты.

Я пошелчто касается перезагрузки компьютера без изменений.

Я почти на 100% уверен, что двоичные файлы и библиотеки Python 3.6 и Python 3.7 находятся в хорошем состоянии.Они по сути чистые установки, так как я работаю полностью в virtualenvs.И мое нетривиальное приложение tkinter работает одинаково на Python 3.5, 3.6 и 3.7, за исключением одной проблемы.

1 Ответ

3 голосов
/ 08 марта 2019

У меня нет Mac для тестирования, но ваша проблема звучит очень похоже на проблему с фокусировкой, которая может возникнуть в окнах, когда вы открываете диалоговое окно файла до того, как mainloop имеет свой первый полный цикл. Эта проблема имеет такие же симптомы, как то, что вы не позволяете фокусу вернуться к окну, пока вы не откроете какое-либо другое приложение, а затем вернетесь к приложению tkinter и тогда оно заработает.

Способ устранения проблемы с фокусировкой - применить root.update_idletasks() перед проблемой (т. Е. Прямо перед открытием диалогового окна файла) и в этом случае прямо перед вашей кнопкой.

Как указала ОП, им пришлось добавить root.update_idletasks() до и после виджета, и я не уверен, почему это было исправлением для OSX. Для тех, кто читает это с той же проблемой на Mac, попробуйте этот вариант для обхода.

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