【问题标题】:How do I get rid of Python Tkinter root window?如何摆脱 Python Tkinter 根窗口?
【发布时间】:2009-09-10 15:56:42
【问题描述】:

您知道隐藏或以任何其他方式摆脱由Tk() 打开的根窗口的聪明方法吗?我只想使用普通对话框。

我应该跳过对话框并将所有组件放在根窗口中吗?这是可能的还是可取的?还是有更智能的解决方案?

【问题讨论】:

    标签: python winapi tkinter tk


    【解决方案1】:

    可能绝大多数基于 tk 的应用程序都将所有组件放置在默认根窗口中。这是最方便的方法,因为它已经存在。选择隐藏默认窗口并创建自己的窗口是一件非常好的事情,尽管它只需要一点点额外的工作。

    要回答有关如何隐藏它的具体问题,请使用根窗口的withdraw 方法:

    import Tkinter as tk
    root = tk.Tk()
    root.withdraw()
    

    如果您想让窗口再次可见,请调用deiconify(或 wm_deiconify)方法。

    root.deiconify()
    

    完成对话框后,您可以使用 destroy 方法销毁根窗口以及所有其他 tkinter 小部件:

    root.destroy()
    

    【讨论】:

    • 所以在 StackOverflow 上有使用 .destroy()、tkinter.Toplevel(self).destroy()、quit()、tkinter.Toplevel(self).quit()、withdraw() 的解决方案, iconify() 可供选择。好的。除了没有一个工作......我做了“top_lev = tkinter.Toplevel(label); label.master.destroy();label.destroy();top_lev.destroy();root = tkinter.Tk(); root.withdraw();root.destroy()" 这就像一个魅力(涉及一些讽刺)。
    • @deusexmachina:如果您正确使用它们,它们都可以工作,但它们都有不同的用途。虽然.quit().destroy() 实际上是相同的。
    • @BryanOakley 我明白了。尽管恕我直言,使用不同命名的方法来做同样的事情仍然很讨厌。
    • @deusexmachina:所有这些方法都做不同的事情。对于destroy(),您可以在任何小部件上使用它。当您在根窗口中调用它时,它只会表现得像.quit(),即使那样也存在差异。只是大多数应用永远不会利用这些差异。
    • 不幸的是,这里的代码在创建窗口然后隐藏时会导致“闪烁”。我想避免这种情况。
    【解决方案2】:

    我没有测试,因为我没有任何 Python/TKinter 环境,但试试这个。

    在纯 Tk 中有一个名为“wm”的方法来管理窗口。在那里,您可以执行类似“wm withdraw .mywindow”之类的操作,其中 '.mywindow' 是顶层。

    在 TkInter 中,您应该能够执行以下操作:

    root = Tkinter.Tk()
    root.withdraw() # won't need this
    

    如果您想让窗口再次可见,请调用deiconify(或wm_deiconify)方法。

    root.deiconify()
    

    【讨论】:

    【解决方案3】:

    在 OSX 上,iconify 似乎效果更好:

    root = Tkinter.Tk()
    root.iconify()
    

    【讨论】:

      【解决方案4】:

      如果您不希望在创建窗口时出现“闪烁”,请使用以下细微变化:

      import Tkinter as tk
      root = tk.Tk()
      root.overrideredirect(1)
      root.withdraw()
      

      【讨论】:

        【解决方案5】:

        我需要检查它是否是withdrawn,下面是解决方案。

        import tkinter as tk
        root = tk.Tk()
        root.withdraw()
        print(root.wm_state())
        if root.wm_state() == 'withdrawn':  # <----
            root.iconify()
        root.mainloop()
        

        withdraw

        从屏幕上移除窗口(不破坏它)。要重绘窗口,请使用 deiconify。 当窗口被撤回时,状态方法返回“withdrawn”

        deiconify

        重绘窗口

        iconify

        将窗口变成一个图标(不破坏它)。 要重绘窗口,请使用 deiconify。在 Windows 下,该窗口将显示在任务栏中。 当窗口被图标化后,状态方法返回

        state

        正常,图标化,撤回,图标

        【讨论】:

          【解决方案6】:

          这种方式可以正常工作:

          import Tkinter as tk 
          root = tk.Tk() 
          root.withdraw()
          

          或者这个:

          root = tk.Tk()
          root.overrideredirect(1)
          root.withdraw()
          

          两件事你不能忘记:

          1. 不要忘记导入类:

            将 tkinter 导入为 tk

          2. 将上述命令放在主窗口中,任何功能之外

          【讨论】:

          • 在 python 3.x 中它被称为 tkinter 而不是 Tkinter
          • 嗯,这与我的回答(4 年前发布)有何不同?
          【解决方案7】:

          对于 Python 3.0 及更高版本,要隐藏窗口,您需要编写以下代码:

          import tkinter
          tkinter.Tk().withdraw()
          

          【讨论】:

          • 这和十年前@BryanOakley 建议的不一样吗?
          【解决方案8】:
          root.deiconify()
          root.withdraw()
          

          【讨论】:

          • 请告诉我们为什么以及如何工作。
          猜你喜欢
          • 1970-01-01
          • 2019-05-12
          • 2021-12-28
          • 2014-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多