无法从其小部件的回调中破坏Tk对象

时间:2019-12-14 07:57:42

标签: python python-3.x tkinter callback tk

[已编辑]我正在尝试从其小部件的回调内部销毁一个Toplevel对象,但是看来直到回调函数完成运行后才能销毁它。以下是我脚本的本质:

from tkinter import *
from time import sleep
import gnupg
w = Tk()
t = Toplevel()
lbl = Label(t, text="blah blah")
lbl.grid(row=0, column=0)
lbl.bind("<Button-1>", func_a)

def func_a(event):
   event.widget.master.destroy()
   gpg = gnupg.GPG()
   plaindata = b'Some data'
   encrdata = plaindata
   for i in range(20):
      encrdata = gpg.encrypt(encrdata,
         symmetric=True,
         passphrase='something', 
         recipients=None).data
   print("func_a is done")
w.mainloop()

如您所见,我使用gpg对称加密20次,大约需要20秒。我希望在单击Label(对象“ lbl”)时看到的是整个Toplevel窗口(对象“ t”)立即消失,然后20秒钟后在终端上打印了消息“ func_a走了”。取而代之的是,Toplevel窗口在20秒内无响应(我仍然可以移动它,但其所有小部件都冻结了),然后在打印上述消息的同一时间终于消失了。

您能解释一下为什么父级Toplevel没有立即被销毁吗?它与作为小部件的回调函数调用的函数有关吗?以及如何强制在回调函数中的其他内容完成之前杀死父窗口?

1 个答案:

答案 0 :(得分:0)

好的,感谢@martineau的指针,我找到了一个解决方案-当时非常简单。每当我希望对该对象进行任何更改时,我就从顶级对象中调用方法update()。即使先前的更改正在破坏此对象,此操作仍然有效。感谢所有提供意见和反馈的人。