Холст Tkinter создать изображение несколько раз - PullRequest
0 голосов
/ 16 ноября 2018

Я использую эту функцию в своем коде для создания изображения на холсте:

def _create_image(self, coord):
    (x,y) = coord 
    self.one = ImageTk.PhotoImage(Image.open("test.jpg"))
    root.one = self.one
    self.canvas.create_image(x-25, y-25, image=self.one, anchor='nw', tags="image")

Моя проблема в том, что каждый раз, когда я вызываю эту функцию, старое изображение удаляется, а новое создается.

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

Ответы [ 3 ]

0 голосов
/ 17 ноября 2018

Сначала создайте список, например, __init__().

self.img_ref = []

Затем добавьте каждое новое изображение в этот список по мере их создания:

def _create_image(self, coord):
    (x,y) = coord 
    self.one = ImageTk.PhotoImage(Image.open("test.jpg"))
    root.one = self.one
    self.canvas.create_image(x-25, y-25, image=self.one,
                             anchor='nw', tags="image")
    self.img_ref.append(self.one)  # Keep reference to image

Даже если каждое изображение является одним и тем же изображением, вы должны сохранять ссылку на каждое из них.

0 голосов
/ 17 ноября 2018

Вы не должны ни изменять метод __init__(), ни хранить список ссылок, поскольку это всегда один и тот же файл изображения.Здесь что-то, что избегает использования ненужных ресурсов, поэтому будет использовать меньше памяти (и, вероятно, будет быстрее).

Это достигается путем проверки того, существует ли атрибут one или нет, а если нет, то только тогда считывает данные изображения и создает PImageTk.PhotoImagehotoImage в первый раз.

Этот подход позволяет создавать несколько Canvas объектов изображения виджета из одного ImageTk.PhotoImage вместо загрузки нескольких его копий в память.

def _create_image(self, coord):
    (x,y) = coord

    if not getattr(self, 'one', None):  # First call?
        pil_img = Image.open("test.jpg")
        self.one = ImageTk.PhotoImage(pil_img)

    self.canvas.create_image(x-25, y-25, image=self.one,
                             anchor='nw', tags="image")

Вы также можете выполнитьсоздание ImageTk.PhotoImage всего в одной строке:

    # pil_img = Image.open("test.jpg")  # Leave out.
    self.one = ImageTk.PhotoImage(file="test.jpg")
0 голосов
/ 17 ноября 2018

Image.open() будет каждый раз перезаписывать изображение.

...