【问题标题】:tkinter - Cant hide nested toplevel windowtkinter - 无法隐藏嵌套的顶层窗口
【发布时间】:2020-03-05 18:45:51
【问题描述】:

我在另一个类中创建了一个 TopLevel 类的实例,但不能“withdraw()”子窗口 来自父母的电话。

import tkinter as tk

class Table(tk.Toplevel):


    def __init__(self, master):

      tk.Toplevel.__init__(self,master)

      self.var_new_t=tk.Toplevel(self.master)  

      self.t2=Table_2(self.var_new_t)

      #Goal is to create a child window and immediately hide it.

      self.t2.hide_me()
      #self.t2.withdraw()  ##Tried a few differnt ways 


class Table_2(tk.Toplevel):

    def __init__(self, master):
            tk.Toplevel.__init__(self,master)
            self.master = master
            label = tk.Label(self.master, bg='green', text='Second Table')
            label.grid()

    def hide_me(self):

        self.master.withdraw()

root = tk.Tk()

n= Table(root)

tk.Button(root, text="Quit", command=root.destroy).pack()

root.mainloop()

我尝试了一些其他变体,但无济于事。

【问题讨论】:

  • 更改为 self.withdraw() 并且此 self.var_new_t=tk.Toplevel(self.master) 不是必需的,双重工作。这个self.t2=Table_2(self.var_new_t) 也必须是self.t2=Table_2(self)self.t2=Table_2(master)

标签: python class tkinter nested toplevel


【解决方案1】:

您的代码正在创建两个窗口。考虑这段代码:

Table 是顶级窗口,因为它继承自 Toplevel。所以,这一行创建了Table 窗口:

  tk.Toplevel.__init__(self,master)

然后,当您执行此操作时,您会创建 另一个 窗口:

  self.var_new_t=tk.Toplevel(self.master) 

如果您从 Toplevel 继承,通常不应在其中创建第二个 Toplevel,除非您明确打算创建两个窗口。

您的代码需要如下所示:

class Table(tk.Toplevel):
    def __init__(self, master):
      tk.Toplevel.__init__(self,master)
      self.t2=Table_2(self)
      self.t2.hide_me()

class Table_2(tk.Toplevel):
    def __init__(self, master):
            tk.Toplevel.__init__(self,master)
            self.master = master
            label = tk.Label(self, bg='green', text='Second Table')
            label.grid()

    def hide_me(self):
        self.withdraw()

【讨论】:

  • 两个答案都有效,但我想指出,在 Table_2 中,您也进行了更改: label = tk.Label(self.master, bg='green', text='Second Table') to label = tk.Label(self, bg='green', text='Second Table')……这样调用方法也导致不退出。
  • @DannyW: tk.Label(self.master) 将标签放在第一个顶层。我假设你想要它在 Table2 中。
  • 你是对的(第二张桌子)。我刚刚意识到是的,将标签放在主表上,当它只是在主表上显示“第二表”标签时,我以为它是 table_2。 ---让我相信退出一直没有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多