почему не читается иконка?
такой код работает:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from tkinter import *
root=Tk()
image = PhotoImage(file='image.png')
button=Button(root, image=image)
button.pack()
root.mainloop()
а такой не срабатывает, почему???
#!/usr/bin/python
# -*- coding: utf-8 -*-
from tkinter import *
import tkinter as tk
class Main(tk.Frame):
def __init__(self, root):
super().__init__(root)
self.init_main()
def init_main(self):
image = PhotoImage(file='image.png')
self.button1=Button(root, image=image)
self.button1.pack()
if __name__ == "__main__":
root = tk.Tk()
app = Main(root)
app.pack()
root.mainloop()
Ответы (1 шт):
Думаю, потому что объект картинки передается в кнопку по ссылке, а там не копируется - с ним так и работают по ссылке (что логично, чтобы не засорять память и занимать ресурсы проца, картинки бывают весьма тяжелые). В первом случае ваша картинка живет пока живет приложение, во-втором - в локальной (стековой) памяти метода init_main (до выхода их него).
Поэтому надо чтобы ссылка на картинку не удалялась сборщиком мусора, а жила все необходимое время.
Для этого надо, либо сделать ссылку на картинку полем класса:
class Main(tk.Frame):
def __init__(self, root):
super().__init__(root)
self.image = PhotoImage(file='image.png')
self.init_main()
def init_main(self):
self.button1=Button(root, image=self.image)
self.button1.pack()
И тогда картинка будет жить пока живет объект класса.
Либо, передавать ссылку на картинку из вне класса Main:
if __name__ == "__main__":
root = tk.Tk()
image = PhotoImage
app = Main(root, image)
app.pack()
root.mainloop()
В этом случае картинка будет жить до выхода из цикла root.mainloop().
Первый вариант лучше, если картинка нужна только в одном классе, второй - если она нужна нескольким объектам приложения.