Tkinter - 隐藏根窗口

时间:2017-12-15 14:23:24

标签: python-3.x tkinter

我是堆叠交换的新手,对python缺乏经验。我正在使用python3并使用importlib.machinery中的SourceFileLoader从我的主脚本运行另一个脚本(使用tkinter)。这最初导致了此问题中包含的错误:tkinter.TclError: image "pyimage3" doesn't exist

解决错误的解决方案对我有用,现在子脚本按预期运行,除了使用Toplevel()函数现在也会导致应用程序创建一个空的根窗口 - 我要隐藏的Tk() 。我看了几个问题'没有奏效的解决方案:How do I get rid of Python Tkinter root window?
Hide the root window when a Toplevel window is opened and make it reappear when the Toplevel is destroyed

以下是我的代码示例:

from tkinter import *
from PIL import ImageTk
from importlib.machinery import SourceFileLoader

root = Toplevel()
background = Tk()
...
def Puzzle5():
    root.overrideredirect(1)
    frame = Frame(root, width=320, height=160, borderwidth=2, relief=RAISED)
    frame.pack_propagate(False)
    frame.pack(side=TOP)
    frame1 = Frame(root, width=500, height=150, borderwidth=2, relief=RAISED)
    frame1.pack_propagate(False)
    frame1.pack(side=BOTTOM)

    image = ImageTk.PhotoImage(file="/home/pi/Media/arrowup.png")
    image1 = ImageTk.PhotoImage(file="/home/pi/Media/arrowdown.png")
...
    background.withdraw()('0x0+0+0')

    root.geometry('644x450+150+50')
    root.mainloop()

def close():
    root.destroy()
    background.destroy()

Puzzle5()

1 个答案:

答案 0 :(得分:2)

小部件存在于层次结构中。在该层次结构的顶部是根窗口。对于任何存在的tkinter小部件,必须首先有一个根窗口。

您可以通过创建Tk的实例来创建根窗口。如果不这样做,那么第一次创建窗口时,将为您创建根窗口。

现在,请考虑以下代码:

root = Toplevel()
background = Tk()

Toplevel不是根窗口。要使它存在,首先必须有一个根窗口。由于你没有创建一个,tkinter会为你创建一个。因此,您获得了一个根窗口,然后您获得了Toplevel的实例。

然后使用第二行创建另一个根窗口,生成三个窗口。即使您使用background隐藏background.withdraw(),您仍然可以看到原始根窗口。

简单的解决方案是反转这两行代码。首先创建根窗口,然后创建Toplevel秒。然后你只有一个根窗口,如果你愿意,你可以隐藏它。但是,正如How do I get rid of Python Tkinter root window?的答案所解释的那样,更好的解决方案是根本不使用Toplevel,而是将您的小部件放在root中。