未检测到 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>
事件。
所以我给自己做了一个小项目,我正在尝试制作一个小工具来连接到 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>
事件。