Python askstring后,Tkinter焦点丢失

Python askstring后,Tkinter焦点丢失,python,tkinter,focus,Python,Tkinter,Focus,我目前正在实施一个程序,它使用了许多tkinter帧,在打开子帧时,我希望为用户锁定超帧(否则事情将无法解决)。经过一些研究,我发现抓斗设置和抓斗释放方法工作得很好 但是,一旦子帧(由Toplevel实例化)调用askstring,抓取将“丢失”,用户可以再次与superlevel窗口交互。例如(非常简化的代码): 一旦用户通过单击“asdf”打开子帧,包含“asdf”的帧将在打开子帧期间被锁定。但是,一旦用户选择子帧中的“询问”按钮,该“锁定”就会以某种方式消失。根据tkinter库中的注释:

我目前正在实施一个程序,它使用了许多tkinter帧,在打开子帧时,我希望为用户锁定超帧(否则事情将无法解决)。经过一些研究,我发现抓斗设置和抓斗释放方法工作得很好

但是,一旦子帧(由Toplevel实例化)调用askstring,抓取将“丢失”,用户可以再次与superlevel窗口交互。例如(非常简化的代码):


一旦用户通过单击“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()