未检测到 Tkinter TopLevel Destroy

Tkinter TopLevel Destroy not being detected

所以我给自己做了一个小项目,我正在尝试制作一个小工具来连接到 OKEX 交易所。现在我正在研究 GUI,我决定使用 Tkinter。经过大量研究之后,我得出了以下结论,但现在我有点卡住了。

我有 2 个 classes,一个用于主要 window,一个用于登录 window。但是,main window 的某些功能依赖于我提交登录详细信息后发生的情况。现在我知道 Toplevel 是为了在 Tkinter 中创建额外的 windows ,你通常用 .destroy() 关闭这些 windows ,如果我想在主 window class 然后我需要使用 Toplevel.protocol("WM_DELETE_WINDOW", function_name) 调用...但这对我不起作用。

如果我使用右上角的叉号关闭,它会按预期工作,但如果我使用调用 .destroy() 的函数关闭,它会按预期工作,谁能向我解释为什么这没有按预期工作?也许我错过了什么?

我想在用户(我)输入他们的详细信息后将第一帧中的文本更改为 "Logged In",但我需要先登录并传递一个用户对象以包含这些详细信息。

无论如何,这是代码,请帮帮我! 有问题的代码是 LoginBox class 中的 myquit 函数,以及 MainBox class 中的 goToLogin 函数 :)

from tkinter import *
from tkinter.ttk import *


class LoginBox:
    def __init__(self, master):  # Master is the frame that is passed in.
        # Create Frame
        self.master = master
        self.master.title('~ Please Login ~')


    def login_function(self):
        user = "xxx"
        secret_key = "yyy"

        print("User - API Key: " + user)
        print("User - Secret Key: " + secret_key)

        # Perhaps check the login ...

        # if it's a success then quit the function
        self.myquit()

    def myquit(self):
        self.master.destroy()


class MainBox:
    def __init__(self, master):

        # Set the root window
        self.master = master
        self.master.geometry("500x500")
        self.master.title("OkBot v0.1")
        self.master.resizable(False, False)

        # Initialize the frames
        self.uiFrame1 = Frame(self.master)  # The Top Layer -- Login Text + Login Button 

        # uiFrame1 Initialize --Login Text + Login Button
        self.ui1_button = Button(self.uiFrame1, text="Login", command=self.goToLogin).grid(row=0, column=3, sticky=E, padx=1)

    # Create Topview for popup , pass in User Object to LoginBox
    def goToLogin(self):
        loginMaster = Toplevel(self.master)
        loginMaster.protocol("WM_DELETE_WINDOW", self.checkLogin)  # This is if they close via X
        loginGUI = LoginBox(loginMaster)

    def checkLogin(self):

        print("This function was called -- The Protocol for destroyed windows works")


# Initialize the objects and start the program
mainWindow = Tk()
myProgram = MainBox(mainWindow)
mainWindow.mainloop()

It works as expected if I close using the cross in the top right, but not if I close with my function that calls .destroy() , can anyone explain to me why this isn't working as intended? Perhaps I have missed something ?

loginMaster.protocol("WM_DELETE_WINDOW", self.checkLogin) 仅告诉 tkinter 在 window 管理器销毁 window 时该怎么做。当您调用某些调用 destroy() 的函数时,不涉及 window 管理器,因此不会调用您的回调。

如果您希望在 window 被销毁时发生某些事情,您应该绑定到 <Destroy> 事件。