Tkinter(python 2.7)|确定其tk实例还是顶级实例

Tkinter(python 2.7)|确定其tk实例还是顶级实例,python,python-2.7,tkinter,tk,toplevel,Python,Python 2.7,Tkinter,Tk,Toplevel,问题: 如何从root1和root2确定实例是tk还是toplevel 我的处境需要更多的背景 我使用相同的myCustomGUI代码打开两个Tkinter实例窗口 在myCustomGUI类中,我创建了一个on_closing函数,该函数在用户关闭root.protocolWM_DELETE_窗口self.on_closing时运行 在上述函数中,我希望有如下内容: def on_closing(self): if self.root is tk: self.root.

问题:

如何从root1和root2确定实例是tk还是toplevel

我的处境需要更多的背景

我使用相同的myCustomGUI代码打开两个Tkinter实例窗口

在myCustomGUI类中,我创建了一个on_closing函数,该函数在用户关闭root.protocolWM_DELETE_窗口self.on_closing时运行

在上述函数中,我希望有如下内容:

def on_closing(self):
    if self.root is tk:
        self.root.quit()
        exit() # exit the whole program OR run some custom exit function
    else: # meaning self.root is Toplevel
        pass
    self.root.destroy()
换句话说,当实例为顶级时,只销毁它;当实例为主窗口时,退出tkinter并退出整个程序

与问题无关的补充说明

打开两个界面相同的窗口的目的是在一个窗口中打印调试信息,在另一个窗口中打印重要信息,因此界面是相同的


我创建on_closing函数的目的是因为我必须从记录器中删除处理程序。

最简单的解决方案是询问tkinter小部件是什么类——不是python类,而是内部tk类。对于根窗口,它将是Tk,对于toplevel,它将是toplevel,除非您显式地更改它,这是非常不寻常的

import tkinter as tk

class MyTop(tk.Toplevel):
    pass

root = tk.Tk()
top = tk.Toplevel(root)
mytop = MyTop(root)

assert(root.winfo_class() == "Tk")
assert(top.winfo_class() == "Toplevel")
assert(mytop.winfo_class() == "Toplevel")
def on_closing(self):
    if self.root is tk:
        self.root.quit()
        exit() # exit the whole program OR run some custom exit function
    else: # meaning self.root is Toplevel
        pass
    self.root.destroy()
import tkinter as tk

class MyTop(tk.Toplevel):
    pass

root = tk.Tk()
top = tk.Toplevel(root)
mytop = MyTop(root)

assert(root.winfo_class() == "Tk")
assert(top.winfo_class() == "Toplevel")
assert(mytop.winfo_class() == "Toplevel")