Повторное использование элементов строки Python
Суть программы вывести окно с фоном, на котором будут падать листья, как сделать так, чтобы не пришлось добавлять новые листья в список pics, т.е. использовать уже добавленные листья в нужном количестве. Т.е. я добавил три листа, и выводится три, а я хочу добавить три листа, и вывести 20, используя в качестве картинок только те 3 добавленные. Хочу решить в минимум строк, но не понимаю как.
from tkinter import *
from random import *
import time
wind_width = 1000
wind_height = 560
wind_x = randint(0, 400)
wind_y = randint(60, 500)
win = Tk()
win.title('Падающие листья')
c = Canvas(win, bg='blue', width=wind_width, height=wind_height)
bg = PhotoImage(file='backGR.png')
id_bg = c.create_image(1, 1, anchor=NW, image=bg)
c.pack()
flag = False
class Fish:
def __init__(self, img):
self.listik = c.create_image(randrange(100, 900), 35, image=img)
self.img = img
self.xspeed = randrange(1, 5)
self.yspeed = randrange(1, 5)
def move(self):
c.move(self.listik, self.xspeed, self.yspeed)
pos = c.coords(self.listik)
if pos[1] >= wind_height - 35 or pos[1] <= 35:
c.delete(self.listik)
self.listik = c.create_image(randrange(100, 900), 35, image=self.img)
if pos[0] >= wind_width - 50:
self.xspeed = -self.xspeed
if pos[0] <= 50:
self.xspeed = -self.xspeed
def speed(self, a, event):
if a == 1:
self.yspeed = 10;
if a == 2:
self.yspeed = 20;
field_key1 = StringVar()
win.bind('<Escape>', lambda f: win.destroy())
pics = []
for i in range(3):
pics.append(PhotoImage(file='leaf' + str(i) + '.png'))
listiki = []
for i in range(3):
listiki.append(Fish(pics[i]))
def speed1(event):
listiki[0].speed(1, event)
listiki[1].speed(1, event)
listiki[2].speed(1, event)
def speed2(event):
listiki[0].speed(2, event)
listiki[1].speed(2, event)
listiki[2].speed(2, event)
win.bind('1', speed1)
win.bind('2', speed2)
while True:
for fish in listiki:
fish.move()
win.update()
time.sleep(0.005)
win.mainloop()
Ответы (1 шт):
for i in range(20):
listiki.append(Fish(pics[i % 3]))
% - получить остаток от деления на число. При делении с остатком индекса из range(20) всегда будет получаться число в диапазоне от 0 до 2.
Также в данном случае вместо последовательного перебора списка изображений можно с помощью функции choice из модуля random выбирать случайный объект из списка:
for i in range(20):
listiki.append(Fish(choice(pics)))