BB_Ape
BB_Ape

Reputation: 1

Ren'py / Python - insert dynamic variable in class with a while loop - without overwriting with append

I'm currently trying to get into Python and Ren'Py a bit. Since I like to design a lot dynamically and don't want to use copy&paste so often, I'm trying to create a page that will have ImageButtons with the corresponding number I specify.

In the example below I use "4" - but this can be higher.

I have built a class for this purpose:

Example:
    init python:
        class PictureSettings(object):
            def __init__ (self, ImgIdle, ImgHover, LabelCall):
                self.ImgIdle = ImgIdle
                self.ImgHover = ImgHover
                self.LabelCall = LabelCall
                return

For the Idle/Hover and for the Jump.

If I insert in the code now in an object each entry "manually" with append I get all 4 pictures as desired indicated.

Example: (Works - but is not dynamic)
    python:
        var_pictures = []
        var_pictures.append(PictureSettings("img_picture_1_idle", "img_picture_1_hover", "picture_1"))
        var_pictures.append(PictureSettings("img_picture_2_idle", "img_picture_2_hover", "picture_2"))
        var_pictures.append(PictureSettings("img_picture_3_idle", "img_picture_3_hover", "picture_3"))
        var_pictures.append(PictureSettings("img_picture_4_idle", "img_picture_4_hover", "picture_4"))

I would like it to be like this:

Example (Here I get only ""img_picture_4_idle", "img_picture_4_hover", "picture_4""):
    $ countlimit = 4
    $ count = 1
        
    python:
        while count < countlimit:
        var_pictures = []
        var_pictures.append(PictureSettings(
            ImgIdle = "img_picture_[count]_idle",
            ImgHover = "img_picture_[count]_hover",
            LabelCall = "picture_[count]"))
        count += 1

Have already tried various things, unfortunately without success. For example: with Add - instead of append (because this overwrites the result and leaves only the last entry I get the following error:

var_pictures.add(PictureSettings( AttributeError: 'RevertableList' object has no attribute 'add')

Maybe someone can help me with the solution so I can keep my code dynamic without copying something X times.

Thanks for your help

Upvotes: 0

Views: 737

Answers (1)

Nicolas Appriou
Nicolas Appriou

Reputation: 2331

You are creating your list inside your loop, so it is recreated every time. At the end, you only get the last created list.

var_pictures = []
while count < countlimit:
    var_pictures.append(PictureSettings(
        ImgIdle = "img_picture_[count]_idle",
        ImgHover = "img_picture_[count]_hover",
        LabelCall = "picture_[count]"))
    count += 1

On another subject, if you want to do this in a more pythonic way:

pictures = []  # no need for var_, we know its a variable
for i in range(1, 5):
    pictures.append(PictureSettings(
        # in python, we prefere snake_case attributes
        img_idle=f'img_picture_{i}_idle',
        img_hover=f'img_picture_{i}_hover',
        ...
    ))

# or even shorter with list comprehension
pictures = [
    PictureSettings(
        img_idle=f'img_picture_{i}_idle',
    )
    for i in range(1, 5)
]

By the way, no need to return in your class constructor

Upvotes: 1

Related Questions