【问题标题】:Tkinter (python 2.7) | determine whether its tk instance or toplevel instanceTkinter (python 2.7) |确定它的 tk 实例还是顶级实例
【发布时间】:2018-05-12 16:34:54
【问题描述】:

问题

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

如何从root1root2 确定实例是tk 还是toplevel?

我的情况(更多背景信息)

我使用相同的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 中删除处理程序。

【问题讨论】:

    标签: python python-2.7 tkinter tk toplevel


    【解决方案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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      相关资源
      最近更新 更多