Mam problemy z funkcją, która pokazuje obraz przez dwie sekundy na ekranie, a następnie jest zniszczony. Gdy program uruchamia funkcje początkowe wywołanie proceduralnie działa dobrze, ale jeśli funkcja zostanie następnie wywoływana za pomocą przycisku wbudowany w TKinter, otrzymuję błąd.

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.

Przycisk, który wywołuje funkcję.

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

Komunikat o błędzie podczas wywołania polecenia przycisku.

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

Co to jest "pyimage3" i dlaczego nie istnieje? Wszelka pomoc byłaby doceniona. Dzięki.

10
I_do_python 27 listopad 2013, 23:16

3 odpowiedzi

Najlepsza odpowiedź

Znalazłem ten problem, więc pomyślałem, że odpowiedziałbym sam dla każdego, kto ma ten problem w przyszłości.

Gdy WLCM_SCRN prowadzi procedurę, jest to jedyne okno, które istnieje w tym momencie, a więc może używać Tkinter.tk (). Błąd pojawia się, ponieważ przycisku, który wywołuje funkcję, jest siedząc w aktywnym oknie, który jest również uruchomiony jako Tkinter.tk (). Więc kiedy Python / TKinter próbuje zbudować WLCM_SCRN z przycisku, zasadniczo próbuje utworzyć dwa okna pod korzeniem i upadek.

Rozwiązanie:

Zmiana linii ...

wlcm_scrn = tkinter.Tk()

Do tego...

wlcm_scrn = tkinter.Toplevel()

... zatrzymuje błąd, a pokazuje obraz.

Osobiście będę miał dwa wystąpienia funkcji. Jeden zwany procedurą w ramach TK () i wezwany w ramach wniosku w ramach Toplevel ().

30
I_do_python 29 listopad 2013, 16:18

Metoda fotoymage tworzy obraz pierwszej instancji TK () utworzonej. Tak więc wydaje się, że rozwiązuje się, aby odziedziczyć instancję TK (), zastępując Toplevel ().

Można to rozwiązać, określając Master of tk () instancji jako opcji fotoymażu.

Myślę, że należy to zmienić:

splsh_img = tkinter.PhotoImage(file=file,master=wlcm_scrn)
2
Takahiro Funahashi 12 grudzień 2019, 01:50

Może nie dla tego dokładnego przypadku, ale dla podobnego, odkryłem, że zwyczajowe

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

Rozwiązuje również problem. Wydaje się to zabić aktywne okno i stworzyć nowy za każdym razem, gdy ponownie zadzwonisz do tego samego modułu.

0
SeF 8 wrzesień 2017, 16:58