tl; dr:当应用程序调用{{1}}时,tkinter.filedialog
字段无法正确聚焦。
详细说明:
初始化tkinter应用程序时,默认情况下启用entry
字段。它们的状态为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
,则代码会运行不正常。
(注意:在生产环境中,这将是面向对象的。问题仍然存在于面向对象的环境中。)
答案 0 :(得分:1)
这是一个已知问题,是由于在第一次到达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()