Tkinter filedialog разбивает входные виджеты - PullRequest
0 голосов
/ 09 января 2019

tl; dr: когда приложение вызывает tkinter.filedialog, поля entry не фокусируются должным образом.

Длинное объяснение:

При инициализации приложения tkinter поля entry включены по умолчанию. Их состояние tk.ENABLED, на них можно сфокусироваться, прокручивая поля с помощью tab, и, самое главное, на них можно щелкнуть, чтобы выбрать поле.

По какой-то причине это поведение нарушается при вызове tkinter.filedialog. Если вызывается метод tkinter.filedialog, например askdirectory или askopenfile(), поле entry по-прежнему будет иметь состояние tk.ENABLED, и фон будет правильно стилизован, но нажатие на поле ввода не будет вставьте курсор или выберите поле. Набор текста, конечно, не регистрируется.

Это можно обойти, переключившись в другое окно и вернувшись назад. Тем не менее, диалоговые окна файлов (должным образом) возвращают пользователя обратно в главное окно, поэтому пользователям всегда предоставляется главное окно, которое выглядит заблокированным.

См. Этот пример:

import tkinter as tk
from tkinter import filedialog

BR8K = True

root = tk.Tk()

if BR8K:
    filedialog.askdirectory()

entry = tk.Entry(root, takefocus=True, highlightthickness=2)
entry.grid(sticky="WE")


root.mainloop()

Здесь код работает правильно, если BR8K равен False, и неправильно, если BR8K равен True.

(Примечание. В производственной среде это будет объектно-ориентированным. Проблема сохраняется в объектно-ориентированной среде.)

1 Ответ

0 голосов
/ 09 января 2019

Это известные проблемы, возникающие из-за того, что диалоговое окно вызывается до первого вызова mainloop ().

Самый простой способ исправить это - добавить update_idletask() перед диалоговым окном.

Попробуйте это:

import tkinter as tk
from tkinter import filedialog

BR8K = True

root = tk.Tk()
# By adding this you avoid the focus breaking issue of calling dialog before the mainloop() has had its first loop.
root.update_idletasks() 

if BR8K:
    filedialog.askdirectory()

entry = tk.Entry(root, takefocus=True, highlightthickness=2)
entry.grid(sticky="WE")


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