tkinter.TclError: изображение "pyimage3" не существует

у меня возникли проблемы с функцией, которая показывает изображение в течение двух секунд на экране, а затем разрушается. Когда программа запускает функции, начальный вызов работает нормально, но если функция затем вызывается с помощью кнопки, встроенной в 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_Filessplash.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:Python33libtkinter__init__.py", line 1475, in __call__
    return self.func(*args)
  File "C:Python33POS_SolutionRattle_Hum_POS.py", line 1755, in run_wlcm_scrn
    wlcm_scrn()
  File "C:Python33POS_SolutionRattle_Hum_POS.py", line 34, in wlcm_scrn
    splosh = tkinter.Label(wlcm_scrn,image=splsh_img)
  File "C:Python33libtkinter__init__.py", line 2596, in __init__
    Widget.__init__(self, master, 'label', cnf, kw)
  File "C:Python33libtkinter__init__.py", line 2075, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: image "pyimage3" doesn't exist

что такое "pyimage3" и почему его не существует? Любая помощь будет apprecaited. Спасибо.

2 ответов


Я нашел проблему, поэтому решил, что отвечу за всех, у кого есть эта проблема в будущем.

когда wlcm_scrn запускается процедурно, это единственное окно, которое существует в этот момент времени, и поэтому оно может использовать tkinter.Tk (). Ошибка возникает потому, что кнопка, вызывающая функцию, сама находится в активном окне, которое также работает как Tkinter.Tk (). Поэтому, когда Python/Tkinter пытается построить wlcm_scrn из кнопки, он по существу пытается создать два окна под корень и падаю.

решение:

изменение линии...

wlcm_scrn = tkinter.Tk()

для этого...

wlcm_scrn = tkinter.Toplevel()

...останавливает ошибку, и изображение показывает.

Я лично собираюсь иметь два экземпляра функции. Одна называется procedurely в соответствии с ТК(), и в приложении под Топлевел().


может быть, не для этого точного случая, но для аналогичного, я обнаружил, что обычный

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

также решает проблему. Это, похоже, убивает активное окно и создает новое каждый раз, когда вы повторно вызываете один и тот же модуль.