Использование PhotoImage для отображения изображения в Tkinter в Python

Я пытаюсь создать приложение с главным меню и меню настроек. Я хочу установить фон для каждого из них. Но я начинаю с меню настроек. Я получаю сообщение об ошибке: _tkinter.TclError: image "pyimage1" doesn't exist. Что я делаю не так?

from tkinter import *
from tkinter.ttk import *

install_directory = '...'


# ***********************************MAIN MENU*****************************************************
def root():

    # ~~~Defines window~~~
    main_window = Tk()
    main_window.iconbitmap(install_directory + r'\resources\icons\logo.ico')  # Changes the icon for window
    main_window.title('Auto Transfer')  # Changes window name
    main_window.geometry("300x200")

    # ~~Adds a background~~~
    background = PhotoImage(file=install_directory + r'\resources\backgrounds\stardust.gif')
    label = Label(main_window, image=background)
    label.pack()

    # ~~~Menu Bar~~~
    menubar = Menu(main_window)  # Creates the menu bar

    # ~~~File menu~~~
    filemenu = Menu(menubar, tearoff=0)
    filemenu.add_command(label="Quit", command=lambda: main_window.destroy())  # Exits the program

    # ~~~Settings menu~~~
    settingsmenu = Menu(menubar, tearoff=0)
    settingsmenu.add_command(label="Change settings...", command=lambda: options(main_window))

    # ~~~Add menus to bar~~~
    menubar.add_cascade(label='File', menu=filemenu)
    menubar.add_cascade(label='Settings', menu=settingsmenu)

    # ~~Adds menu bar to the screen~~~
    main_window.config(menu=menubar)

    # ~~Adds 'RUN' button~~


    # ~~~Runs window~~~
    main_window.mainloop()


# *********************************OPTIONS MENU****************************************************
def options(main_window):

    options_window = Toplevel()
    options_window.iconbitmap(install_directory + r'\resources\icons\logo.ico')  # Changes the icon for window
    options_window.title('Settings')  # Changes window name
    options_window.geometry("720x480")

    # ~~Adds a background~~~
    background = PhotoImage(file=install_directory + r'\resources\backgrounds\stardust.gif')
    label = Label(options_window, image=background)
    label.pack()




# *******************************RUN APP**************************************************************
if __name__ == '__main__':
    root()

person Zack Harley    schedule 14.04.2015    source источник
comment
какая строка выдает ошибку?   -  person Marcin    schedule 14.04.2015
comment
В этих строках должно отображаться изображение: background = PhotoImage(file = install_directory + r'\resources\backgrounds\subtle.gif') label = Label(options_window, image=background) label.pack()   -  person Zack Harley    schedule 14.04.2015


Ответы (1)


Я думаю, причина в том, что вы используете два экземпляра Tk() в своем коде. Это не очень хорошо. Приложение tkinter должно иметь только один основной цикл (то есть один экземпляр Tk()). Чтобы сделать другие окна, используйте виджет TopLevel.

Используйте это в своей функции параметров вместо создания нового Tk():

 options_window = Toplevel()

Надеюсь это поможет. Также убедитесь, что пути к файлам изображений указаны правильно.

person Marcin    schedule 14.04.2015
comment
Это избавило от ошибки, но изображение по-прежнему не отображается в окне параметров. Я просто использовал тот же код: `background = PhotoImage(file='...') label = Label(options_window, image=background) label.pack()`, чтобы добавить тот же фон в главное окно, поэтому я не уверен, в чем проблема. - person Zack Harley; 14.04.2015
comment
Можете ли вы отредактировать свой вопрос и предоставить обновленный код. - person Marcin; 14.04.2015