вівторок, 26 грудня 2017 р.

Створення новорічних листівок за допомогою Python

У минулій статті я продемонстрував алгоритм для переміщенні об'єктів класу Canvas за допомогою курсора миші (http://proginschool.blogspot.com/2017/12/canvas.html).
Тепер ми знаємо як змусити будь-який елемент полотна Canvas рухатися за вказівником миші, а зараз я продемонструю приклад примітивної програми на застосування цього алгоритму.
Це буде невеликий симулятор новорічної ялинки. Задача користувача нарядити дерево різнокольоровими кульками, а після завершення роботи програма збереже отримане зображення з надписом "Happy New Year!".
Отже, спочатку створимо нове вікно, полотно та саму ялинку:

from tkinter import *

root = Tk()

canv = Canvas(root, width=500, height=500, bg="light yellow")
canv.pack()

canv.create_polygon(250, 190, 140, 280, 360, 280, fill="green", outline="black")
canv.create_polygon(250, 150, 170, 220, 330, 220, fill="green", outline="black")
canv.create_polygon(250, 110, 200, 160, 300, 160, fill="green", outline="black")
canv.create_rectangle(230, 280, 270, 330, fill="brown")
canv.create_text(252, 392, text="Happy New Year!", font="Times 30 italic", fill="black", justify=CENTER)
canv.create_text(250, 390, text="Happy New Year!", font="Times 30 italic", fill="blue", justify=CENTER)

root.mainloop()



Тепер створимо кульку та алгоритм переміщення для неї:

. . .
# для першої кульки
def fun(event):
     canv.tag_raise(oval)
global x, y
x = event.x-x1
y = event.y-y1

def fun1(event):
global x1, y1
canv.coords(oval, x1, y1, x1+30, y1+30)
x1 = event.x-x
y1 = event.y-y

x1 = 25
y1 = 25

oval = canv.create_oval([x1, y1], [x1+30, y1+30], fill="light green")

canv.tag_bind(oval, "<Button-1>", fun)
canv.tag_bind(oval, "<B1-Motion>", fun1)
. . .


Тепер повторимо цей алгоритм ще 5 разів, але вкажемо різні кольори та номера змінних:

. . .
# для другої кульки
def fun_1(event):
canv.tag_raise(oval1)
global x_1, y_1
x_1 = event.x-x1_1
y_1 = event.y-y1_1

def fun1_1(event):
global x1_1, y1_1
canv.coords(oval1, x1_1, y1_1, x1_1+30, y1_1+30)
x1_1 = event.x-x_1
y1_1 = event.y-y_1

x1_1 = 50
y1_1 = 25

oval1 = canv.create_oval([x1_1, y1_1], [x1_1+30, y1_1+30], fill="light blue")

canv.tag_bind(oval1, "<Button-1>", fun_1)
canv.tag_bind(oval1, "<B1-Motion>", fun1_1)

# для третьої кульки
def fun_2(event):
canv.tag_raise(oval2)
global x_2, y_2
x_2 = event.x-x1_2
y_2 = event.y-y1_2

def fun1_2(event):
global x1_2, y1_2
canv.coords(oval2, x1_2, y1_2, x1_2+30, y1_2+30)
x1_2 = event.x-x_2
y1_2 = event.y-y_2

x1_2 = 75
y1_2 = 25

oval2 = canv.create_oval([x1_2, y1_2], [x1_2+30, y1_2+30], fill="orange")

canv.tag_bind(oval2, "<Button-1>", fun_2)
canv.tag_bind(oval2, "<B1-Motion>", fun1_2)

# для четвертої кульки
def fun_3(event):
canv.tag_raise(oval3)
global x_3, y_3
x_3 = event.x-x1_3
y_3 = event.y-y1_3

def fun1_3(event):
global x1_3, y1_3
canv.coords(oval3, x1_3, y1_3, x1_3+30, y1_3+30)
x1_3 = event.x-x_3
y1_3 = event.y-y_3

x1_3 = 100
y1_3 = 25

oval3 = canv.create_oval([x1_3, y1_3], [x1_3+30, y1_3+30], fill="violet")

canv.tag_bind(oval3, "<Button-1>", fun_3)
canv.tag_bind(oval3, "<B1-Motion>", fun1_3)

# для п'ятої кульки
def fun_4(event):
canv.tag_raise(oval4)
global x_4, y_4
x_4 = event.x-x1_4
y_4 = event.y-y1_4

def fun1_4(event):
global x1_4, y1_4
canv.coords(oval4, x1_4, y1_4, x1_4+30, y1_4+30)
x1_4 = event.x-x_4
y1_4 = event.y-y_4

x1_4 = 125
y1_4 = 25

oval4 = canv.create_oval([x1_4, y1_4], [x1_4+30, y1_4+30], fill="light grey")

canv.tag_bind(oval4, "<Button-1>", fun_4)
canv.tag_bind(oval4, "<B1-Motion>", fun1_4)

# для шостої кульки
def fun_5(event):
canv.tag_raise(oval5)
global x_5, y_5
x_5 = event.x-x1_5
y_5 = event.y-y1_5

def fun1_5(event):
global x1_5, y1_5
canv.coords(oval5, x1_5, y1_5, x1_5+30, y1_5+30)
x1_5 = event.x-x_5
y1_5 = event.y-y_5

x1_5 = 150
y1_5 = 25

oval5 = canv.create_oval([x1_5, y1_5], [x1_5+30, y1_5+30], fill="light yellow")

canv.tag_bind(oval5, "<Button-1>", fun_5)
canv.tag_bind(oval5, "<B1-Motion>", fun1_5)
. . .


Тепер залишилося додати функцію, яка буде створювати новий графічний файл із зображенням полотна Canvas (при натисканні на клавішу Enter):

. . . 
def main_f(event):
canv.update()
canv.postscript(file="christmas_tree.ps", colormode='color')
root.quit()
root.destroy()
. . . 
root.bind("<Return>", main_f)
. . .

А зараз пропоную подивитися на те, як користуватися цією програмою:


----------
Якщо у вас виникли запитання задайте їх в нашій групі в Facebook: https://www.facebook.com/groups/proginschool.forum/ 
Також рекомендуємо придбати посібники з програмування мовою Python для учнів 8-х та 9-х класів:
http://www.proginschool.inf.ua/posibnyk/8form.html
http://www.proginschool.inf.ua/posibnyk/9form.html

Немає коментарів:

Дописати коментар

Динамічне програмування мовою Python

Ця тема не входить в шкільний курс інформатики, проте дуже часто представлена на олімпіаді з програмування. Динамічне програмування - це вж...