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