Для выбора цвета в некоторых предыдущих примерах мы сначала выбирали номер случайным образом, потом брали элемент списка с этим номером каждый раз, когда нужно было узнать выбранный цвет. Проще для этого использовать функцию 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)”