Python askstring后,Tkinter焦点丢失
我目前正在实施一个程序,它使用了许多tkinter帧,在打开子帧时,我希望为用户锁定超帧(否则事情将无法解决)。经过一些研究,我发现抓斗设置和抓斗释放方法工作得很好 但是,一旦子帧(由Toplevel实例化)调用askstring,抓取将“丢失”,用户可以再次与superlevel窗口交互。例如(非常简化的代码):Python askstring后,Tkinter焦点丢失,python,tkinter,focus,Python,Tkinter,Focus,我目前正在实施一个程序,它使用了许多tkinter帧,在打开子帧时,我希望为用户锁定超帧(否则事情将无法解决)。经过一些研究,我发现抓斗设置和抓斗释放方法工作得很好 但是,一旦子帧(由Toplevel实例化)调用askstring,抓取将“丢失”,用户可以再次与superlevel窗口交互。例如(非常简化的代码): 一旦用户通过单击“asdf”打开子帧,包含“asdf”的帧将在打开子帧期间被锁定。但是,一旦用户选择子帧中的“询问”按钮,该“锁定”就会以某种方式消失。根据tkinter库中的注释:
一旦用户通过单击“asdf”打开子帧,包含“asdf”的帧将在打开子帧期间被锁定。但是,一旦用户选择子帧中的“询问”按钮,该“锁定”就会以某种方式消失。根据tkinter库中的注释: 抓取将所有事件定向到应用程序中的此小部件和子部件 到目前为止,我无法找到任何文档来解释为什么在您完成提交
askstring后grab\u set()
会脱落,但我想这是因为一旦小部件消失,grab\u set()
就会脱落。就像关闭Toplevel
窗口一样
在这种情况下,tl.grab_release()
似乎不需要,因为一旦窗口关闭,grab就会释放
根据我的测试,如果在askstring
完成后重置grab\u set()
,则它仍能正常工作
只需在打印(tk.simpledialog.askstring(“askstring”,“askstring”))的下方添加tl.grab\u set()
修改代码如下:
import tkinter as tk
import tkinter.simpledialog
root = tk.Tk()
def open_sublevel():
tl = tk.Toplevel(root)
tl.grab_set()
def ask():
print(tk.simpledialog.askstring("askstring", "askstring"))
tl.grab_set()
tk.Button(tl, text="ask", command=ask).pack()
print("release")
tk.Button(root, text="asdf", command=open_sublevel).pack()
tk.mainloop()
为simpledialog设置父对象将使simpledialog成为焦点
x=simpledialog(父项=窗口x,标题=z等)
这将确保x聚焦,而不是收回请提供一个。了解您使用的平台也可能会有所帮助。。。我必须发布所有模块和子模块,以使其成为可验证的,因为超级别模块导入了我编写的其他各种模块。我尽可能简化了它,并将代码发布到原始帖子中(每个python 3.X都可以编译)。我正在Windows10上工作。
import tkinter as tk
import tkinter.simpledialog
root = tk.Tk()
def open_sublevel():
tl = tk.Toplevel(root)
tl.grab_set()
def ask():
print(tk.simpledialog.askstring("askstring", "askstring"))
tl.grab_set()
tk.Button(tl, text="ask", command=ask).pack()
print("release")
tk.Button(root, text="asdf", command=open_sublevel).pack()
tk.mainloop()