如何摆脱Python Tkinter根窗口?

89

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

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

8个回答

129

大多数基于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()",这个方法非常好用(带有一些讽刺意味)。 - logical x 2
2
@deusexmachina:如果你使用得当,它们都能正常工作,但它们各有不同的用途。尽管.quit().destroy()在实际上是相同的。 - Bryan Oakley
@BryanOakley 我明白了。但是,为了完成同一件事而拥有不同名称的方法仍然相当糟糕,我个人认为。 - logical x 2
2
@deusexmachina:所有这些方法都有不同的作用。在destroy()的情况下,您可以将其用于任何小部件。仅当您在根窗口上调用它时,它才像.quit()一样行为,即使这样也存在差异。只是大多数应用程序永远不会利用这些差异。 - Bryan Oakley
1
不幸的是,这里的代码在窗口创建后会出现“闪烁”,然后隐藏。我想避免这种情况。 - BuvinJ

15

我没有测试过,因为我没有Python/TKinter环境,但你可以尝试这个方法。

在纯Tk中有一个名为"wm"的方法来管理窗口。你可以像这样做:"wm withdraw .mywindow",其中'.mywindow'是顶层窗口。

在TkInter中,你应该能够做类似这样的事情:

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

如果想要重新显示窗口,调用 deiconify (或 wm_deiconify) 方法即可。

root.deiconify()

如何将窗口置于顶部? - IcyFlame
3
您可以使用root.deiconify()来使窗口重新出现。 - Bryan Oakley
谢谢您先生,我已经提过那个问题并得到了答案:https://dev59.com/8GQo5IYBdhLWcg3wiv0i - IcyFlame

11
在OSX上,最小化似乎更有效:
root = Tkinter.Tk()
root.iconify()

6

如果你不想在创建窗口时出现“闪烁”,可以使用以下略微变化的方法:

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

3

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

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

普通、图标化、撤回、图标


0
这样做会很好:


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

Or this one:

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

有两件事情不能忘记:

  1. 不要忘记导入类:

    import tkinter as tk

  2. 将上述命令放置在主窗口中,在任何函数之外


在Python 3.x中,它被称为tkinter而不是Tkinter - Delrius Euphoria
这与我四年前的回答有何不同? - BuvinJ

-2
root.deiconify()
root.withdraw()

1
请告诉我们为什么以及如何能够运作。 - troy

-2

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

import tkinter
tkinter.Tk().withdraw()

8
这不就是十年前@BryanOakley提出的建议吗? - Jonas Byström

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接