tk 后无法输入
No input possible after tk
如果有这段代码:
import Tkinter as tk
import tkFileDialog
menu = tk.Tk()
res = tkFileDialog.askopenfilename() # un-/comment this line
label = tk.Label(None, text="abc")
label.grid(row=0, column=0, sticky=tk.W)
entry = tk.Entry(None)
entry.grid(row=0, column=1, sticky=tk.EW)
res = menu.mainloop()
注意:askopenfilename
只是一个虚拟输入。所以只要关闭它就可以到达 TK 的(现在被阻止的)主要 window。
当我评论 askopenfilename
时一切正常。但是有了它,我无法在条目中输入数据。
这只发生在 Windoze 环境中。 askopenfilename
似乎抢走了主要 TK window 的焦点。单击完全不同的 window 并在 TK window 中再次返回后,可以输入。
askopenfilename
有自己的事件循环。程序停止,直到您选择了一个文件名,然后继续。
我以前看过这方面的报告,我认为这是 windows 上的一个已知错误。在打开对话框之前,您需要让 mainloop 启动。
如果您希望对话框在应用程序首次启动时出现,您可以使用 after
或 after_idle
使其在 mainloop
启动后 运行。
例如:
menu = tk.Tk()
...
def on_startup():
res = tkFileDialog.askopenfilename()
menu.after_idle(on_startup)
menu.mainloop()
如果您不想在对话框之后执行任何其他 GUI 代码,请移动所有代码,除了创建根 window 并调用 mainloop
到 on_startup
或其他一些函数。
例如:
def main(filename):
label = tk.Label(None, text="abc")
label.grid(row=0, column=0, sticky=tk.W)
entry = tk.Entry(None)
entry.grid(row=0, column=1, sticky=tk.EW)
def on_startup():
res = tkFileDialog.askopenfilename()
main(filename)
root = Tk()
root.after_idle(on_startup)
如果有这段代码:
import Tkinter as tk
import tkFileDialog
menu = tk.Tk()
res = tkFileDialog.askopenfilename() # un-/comment this line
label = tk.Label(None, text="abc")
label.grid(row=0, column=0, sticky=tk.W)
entry = tk.Entry(None)
entry.grid(row=0, column=1, sticky=tk.EW)
res = menu.mainloop()
注意:askopenfilename
只是一个虚拟输入。所以只要关闭它就可以到达 TK 的(现在被阻止的)主要 window。
当我评论 askopenfilename
时一切正常。但是有了它,我无法在条目中输入数据。
这只发生在 Windoze 环境中。 askopenfilename
似乎抢走了主要 TK window 的焦点。单击完全不同的 window 并在 TK window 中再次返回后,可以输入。
askopenfilename
有自己的事件循环。程序停止,直到您选择了一个文件名,然后继续。
我以前看过这方面的报告,我认为这是 windows 上的一个已知错误。在打开对话框之前,您需要让 mainloop 启动。
如果您希望对话框在应用程序首次启动时出现,您可以使用 after
或 after_idle
使其在 mainloop
启动后 运行。
例如:
menu = tk.Tk()
...
def on_startup():
res = tkFileDialog.askopenfilename()
menu.after_idle(on_startup)
menu.mainloop()
如果您不想在对话框之后执行任何其他 GUI 代码,请移动所有代码,除了创建根 window 并调用 mainloop
到 on_startup
或其他一些函数。
例如:
def main(filename):
label = tk.Label(None, text="abc")
label.grid(row=0, column=0, sticky=tk.W)
entry = tk.Entry(None)
entry.grid(row=0, column=1, sticky=tk.EW)
def on_startup():
res = tkFileDialog.askopenfilename()
main(filename)
root = Tk()
root.after_idle(on_startup)