Tkinter的bind("<Destroy>")只激活一次

0 投票
1 回答
40 浏览
提问于 2025-04-12 19:02

我现在正在做一个家庭银行应用程序,这是我个人的项目。学习和实践中。

这个应用程序有一个主模块,里面有一个窗口和几个按钮,按钮有不同的功能,比如在账户之间转账、支付账单等等。当你点击一个按钮时,它会禁用主窗口里的所有小部件,然后创建一个新的窗口,这个新窗口和主窗口是关联的,最后打开一个新的模块来处理所需的功能。也许这不是我最聪明的主意,但我这样做是为了把代码分开,而不是把所有东西都放在一个文件里,这样可以提高代码的可读性和整洁性(顺便说一下,欢迎提出建议)。

当一个新窗口被关闭时,一个.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 会返回与事件相关联的窗口。无论是子窗口还是窗口本身,结果都会是这个窗口的对象。

撰写回答