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.
также решает проблему. Это, похоже, убивает активное окно и создает новое каждый раз, когда вы повторно вызываете один и тот же модуль.