Tkinter的bind("<Destroy>")只激活一次
我现在正在做一个家庭银行应用程序,这是我个人的项目。学习和实践中。
这个应用程序有一个主模块,里面有一个窗口和几个按钮,按钮有不同的功能,比如在账户之间转账、支付账单等等。当你点击一个按钮时,它会禁用主窗口里的所有小部件,然后创建一个新的窗口,这个新窗口和主窗口是关联的,最后打开一个新的模块来处理所需的功能。也许这不是我最聪明的主意,但我这样做是为了把代码分开,而不是把所有东西都放在一个文件里,这样可以提高代码的可读性和整洁性(顺便说一下,欢迎提出建议)。
当一个新窗口被关闭时,一个.bind函数会调用另一个函数,这个函数会恢复主模块的小部件,并根据所做的更改更新信息(如果有更改的话)。问题在于,当你尝试第二次关闭这个新窗口时,.bind函数似乎根本没有被调用。这可能是什么原因呢?
这是转账按钮的功能代码:
self.disable()
windowTransfer = Toplevel(self.windowHomeBanking)
windowTransfer.bind("<Destroy>", self.closed_window)
from transfer import Transfer
tf = Transfer(windowTransfer, self.id,
self.userFile, self.data, self.userList)
这是关闭窗口的函数(我觉得这不重要,因为第二次根本没有被调用):
if str(event.widget) != ".!toplevel": # (to avoid calling the function an innecessary number of times)
return
for item in self.windowHomeBanking.winfo_children():
if str(item) != ".!toplevel":
item.config(state = NORMAL)
if str(event) == "<Destroy event>" and str(event.widget) == ".!toplevel":
self.update_data()
1 个回答
0
你不应该去测试窗口的名字,因为第二个窗口不一定和第一个窗口有相同的名字。如果你想确保代码只在最顶层窗口运行,而不是它的子窗口,你可以这样做:
if event.widget != event.widget.winfo_toplevel():
return
winfo_toplevel
会返回与事件相关联的窗口。无论是子窗口还是窗口本身,结果都会是这个窗口的对象。