Ткинтер (питон 2.7) |определить, является ли его экземпляр tk или экземпляр верхнего уровня - PullRequest
0 голосов
/ 12 мая 2018

Вопрос

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

Как я могу определить из root1 и root2, является ли экземпляр tk или toplevel?

Моя ситуация (для большего контекста)

Я открываю два окна Tkinter (экземпляр), используя один и тот же код myCustomGUI.

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.

1 Ответ

0 голосов
/ 12 мая 2018

Самое простое решение - спросить 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")
...