Виджет кнопки Tkinter не может найти изображение, ошибка изображения не существует

#python #tkinter

#python #tkinter

Вопрос:

При попытке поместить изображение в кнопку я получаю сообщение об ошибке «_tkinter.TclError: изображение «pyimage1″ не существует». Изображение существует, хотя, потому что я использовал его на другой кнопке, и оно там работает. Когда я пытаюсь снова использовать изображение на второй кнопке, возникает ошибка.

Я попытался удалить изображение, и кнопка работает. Пробовал использовать изображение на другой кнопке, и это работает только для одной кнопки.

 from tkinter import ttk
from tkinter import Tk, PhotoImage


class Window(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)


def main():
    root = Tk()
    style = ttk.Style(root)
    style.theme_use('clam')

    root2 = Tk()
    style = ttk.Style(root2)
    style.theme_use('alt')

    root3 = Tk()
    style = ttk.Style(root3)
    style.theme_use('classic')

    root4 = Window()
    style = ttk.Style(root4)
    style.theme_use('default')

    icon = PhotoImage(file='test.gif')
    # This line works, the image appears on the button.
    ttk.Button(root, image=icon, compound='left', text="Quit", command=root.destroy).pack()

    # This line works with out the image.
    ttk.Button(root2, compound='left', text="Quit", command=root2.destroy).pack()

    # This line does not work with an image.
    # if the line below is un-commented the code does not work, the error I get is below.
    # _tkinter.TclError: image "pyimage1" doesn't exist

    # ttk.Button(root2, image=icon, compound='left', text="Quit", command=root2.destroy).pack()

    ttk.Button(root3, text="Quit", command=root3.destroy).pack()

    ttk.Button(root4, text="Quit", command=root4.destroy).pack()

    root.mainloop()


if __name__ == '__main__':
    main()

  

Я хочу изображения на всех кнопках.
Я могу заставить его работать только для одной кнопки.

Комментарии:

1. Может быть, обходным путем было бы скопировать / вставить изображение и назвать его как-то по-другому, а затем сослаться на эту копию в вашем скрипте?

2.Вы создали четыре совершенно отдельных экземпляра среды Tcl / Tck — вот что Tk() происходит, окно, которое вы получаете из него, является просто побочным эффектом. Изображения, переменные, виджеты и т.д., Созданные в одном экземпляре, Не могут быть использованы ни в каком другом экземпляре. Используйте Tk() один раз, используйте Toplevel() , если вам нужны дополнительные окна.

3. Я попытался создать копию изображения и использовать это изображение, и это тоже не сработало.

4. Единственный известный мне способ использовать разные темы для каждого окна — это использовать отдельный экземпляр Tk () для каждого окна. Если я не ошибаюсь в этом.

5. Если вы должны использовать несколько экземпляров Tk() , тогда вам нужно явно создать вещи в экземпляре, который будет их использовать. PhotoImage имеет master= возможность указать это, например. Обратите внимание, что это означает, что вам придется загружать изображения несколько раз, если вы хотите использовать их в нескольких экземплярах Tk.

Ответ №1:

Вам нужно будет создать другое фотоизображение для каждого окна с master ключевым словом:

 icon = PhotoImage(master=root, file='test.gif')
icon2 = PhotoImage(master=root2, file='test.gif')
icon3 = PhotoImage(master=root3, file='test.gif')
icon4 = PhotoImage(master=root4, file='test.gif')
  

А затем используйте каждый значок для соответствующей кнопки:

 ttk.Button(root, image=icon, compound='left', text='Quit', command=root.destroy).pack()
ttk.Button(root2, image=icon2, text='Quit', command=root2.destroy).pack()
ttk.Button(root3, image=icon3, text='Quit', command=root3.destroy).pack()
ttk.Button(root4, image=icon4, text='Quit', command=root4.destroy).pack()
  

Надеюсь, это сработает у вас.

Комментарии:

1. Еще раз спасибо. Я попробовал то, что вы предложили, и это тоже не сработало.

2. Извините, это работает, спасибо. Это единственный способ сделать это, кажется немного запутанным?