#python #for-loop #variables #data-structures #python-imaging-library
#python #for-цикл #переменные #структуры данных #python-imaging-library
Вопрос:
Я должен открыть пару изображений с помощью 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:
Один из распространенных способов избежать динамического создания переменных — хранить элементы в каком-либо контейнере переменного размера, таком как 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.