У мові Python існують різні способи роботи з графікою. Тобі відомі засоби модуля tkinter для створення графічного інтерфейсу — створення графічного вікна, розміщення у вікні графічних компонентів та програмування обробки подій для цих компонентів. Засобами tkinter можна створювати зображення та анімацію.
Створення вікна програми з написом і кнопкою
Згадаємо основні кроки зі створення програми з графічним інтерфейсом. Побудова програми починається зі створення вікна. У вікно додаються всі інші потрібні компоненти графічного інтерфейсу.
Проаналізуємо програмний код створення вікна з написом і кнопкою.
1. from tkinter import * # завантаження модуля tkinter
2. def btn_click(): # Опис функції-обробника події "натискання на кнопку"
3. lab.config(text = 'Успіхів!')
4. root = Tk()
5. root.title ('Графічна програма')
6. root.geometry('250x150')
7. lab = Label(root, text = 'Помалюємо?', font = 'Arial 14')
8. lab.place(x = 100, y = 1)
9. btn = Button(root, text = 'Так', command = btn_click)
10. btn.place(x = 50, y = 50)
11. root.mainloop() # запуск головного циклу обробки подій
У 4-му рядку створюється змінна root, у якій зберігається об’єкт класу Tk(), який визначений у модулі tkinter.
Об’єкт root створює порожнє вікно, до якого можна додавати кнопки, текстові поля, холсти для малювання та інші віджети. Це основний клас модуля tkinter.
У 7-му рядку створюється об'єкт lab класу Label, який розміщено у вікні методом lab.place(x = 100, y = 1).
У 9-му рядку створено кнопку — об’єкт класу Button. При створенні об’єкта btn першим аргументом указано змінну root (батьківський віджет), другим — 'Так' (заголовок кнопки), третім — посилання на метод btn_click, який буде виконуватися в разі натискання на кнопку.
Якщо зберегти й виконати цей код, побачимо вікно програми (рис. 1).
При виконанні програми після натискання на кнопку заголовок напису зміниться на текст 'Успіхів!'.
Рис.1
Полотно для малювання
У tkinter зображення створюється в межах полотна — об’єкту класу Canvas. Тому перш, ніж записувати оператори для малювання, потрібно створити полотно.
Синтаксис створення об’єкта класу Canvas:
змінна = Canvas (батьківський_віджет, width=значення, height=значення)
змінна = Canvas (батьківський_віджет, width=значення, height=значення)
Приклад:
Створити полотно розміром 500х500 пікселів.
from tkinter import *
root = Tk()
canvas = Canvas(root, width=500, height=500)
canvas.pack()
from tkinter import *
root = Tk()
canvas = Canvas(root, width=500, height=500)
canvas.pack()
Для малювання ліній на полотні використовують координати.
Будь-яка точка на полотні може бути задана парою чисел (X, Y), де Х — це відстань від точки до лівого краю полотна, Y — відстань від точки до верхнього краю полотна.
Рис.2
Полотно на рис.2 має ширину 500 пікселів і висоту 500 пікселів, тобто верхньому лівому куту відповідають координати (0, 0), а правому нижньому — (500, 500).
Колір полотна — світло-сірий, за бажання можна змінити фон для майбутнього малюнка за допомогою оператора canvas.config(bg = 'blue') #blue замініть назвою потрібного кольору (можна використовувати як текстові назви кольорів, так і їхні коди в HEX-форматі)
Методи полотна tkinter
Об’єкт Canvas має ряд методів, призначених для малювання точок, ліній, прямокутників, кіл, дуг, виведення тексту.
Відрізок. Метод create_line креслить відрізок від точки з координатами (x1, y1) до точки(x2, y2):
canvas.create_line(x1, y1, x2, y2)
canvas.create_line(x1, y1, x2, y2)
Приклад:
Намалювати лінію від верхнього лівого кута полотна до правого нижнього кута.
canvas.create_line(0, 0, 500, 500)
canvas.create_line(0, 0, 500, 500)
Прямокутник. Метод create_rectangle малює незаповнений прямокутник, протилежні кути якого збігаються з точками (x1, y1) і (x2, y2). Сторони прямокутника паралельні сторонам екрана:
canvas.create_rectangle (x1, y1, x2, y2)
canvas.create_rectangle (x1, y1, x2, y2)
Приклад:
Намалювати квадрат із довжиною сторони 100 пікселів:
canvas.create_rectangle (20,30,120,130)
Еліпс. Метод canvas.create_oval малює еліпс, вписаний в прямокутник, який задано координатами двох протилежних вершин x1, y1 і x2, y2 (рис.3):
canvas.create_oval (x1, y1, x2, y2)
Рис.3
Приклад:
Намалювати коло діаметром 100 пікселів.
canvas.create_oval (20, 30, 120, 130);
canvas.create_oval (20, 30, 120, 130, fill='red', outline='blue', width=3)
canvas.create_oval (20, 30, 120, 130);
canvas.create_oval (20, 30, 120, 130, fill='red', outline='blue', width=3)
Багатокутник. Багатокутник — це фігура, що має три і більше вершин і замкнений контур. Щоб накреслити багатокутник, потрібно указати координати всіх його вершин (рис.4):
canvas.create_polygon(х1,у1, х2, у2, …, xn, yn)
canvas.create_polygon(х1,у1, х2, у2, …, xn, yn)
За замовчуванням багатокутник зафарбовується чорним кольором. Якщо потрібно зобразити незафарбований багатокутник, потрібно додати параметри fill="" (надати параметру «заливка» порожнє значення) та outline="black" (задати чорний колір контуру).
Рис.4
Приклад:
Накреслити незафабований трикутник.
points = [10, 10, 100, 10, 100, 110]
canvas.create_polygon(points, fill="", outline="black")
points = [10, 10, 100, 10, 100, 110]
canvas.create_polygon(points, fill="", outline="black")
Дуга. Дуга — це сегмент кола. Для малювання дуги треба викликати метод create_arc, передавши йому координати вершин прямокутника, до якого вписаний еліпс, частиною якого є дуга (рис.5). Синтаксис виклику:
canvas.create_arc(х1,у1, х2, у2, start, extent, style)
де х1,у1, х2, у2 - координати вершин прямокутника; start – кут, з якого починається дуга; extent – кут розвертання дуги в градусах; style – стиль дуги.
canvas.create_arc(х1,у1, х2, у2, start, extent, style)
де х1,у1, х2, у2 - координати вершин прямокутника; start – кут, з якого починається дуга; extent – кут розвертання дуги в градусах; style – стиль дуги.
Рис.5
Зверни увагу!
Відлік кутів ведеться проти годинникової стрілки. На рис.5 зображено дві дуги, для першої параметр extent = 90, для другої – extent = 270.
Приклад:
Намалювати іншопланетянина (рис.6).
from tkinter import *
root = Tk()
canvas = Canvas(root, width=200, height=200)
canvas.pack()
canvas.create_oval (10, 10, 110, 110) #обличчя
canvas.create_oval (20, 30, 40, 80, fill="black") #ліве око
canvas.create_oval (80, 30, 100, 80,fill="black") #праве око
canvas.create_rectangle(50,110, 70, 160) #тулуб
canvas.create_line(50, 160, 40,180) #ліва кінцівка
canvas.create_line(70, 160, 80,180) #права кінцівка
canvas.create_arc(40,70,80,100,start=200,extent=160, style=ARC) #посмішка
from tkinter import *
root = Tk()
canvas = Canvas(root, width=200, height=200)
canvas.pack()
canvas.create_oval (10, 10, 110, 110) #обличчя
canvas.create_oval (20, 30, 40, 80, fill="black") #ліве око
canvas.create_oval (80, 30, 100, 80,fill="black") #праве око
canvas.create_rectangle(50,110, 70, 160) #тулуб
canvas.create_line(50, 160, 40,180) #ліва кінцівка
canvas.create_line(70, 160, 80,180) #права кінцівка
canvas.create_arc(40,70,80,100,start=200,extent=160, style=ARC) #посмішка
Рис.6
Створення кольорових зображень
Для створення кольорових малюнків слід до переліку параметрів графічних методів додати параметри fill (колір заливки) і outline (колір лінії). Можна також збільшити товщину лінії, задавши значення параметру width.
def draw_rectangle(width, height, fill_color):
x1 = randint(1,width)
y1 = randint(1,height)
x2 = x1 + randint(1,width)
y2 = y1 + randint(1,height)
canvas.create_rectangle(x1, y1, x2, y2, fill = fill_color)
Приклад:
Намалювати червоне коло з синім контуром довщиною в 3 піксели:
canvas.create_oval (20, 30, 120, 130, fill='red', outline='blue', width=3)
canvas.create_oval (20, 30, 120, 130, fill='red', outline='blue', width=3)
Приклад:
Заповнити полотно випадковими прямокутниками. Для цього підключимо модуль random і створимо функцію draw_rectangle(), яка креслить прямокутник, координатами якого є випадкові числа. Функція draw_rectangle() приймає три аргументи: найбільшу ширину (width), найбільшу висоту (height), колір прямокутника (fill_color).
Координати лівого верхнього кута x1, у1 набувають випадкових значень в діапазонах (0, width) і (0,height).
Координати правого нижнього кута x2, y2 отримуємо додаванням до відповідної координати лівого верхнього кута випадкового числа. Викликаємо метод canvas.create_rectangle (x1, y1, x2, y2), щоб накреслити прямокутник. До переліку параметрів функції create_rectangle додамо параметр fill і присвоїмо цьому параметру значення змінної fill_color. З основної програми в циклі for 30 разів викликаємо функцію draw_rectangle(). Програма заповніть полотно кольоровими прямокутниками (рис.7).
def draw_rectangle(width, height, fill_color):
x1 = randint(1,width)
y1 = randint(1,height)
x2 = x1 + randint(1,width)
y2 = y1 + randint(1,height)
canvas.create_rectangle(x1, y1, x2, y2, fill = fill_color)
c=['red', 'green', 'blue', 'yellow'] #список кольорів
for x in range(0, 30):
draw_rectangle(200, 200, c[x%4])
for x in range(0, 30):
draw_rectangle(200, 200, c[x%4])
Рис.7
Виведення зображень з графічних файлів
Для виведення на полотно зображення з графічного файлу потрібно шлях до графічного файла завантажити до змінної за допомогою функції PhotoImage (file = 'шлях до файла') і викликати метод create_image.
Формат файлів PhotoImage обмежений (підтримуються лише GIF і PNG)
Формат файлів PhotoImage обмежений (підтримуються лише GIF і PNG)
Якщо графічний файл збережено в папку програми, достатньо вказати лише назву файлу.
Приклад:
Вивести на полотно малюнок picture1.gif, який розташований на диску D:
my_image = PhotoImage(file=' d:\\picture1.gif')
canvas.create_image(0, 0, anchor=NW, image=my_image)
my_image = PhotoImage(file=' d:\\picture1.gif')
canvas.create_image(0, 0, anchor=NW, image=my_image)
Джерела:
Інформатика : підруч. для 7 кл. закл. загал. серед. освіти / [О. О. Бондаренко, В. В. Ластовецький, О. П. Пилипчук, Є. А. Шестопалов]. — Харків : Вид-во «Ранок», 2020.