How to scale multiple images with a for loop?

Question:

I’m trying to use a for-loop to iterate through a list of self classes. I want to give each one the same scale.

def __init__(self):    
    pygame.sprite.Sprite.__init__(self)
    self.image = pygame.image.load("Migue/m_normal.png")

    self.quieto = pygame.image.load("Migue/m_normal.png")
    self.andando = pygame.image.load("Migue/m_andando_normal.png")
    self.image = pygame.transform.scale(self.image, sizenorm)
 
    states = [self.quieto, self.andando]

    for i in states:
        i = pygame.transform.scale(i, sizenorm)

This wont work, but I can achieve the result using this:

self.quieto = pygame.transform.scale(self.quieto, sizenorm) 
self.andando = pygame.transform.scale(self.andando, sizenorm)

The problem is that I have to make a lot of more states, and using that for loop would be shorter. However, it doesn’t work like the lower example does. I don’t know what’s wrong with the loop.

Asked By: Fire Frekox

||

Answers:

You can create a list of the scaled objects and assign the elements of the list to the original attributes:

states = [self.quieto, self.andando]
states = [pygame.transform.scale(i, sizenorm) for i in states]
(self.quieto, self.andando) = states

This can even be written in a single line

(self.quieto, self.andando) = [pygame.transform.scale(i, sizenorm) for i in [self.quieto, self.andando]]

Alternatively, you can simply put the images in a list:

filenames = ["Migue/m_normal.png", "Migue/m_andando_normal.png"]
self.states = [pygame.transform.scale(pygame.image.load(n), sizenorm) for n in filenames]
Answered By: Rabbid76
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.