[已编辑]我正在尝试从其小部件的回调内部销毁一个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没有立即被销毁吗?它与作为小部件的回调函数调用的函数有关吗?以及如何强制在回调函数中的其他内容完成之前杀死父窗口?
答案 0 :(得分:0)
好的,感谢@martineau的指针,我找到了一个解决方案-当时非常简单。每当我希望对该对象进行任何更改时,我就从顶级对象中调用方法update()
。即使先前的更改正在破坏此对象,此操作仍然有效。感谢所有提供意见和反馈的人。