Для выбора цвета в некоторых предыдущих примерах мы сначала выбирали номер случайным образом, потом брали элемент списка с этим номером каждый раз, когда нужно было узнать выбранный цвет. Проще для этого использовать функцию choice из модуля random. Напомню, что ее надо будет импортировать.
colors = ['red','blue','green','orange'] color = colors[random(len(colors))] canv.create_oval(x-r,y-r,x+r,y+r,fill = color)
colors = ['red','blue','green','orange'] color = choice(colors) canv.create_oval(x-r,y-r,x+r,y+r,fill = color)
Посчитаем, сколько синих кругов мы нарисовали:
from tkinter import * from random import randrange as rnd, choice root = Tk() root.geometry('800x600') canv = Canvas(root,bg='white') canv.pack(fill=BOTH,expand=1) colors = ['red', 'orange', 'yellow', 'green', 'blue'] def paint(event): canv.delete(ALL) k = 0 for z in range(30): x = rnd(100,700) y = rnd(100,500) r = rnd(5,30) color = choice(colors) if color == 'blue': k += 1 canv.create_oval(x-r,y-r,x+r,y+r,fill = color) print(k) canv.bind('<Button-1>',paint) mainloop()
Результат подсчета появится в консоли. За это отвечает уже знакомый print, но можно вывести и прямо на canvas:
(писать вместо print)
canv.create_text(20,20,text=str(k), font = '18')
А теперь посчитаем, сколько было синих или зеленых, для этого заменим строку:
if color == 'blue':
на
if color == 'blue' or color == 'green':
Будем рисовать красные круги случайным радиусом, а остальные – радиусом 20:
def paint(event): for z in range(30): x = rnd(100,700) y = rnd(100,500) color = choice(colors) if color == 'red': r = rnd(10,40) else: r = 20 canv.create_oval(x-r,y-r,x+r,y+r,fill = color)
В данном случае мы видим выбор из двух вариантов. Если условие, записанное в if верно, то блок else не выполняется. А если неверно, то – выполняется.
Рассмотрим еще один пример. Не запуская, попробуйте определить, что он делает:
def paint(event): for z in range(30): x = rnd(100,700) y = rnd(100,500) color = choice(colors) if color == 'red': r = rnd(10,40) else: if color == 'pink': r = 50 else: r = 10 canv.create_oval(x-r,y-r,x+r,y+r,fill = color)
А что, если у нас для каждого цвета есть свой вариант? Так мы быстро запутаемся в «лесенке» if… К счастью, Python позволяет организовать множественный выбор более простым способом:
def paint(event): for z in range(30): x = rnd(100,700) y = rnd(100,500) color = choice(colors) if color == 'red': r = rnd(10,40) elif color == 'pink': r = 50 elif color == 'magenta': r = 100 else: r = 20 canv.create_oval(x-r,y-r,x+r,y+r,fill = color)
Итак, оператор выбора позволяет писать сложные условия (вы же заглянули в справочник, не так ли?).
Проверьте себя: вы должны понимать примеры, приведенные ниже:
if color == 'red':
if color != 'red':
if color == 'red' or color == 'blue':
if color = 'red' and r > 20:
if 10 < r < 30:
if color =='red': r = 30 else: r = 50
if color == 'blue' or 'cyan': r = 10 elif color == 'red' or color == 'pink': r = 20 else: r = rnd(10,50)
А теперь немного практики:
4. Нарисовать 20 случайных кругов, посчитать, сколько было нарисовано зеленых и синих
5. Нарисовать 20 случайных кругов, посчитать, сколько было нарисовано маленьких (радиус меньше 20) красных и больших синих (радиус больше 50)
6. Нарисовать 20 случайных кругов. Если фигура левее центра – красным, если правее – синим.
7. Создайте новую команду (функцию) для рисования равностороннего треугольника: tr(x,y,n), где x,y- координаты одной из его вершин, а n - размер стороны.
8. Нарисовать 30 фигур, выбирая их случайным образом (квадратов, треугольников, прямоугольников или кругов), случайного размера, цвета и в случайном месте.
Для выбора фигуры будем использовать тот же rnd:
ch = rnd(3) if ch == 0: canv.create_oval... elif ch == 1: canv.create_rectangle... elif ch== 2: ...
def paint(event): for z in range(30): k = 0 x = rnd(100,700) y = rnd(100,500) color = choice(colors) r = rnd(10,40) if color == 'red': k = 1 canv.create_oval(x-r,y-r,x+r,y+r,fill = color) print(k)
def paint(event): for z in range(30): k = 0 x = rnd(100,700) y = rnd(100,500) color = choice(colors) r = rnd(10,40) if r <= 15: k += 1 canv.create_oval(x-r,y-r,x+r,y+r,fill = color) print(k)
Вот так должно было получиться:
from tkinter import * from random import randrange as rnd root = Tk() root.geometry('800x600') canv = Canvas(root,bg='white') canv.pack(fill=BOTH,expand=1) def clear(event): canv.delete(ALL) def paint(event): xc = 400 yc = 300 for z in range(55): x = rnd(50,750) y = rnd(50,500) r = 15 color = 'yellow' if (x-2*r) < xc < (x+2*r) and (y-2*r) < yc < (y+2*r): color = 'red' if (x-4*r) < xc < (x+4*r) and (y-4*r) < yc < (y+4*r): color = 'blue' if (x-8*r) < xc < (x+8*r) and (y-8*r) < yc < (y+8*r): color = 'green' canv.create_oval(x-r,y-r,x+r,y+r,fill=color,width=0) canv.bind('<Button-1>',paint) canv.bind('<Button-3>',clear) mainloop()
One thought on “12. Принимаем решения. Оператор выбора в Python (ветвление, if)”