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

Posted

技术标签:

【中文标题】tkinter.TclError:图像“pyimage3”不存在【英文标题】:tkinter.TclError: image "pyimage3" doesn't exist 【发布时间】:2013-12-13 14:35:29 【问题描述】:

我在使用在屏幕上显示图像两秒钟然后被销毁的功能时遇到问题。当程序运行函数时,初始调用程序正常工作,但如果随后通过 tkinter 中内置的按钮调用该函数,则会出现错误。

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.

调用函数的按钮。

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

通过按钮命令调用时的错误消息。

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”,为什么不存在? 任何帮助将不胜感激。谢谢。

【问题讨论】:

看看这里daniweb.com/software-development/python/threads/154237/… 我不认为这是文件路径的问题,因为我使用的是 os.getcwd(),并且它是第一次工作。 还有 Bennett_1 的一点,他说“......文件引用在之前的运行中不正确。”我认为这不适用,因为它在第一次运行时有效,并且文件引用没有改变。 我可以按程序运行它多次,并且每次都有效,因此必须将其作为导致问题的 tkinter 按钮上的事件调用。 【参考方案1】:

我遇到了同样的错误,上面的方法可以很好地修复它,但我也发现如果你不打算改变所有这些,那么你可以重新启动内核(在 jupyter notebook 中)或者重启你的python解释器

这应该使它下次工作。我不完全确定它是如何以及为什么起作用的,但它确实是并且暂时是一个简单的解决方案

【讨论】:

在回答问题时更加具体。当你 100% 确定可以发表评论时,永远不要猜测输出和发布。【参考方案2】:

PhotoImage 方法为创建的第一个 TK () 实例创建一个图像。 这样看来,通过替换TopLevel()来继承TK()实例似乎已经解决了。

这可以通过将Tk()实例的master指定为PhotoImage的选项来解决。

我认为这应该改变。:

splsh_img = tkinter.PhotoImage(file=file,master=wlcm_scrn)

【讨论】:

【参考方案3】:

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

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

也解决了这个问题。 这似乎会杀死活动窗口并在您每次重新调用同一模块时创建一个新窗口。

【讨论】:

【参考方案4】:

我发现了这个问题,所以我会为将来遇到此问题的任何人回答自己。

当 wlcm_scrn 程序运行时,它是该时间点唯一存在的窗口,因此它可以使用 tkinter.Tk()。出现错误是因为调用该函数的按钮本身位于一个活动窗口中,该窗口也作为 Tkinter.Tk() 运行。所以当 Python/Tkinter 尝试从按钮构建 wlcm_scrn 时,它本质上是在尝试在 root 下创建两个窗口并跌倒。

解决办法:

换行...

wlcm_scrn = tkinter.Tk()

到这个...

wlcm_scrn = tkinter.Toplevel()

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

我个人将拥有该函数的两个实例。一个在 Tk() 下通过过程调用,一个在 TopLevel() 下在应用程序内调用。

【讨论】:

哇,我会找这个很久了。相反......像 30 秒。

以上是关于tkinter.TclError:图像“pyimage3”不存在的主要内容,如果未能解决你的问题,请参考以下文章

Python:Tkinter TclError:无法调用“图像”命令

为啥我会收到 tkinter.TclError: bitmap not defined 错误?

tkinter.TclError:没有显示名称,也没有 $DISPLAY 环境变量 python

tkinter、python 和 seaborn 的问题:_tkinter.TclError: no display name and no $DISPLAY environment variable

Python系列_tkinter.TclError: no display name and no $DISPLAY environment variable

python3 tkinter报错:_tkinter.TclError: cannot use geometry manager pack inside . which already has sla