0

问题

root1 = tk.Tk()
root2 = tk.Toplevel()

如何确定实例是 tk 还是顶层root1root2

我的情况(更多内容)

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

root = tk.Tk()
mainGUI = myCustomGUI(root)
mainGUI.handler.setLevel(logging.INFO)

root2 = tk.Toplevel()
secondGUI = myCustomGUI(root2)
secondGUI.handler.setLevel(logging.ERROR)

myCustomGUI课堂上,我创建了一个on_closing()在用户关闭窗口 ( root.protocol("WM_DELETE_WINDOW", self.on_closing)) 时运行的函数。

在上述功能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()

换句话说,当实例是 Toplevel 时只销毁它,当实例是主窗口时,然后退出 tkinter 并退出整个程序。

附加说明(与问题无关)

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

我创建on_closing()函数的目的是因为我必须从logger.

4

1 回答 1

1

最简单的解决方案是询问 tkinter 小部件是什么类——不是 python 类,而是内部 tk 类。对于根窗口,它将是Tk,而对于顶层窗口,它将是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")
于 2018-05-12T16:57:29.887 回答