我遇到一个功能,它在屏幕上显示两秒钟的图像,然后被销毁。当程序运行函数时,初始调用程序运行正常,但如果函数随后通过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”,为什么不存在? 任何帮助都会得到帮助。感谢。
答案 0 :(得分:23)
我发现了这个问题,所以我想回答那些将来遇到这个问题的人。
当wlcm_scrn以程序方式运行时,它是该时刻唯一存在的窗口,因此它可以使用tkinter.Tk()。出现错误是因为调用该函数的按钮本身位于一个活动窗口中,该窗口也作为Tkinter.Tk()运行。因此,当Python / Tkinter尝试从按钮构建wlcm_scrn时,它本质上是试图在root下创建两个窗口并且摔倒。
解决方案:
改变行......
wlcm_scrn = tkinter.Tk()
到此......
wlcm_scrn = tkinter.Toplevel()
...停止错误,图像显示。
我个人将要有两个函数实例。一个在Tk()下调用程序,一个在TopLevel()下的应用程序中调用。
答案 1 :(得分:0)
也许不是这个确切的情况,但对于类似的情况,我发现了习惯
if __name__ == '__main__':
wlcm_scrn() #Call through procedure.
也解决了这个问题。 这似乎会在每次重新调用同一模块时终止活动窗口并创建一个新窗口。
答案 2 :(得分:0)
PhotoImage方法为创建的第一个TK()实例创建一个图像。 因此,似乎已经解决了通过替换TopLevel()来继承TK()实例的问题。
这可以通过指定Tk()实例的母版作为PhotoImage的选项来解决。
我认为应该对此进行更改。
splsh_img = tkinter.PhotoImage(file=file,master=wlcm_scrn)
答案 3 :(得分:0)
我一直遇到相同的错误,并且上述方法可以很好地解决该问题,但是我还发现,如果您不打算更改所有这些错误,则可以重新启动内核(在jupyter笔记本中)或重新启动您的python解释器
这应该使它在下次工作。我不太确定这是如何工作的,为什么会起作用,但是暂时如此,这是一个简单的解决方案