Открытие нескольких изображений на PIL с помощью цикла for - PullRequest
1 голос
/ 01 апреля 2019

Мне нужно открыть пару изображений с помощью PIL. Прямо сейчас у меня есть только 3 изображения, поэтому я делаю их открытие, а не в цикле for:

self.redpic = Image.open("red.png")
self.redpic = self.redpic.resize((100,100), Image.ANTIALIAS)
self.img1 = ImageTk.PhotoImage(self.redpic)

Но в будущем я буду открывать не менее 20 изображений, поэтому я попробовал реализацию цикла for:

def process_image(self):
    for valx in range(5):
        self.numbering = "image" + str(valx);
        self.numbpng = numbering + ".png";
        self.numbering = Image.open(numbpng);
        self.numbering = self.numbering.resize((100,100), Image.ANTIALIAS)
        self.numbering= ImageTk.PhotoImage(self.numbering)

Но при этом я не получаю доступ к только что созданным изображениям. Я читал о динамическом создании переменных и о том, как это не рекомендуется, поэтому мне было интересно, как мне лучше всего получить доступ к self.imagex, где x - это номер изображения. Я знаю количество изображений раньше времени.

1 Ответ

0 голосов
/ 01 апреля 2019

Один из распространенных способов избежать динамического создания переменных - хранить элементы в контейнерах различного размера, таких как tuple, list, dict и т. Д.

Ниже приведеноПример их хранения в атрибуте экземпляра класса, который является list и называется self.images:

from PIL import Image, ImageTk

class Class:
    def process_images(self, num_images):
        self.images = []
        for i in range(num_images):
            image_filename = "image%s.png" % i
            number_img = Image.open(image_filename).resize((100, 100), Image.ANTIALIAS)
            number_img = ImageTk.PhotoImage(number_img)
            self.images.append(number_img)

c = Class()
c.process_images(5)

После вызова метода вы можете ссылаться на отдельные изображения, например:

c.images[2]  # Third image.
...