Tkinter文件对话框中断条目小部件

时间:2019-01-09 19:45:02

标签: python tkinter tk

tl; dr:当应用程序调用{​​{1}}时,tkinter.filedialog字段无法正确聚焦。

详细说明:

初始化tkinter应用程序时,默认情况下启用entry字段。它们的状态为entry,可以通过滚动tk.ENABLED来关注它们的状态,最重要的是,可以单击它们以选择该字段。

由于某种原因,此行为通过调用tab来破坏。如果调用tkinter.filedialog的方法,例如tkinter.filedialogaskdirectory,则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,则代码会正常运行;如果FalseBR8K,则代码会运行不正常。

(注意:在生产环境中,这将是面向对象的。问题仍然存在于面向对象的环境中。)

1 个答案:

答案 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()
相关问题