我是堆叠交换的新手,对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()
答案 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
中。