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>
событие.