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

问题描述 投票:0回答:7

我在使用一个功能时遇到问题,该功能在屏幕上显示图像两秒钟,然后被破坏。当程序运行时,函数初始调用程序正常工作,但如果随后通过 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”以及为什么它不存在? 任何帮助将不胜感激。谢谢。

python windows python-3.x tkinter
7个回答
36
投票

我发现了这个问题,所以我想我会为将来遇到这个问题的人解答。

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

解决方案:

换线...

wlcm_scrn = tkinter.Tk()

对此...

wlcm_scrn = tkinter.Toplevel()

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

我个人将有该函数的两个实例。一种是在 Tk() 下程序调用,另一种是在 TopLevel() 下在应用程序中调用。


7
投票

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

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

我认为这应该改变。:

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

1
投票

我遇到了同样的错误,上述方法可以很好地修复它,但我还发现,如果您不打算更改所有这些,那么您可以重新启动内核(在 jupyter 笔记本中)或重新启动你的Python解释器

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


0
投票

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

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

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


0
投票
from tkinter import *
import tkinter as tk
window = tk.Tk()

window.title('Learn')
window.geometry("500x500")

text = Label(window, text = 'label here')
text.pack()

photo = PhotoImage(file='C:\\Users\\user\\Documents\\image\\image_2.png')
labelphoto = Label(window , image = photo)
labelphoto.pack()

window.mainloop()enter code here

0
投票

这是代码示例

Root =Tk()
window = Root.Toplevel()

photo =PhotoImage(file='C:\\Users\\user\\Documents\\image\\image_2.png', master= window)

labelphoto = Label(window , image = photo)
labelphoto.pack()

我在 photoImage 中使用“master”来指定父屏幕。谢谢😊😊


0
投票

当使用框架(bottom_frame)时,以下代码对我有用

根。您需要在图像中包含 master=bottom_frame

from PIL import Image, ImageTk
import tkinter as tk
from tkinter import Frame

root = tk.Tk()
# root = tk.Toplevel()
root.title("Image in Button Example")


bottom_frame = Frame(root,  width=1200, height=600)
bottom_frame.grid(row=2, column=0, padx=5, pady=5,columnspan = 3)

# PLAY BUTTON
imagePLAY = Image.open(r"./images/play.png")
# photo1 = ImageTk.PhotoImage(imagePLAY)
photo1 = ImageTk.PhotoImage(imagePLAY, master=bottom_frame)
play_button = tk.Button(bottom_frame, text="Click Me", image=photo1)
# Keep a reference to the image to prevent garbage collection
play_button.image = photo1
play_button.grid(row=0, column=0)

root.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.