Обработка списков в Python.
На прошлом занятии мы подготовили программу, в которой будем работать со списками.
Приведу полный код:
from random import randrange as rnd, choice from tkinter import * root = Tk() root.geometry('400x400') canv = Canvas(root, bg = 'white') canv.pack(fill = BOTH, expand = 1) class ball(): def __init__(self): x = self.x = 0 y = self.y = 0 r = self.r = 0 self.width = 0 self.color = '' self.pen_color = '' self.id = canv.create_oval(x-r,y-r,x+r,y+r, width = self.width, fill = self.color, outline = self.pen_color ) def paint(self): x = self.x y = self.y r = self.r canv.coords(self.id,x-r,y-r,x+r,y+r) canv.itemconfig (self.id, width = self.width, fill = self.color, outline = self.pen_color) balls = [] colors = ['red','brown','green','lightgreen','yellow','black','blue'] for z in range(12): new_ball = ball() new_ball.x = rnd(100,300) new_ball.y = rnd(100,300) new_ball.r = rnd(10,30) new_ball.color = choice(colors) new_ball.pen_color = choice(colors) new_ball.width = rnd(0,5) balls += [new_ball] for b in balls: b.paint() mainloop()
Теперь, после того, как у нас есть заполненный список «шариков», мы можем с ним поработать.
Для начала попробуем выстроить уже имеющийся список в ряд:
x = 20 for b in balls: b.x = x b.y = 200 x += 60 for b in balls: b.paint() mainloop()
Однако, мы видим, что все шарики не помещаются на экране.
Чтобы изменить размер окна, добавьте перед mainloop():
root.geometry(str(x+30) + 'x400')
str — это функция, которая преобразовывет число в строку. Для задания размера нам нужно получить строку, вида ‘800×600’, вот мы ее и собираем по частям: сначала добавляем к центру последнего шарика еще 30, потом преобразовываем это число в строку, чтобы склеить со строкой ‘x400’.
Однако, мы делаем двойную работу, даже тройную: при создании шарика его координаты, размер и другие параметры равны нулю, потом мы меняем их на случайные, чтобы в третий раз подправить и расположить в ряд.
Думаю, что стоить уменить количество кода:
from random import randrange as rnd, choice from tkinter import * root = Tk() root.geometry('400x400') canv = Canvas(root, bg = 'white') canv.pack(fill = BOTH, expand = 1) colors = ['red','brown','green','lightgreen','yellow','black','blue'] class ball(): def __init__(self): x = self.x = rnd(100,300) y = self.y = rnd(100,300) r = self.r = rnd(10,30) self.width = rnd(0,5) self.color = choice(colors) self.pen_color = choice(colors) self.id = canv.create_oval(x-r,y-r,x+r,y+r, width = self.width, fill = self.color, outline = self.pen_color ) def paint(self): x = self.x y = self.y r = self.r canv.coords(self.id,x-r,y-r,x+r,y+r) canv.itemconfig (self.id, width = self.width, fill = self.color, outline = self.pen_color) balls = [] x = 30 for z in range(12): new_ball = ball() new_ball.x = x new_ball.y = 200 x += 60 new_ball.paint() balls += [new_ball] root.geometry(str(x+30) + 'x400') mainloop()
Теперь случайные значения для свойст шарика будет задавать в конструкторе, а выравнивать в горизонтальный ряд будет в процесс заполнения шариками списка.
2. Заполнить в ряд по диагонали слева
3. Заполнить в ряд по диагонали справа
4. Заполнить в ряд по горизонтали с увеличивающимся радиусом от 10 (+2)
Дальнейшие задания мы будем делать в функциях и вызывать по щелчку или нажатию кнопки.
По щелчку заполнить случайными, выстроить их в ряд:
from random import randrange as rnd, choice from tkinter import * root = Tk() root.geometry('800x600') fr = Frame(root) fr.pack(fill = X, pady = 5) bt1 = Button(fr, width = 8, text = 1) bt1.pack(side = 'left', padx = 2) bt2 = Button(fr, width = 8, text = 2) bt2.pack(side = 'left', padx = 2) bt3 = Button(fr, width = 8, text = 3) bt3.pack(side = 'left', padx = 2) bt4 = Button(fr, width = 8, text = 4) bt4.pack(side = 'left', padx = 2) canv = Canvas(root, bg = 'white') canv.pack(fill = BOTH, expand = 1) colors = ['red','brown','green','lightgreen','yellow','black','blue'] class ball(): def __init__(self): x = self.x = rnd(100,300) y = self.y = rnd(100,300) r = self.r = rnd(10,30) self.width = rnd(0,5) self.color = choice(colors) self.pen_color = choice(colors) self.id = canv.create_oval(x-r,y-r,x+r,y+r, width = self.width, fill = self.color, outline = self.pen_color ) self.paint() def paint(self): x = self.x y = self.y r = self.r canv.coords(self.id,x-r,y-r,x+r,y+r) canv.itemconfig (self.id, width = self.width, fill = self.color, outline = self.pen_color) def align_x(): global balls x = 30 for b in balls: b.y = 200 b.x = x x += 60 b.paint() def fill_random(event): global balls canv.delete(ALL) # очистить холст balls = [] # удалить уже существующие шарики, если они были for z in range(12): balls += [ball()] align_x() def bt1_click(event): pass def bt2_click(event): pass def bt3_click(event): pass def bt4_click(event): pass canv.bind('<Button-1>', fill_random) bt1.bind('<Button-1>',bt1_click) bt2.bind('<Button-1>',bt2_click) bt3.bind('<Button-1>',bt3_click) bt4.bind('<Button-1>',bt4_click) mainloop()
5. Сделать кнопку, по нажатию на которую размер красных увеличиться на 5
6. Сделать кнопку, по нажатию на которую размер тех шариков, у которых совпадает цвет линии и цвет заливки увеличится на 5
7. Сделать кнопку, …, которая делает тонкую черную линию у тех шариков, которые не имеют линии (толщина = 0)
8. Убрать линию и увеличить размер шарика на ее размер у тех шариков, у которых цвет линии совпадает с цветом заливки.
9. Распределить шарики по ширине окна (чтобы расстояние между ними было одинаковым).
Определить ширину окна можно так: canv.winfo_width()
10. Создать метод ball.kill для удаления шарика (чтобы удалять и из списка, и с холста):
def kill(self): global balls canv.delete(self.id) balls.remove(self)
11. Удалить последний шарик
12. Удалить первый красный шарик
13. Удалить все красные шарики (проверять внимательно, иногда могут удалиться не все красные!)
См. справочник: работа со списками.
14. Удалить все, кроме последних 3-х штук
15. Удалить все, кроме первых 3-х штук
16. Удалить каждый второй
17. Удалить после красного (см. справочник: работа со списками)
18. Удалить перед красным
19. Удалить шарики без линии
20. Удалить шарики без линии, если перед ними стоит шарик с линией
21. Удалить шарики без линии, если слева и справа от них шарики с линией
One thought on “23. Работа с списками в Python”