2017-08-10 153 views
0

我目前正在实施一个程序,使用许多tkinter帧,而子帧正在打开,我想为用户锁定超帧(否则的东西不会工作)。经过一番研究,我发现grab_set和grab_release方法工作得很好。Tkinter焦点丢失后询问

但是,一旦子帧(由Toplevel实例化)调用askstring,抓取就会“失去”,用户可以再次与超级窗口进行交互。一旦用户通过单击“ASDF”包含帧“ASDF”将同时的子帧被打开锁定的持续时间打开该子帧

import tkinter as tk 
import tkinter.simpledialog 

root = tk.Tk() 
def open_sublevel(): 
    tl = tk.Toplevel(root) 
    def ask(): 
     print(tk.simpledialog.askstring("askstring", "askstring")) 
    tk.Button(tl, text="ask", command=ask).pack() 
    tl.grab_set() 
    root.wait_window(tl) 
    tl.grab_release() 
    print("release") 


tk.Button(root, text="asdf", command=open_sublevel).pack() 
tk.mainloop() 

:一个例子是这样(非常简化的代码)。然而,一旦用户在子帧中选择“询问”按钮,该“锁定”以某种方式消失。

+0

请提供[MCVE]。这也可能有助于了解您正在使用的平台。 –

+0

那么最小的例子不是那么简单......我将不得不发布所有模块和子模块,因为它是可验证的,因为超级模块导入了我编写的各种其他模块。 – PfannkuchenXD

+0

我尽可能简化它,并将代码发布到原始文章(可在每个python 3.X上编译)。我正在使用Windows10。 – PfannkuchenXD

回答

1

根据在Tkinter的库中的注意事项:

一抢引导应用中的所有事件,这和后代的小部件。

我无法到目前为止发现可以解释为什么grab_set()上掉下来了,你完成提交后askstring任何文件,但我想它的成像是因为一旦小部件消失了grab_set()脱落。就像你要关闭Toplevel窗口一样。

在这种情况下,tl.grab_release()在窗口关闭时并不需要作为抓取释放。

从我已经测试过,如果在askstring完成后重置grab_set(),那么它仍然可以正常工作。

您只需简单地在print(tk.simpledialog.askstring("askstring", "askstring"))之下添加tl.grab_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()