tkinter.TclError:图像“pyimage3”不存在

我遇到了在屏幕上显示一个图像两秒钟的function,然后被破坏的麻烦。 当程序运行这个函数时,初始调用procedurely可以正常工作,但是如果这个函数是通过tkinter中内build的button调用的,那么我得到一个错误。

appcwd = os.getcwd() user32 = ctypes.windll.user32 screensize = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1) size = str(screensize[0])+'x'+str(screensize[1]) def wlcm_scrn(event=None): def destroy_wlcm(event=None): wlcm_scrn.destroy() global appcwd global screensize wlcm_scrn = tkinter.Tk() file=appcwd+"\\Run_Files\\splash.gif" splsh_img = tkinter.PhotoImage(file=file) splosh = tkinter.Label(wlcm_scrn,image=splsh_img) wlcmh = splsh_img.height()/2 wlcmw = splsh_img.width()/2 splosh.pack() wlcm_scrn.config(bg='black') wlcm_scrn.overrideredirect(True) wlcm_scrn.bind("<Escape>",destroy_wlcm) wlxym = '+'+str(int((screensize[0]/2)-wlcmw))+'+'+str(int((screensize[1]/2)-wlcmh)) wlcm_scrn.geometry(wlxym) wlcm_scrn.wm_attributes("-topmost", 1) wlcm_scrn.after(2000,destroy_wlcm) wlcm_scrn.mainloop() wlcm_scrn() #Call through procedure. 

调用该函数的button。

 view_img = tkinter.Button(cfrm,text='Show splash image',command=wlcm_scrn) 

通过button命令调用时出现错误消息。

 Exception in Tkinter callback Traceback (most recent call last): File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__ return self.func(*args) File "C:\Python33\POS_Solution\Rattle_Hum_POS.py", line 1755, in run_wlcm_scrn wlcm_scrn() File "C:\Python33\POS_Solution\Rattle_Hum_POS.py", line 34, in wlcm_scrn splosh = tkinter.Label(wlcm_scrn,image=splsh_img) File "C:\Python33\lib\tkinter\__init__.py", line 2596, in __init__ Widget.__init__(self, master, 'label', cnf, kw) File "C:\Python33\lib\tkinter\__init__.py", line 2075, in __init__ (widgetName, self._w) + extra + self._options(cnf)) _tkinter.TclError: image "pyimage3" doesn't exist 

什么是“pyimage3”,为什么不存在? 任何帮助将apprecaited。 谢谢。

我发现这个问题,我会回答自己的任何谁在这个问题的未来。

当wlcm_scrn程序运行时,它是当时存在的唯一窗口,所以它可以使用tkinter.Tk()。 因为调用该函数的按钮本身坐在一个活动的窗口中,该窗口也以Tkinter.Tk()的形式运行,所以会出现错误。 所以,当Python / Tkinter试图从按钮上构建wlcm_scrn时,它实际上是试图在根目录下创建两个窗口并摔倒。

解决方案:

改变行…

 wlcm_scrn = tkinter.Tk() 

这个…

 wlcm_scrn = tkinter.Toplevel() 

…停止错误,并显示图像。

我个人将有两个实例的功能。 一个在Tk()下调用程序,另一个在TopLevel()下的应用程序中调用。

也许不是这个确切的情况,但是对于类似的情况,我发现习惯

 if __name__ == '__main__': wlcm_scrn() #Call through procedure. 

也解决了这个问题。 这似乎杀死活动窗口,并创建一个新的每次你重新调用相同的模块。