Tkinter TopLevel Destroy не обнаруживается

Поэтому я дал себе небольшой проект и пытаюсь создать небольшой инструмент для подключения к бирже OKEX. Сейчас я работаю над графическим интерфейсом и решил использовать Tkinter. После долгих исследований и всего прочего я придумал следующее, но теперь я немного застрял.

У меня есть 2 класса, один для главного окна и один для окна входа в систему. Однако некоторые функции главного окна зависят от того, что происходит после того, как я отправил данные для входа. Теперь я знаю, что Toplevel предназначен для создания дополнительных окон в Tkinter, и вы обычно закрываете эти окна с помощью.destroy(), и если я хочу узнать об этом событии в классе главного окна, тогда мне нужно использовать Toplevel.protocol(Вызов "WM_DELETE_WINDOW", имя_функции)... но это не работает для меня.

Это работает, как и ожидалось, если я закрою, используя крестик в правом верхнем углу, но не, если я закрою свою функцию, которая вызывает.destroy(), может кто-нибудь объяснить мне, почему это не работает, как задумано? Возможно, я что-то пропустил?

Я хочу изменить текст в первом кадре на "Вход в систему" ​​после того, как пользователь (я) введет свои данные, но мне нужно сначала войти в систему и пройти через пользовательский объект, чтобы содержать эти данные.

В любом случае, вот код, пожалуйста, помогите мне! Рассматриваемый код - это функция myquit в классе LoginBox и функция goToLogin в классе MainBox:)

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()

1 ответ

Решение

Это работает, как и ожидалось, если я закрою, используя крестик в правом верхнем углу, но не, если я закрою свою функцию, которая вызывает.destroy(), может кто-нибудь объяснить мне, почему это не работает, как задумано? Возможно, я что-то пропустил?

loginMaster.protocol("WM_DELETE_WINDOW", self.checkLogin) только сообщает tkinter, что делать, когда оконный менеджер уничтожает окно. Когда вы вызываете какую-то функцию, которая вызывает destroy(), это не связано с оконным менеджером, и поэтому ваш обратный вызов не вызывается.

Если вы хотите, чтобы что-то случилось, когда окно разрушено, вы должны связать с <Destroy> событие.

Другие вопросы по тегам