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

问题描述 投票:-1回答:1

[已编辑]我正在尝试从其小部件的回调内部销毁一个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没有立即被销毁?它与作为小部件的回调函数调用的函数有关吗?以及如何强制在回调函数中的其他内容完成之前杀死父窗口?

python python-3.x tkinter callback tk
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.