Professional Documents
Culture Documents
Програмув ання мовою Python. Об'єктний підхід
Програмув ання мовою Python. Об'єктний підхід
Програмув
ання
Навчально-методичний посібник
мовою
Python.
Об’єктний
підхід
Кропивницький – 2021
Рекомендовано до друку методичною радою Центральноукраїнського
державного педагогічного університету імені Володимира Винниченка
(протокол № від )
Рецензенти:
Авраменко О.В. – доктор фізико-математичних наук, професор кафедри
прикладної математики, економіки та статистики ЦДПУ імені В. Винниченка
Паращук С.Д. – кандидат фізико-математичних наук, доцент кафедри
інформатики та інформаційних технологій ЦДПУ імені В. Винниченка
Передмова.......................................................................................................
Розділ І. Об'єктно-орієнтоване програмування...........................................
Тема №1. Поняття об'єктно-орієнтованого програмування. Створення
класів і об’єктів............................................................................................................
Тема №2. Методи.......................................................................................................12
Тема №3. Наслідування.............................................................................................17
Тема № 4. Поліморфізм.............................................................................................23
Тема № 5 Перезавантаження операторів, методів та функцій..............................35
Тема № 6. Абстракція та інкапсуляція.....................................................................47
Розділ ІІ. Графічний інтерфейс користувача.............................................65
Тема №7. Віджети мітка, кнопка, текстове поле....................................................65
Тема №8. Віджети перемикачі та прапорці.............................................................88
Тема №9. Віджети список, прокрутка та поле зі списком...................................102
Розділ ІІІ. Візуалізація даних....................................................................114
Тема №10. Бібліотека Matplotlib. Графіки функцій..............................................114
Тема №11. Моделювання засобами комп’ютерної графіки.................................134
Рекомендовані джерела.............................................................................144
3
Передмова
Пропонований посібник є логічним продовженням роботи
«Програмування мовою Python. Структурний підхід». Об’єктно-орієнтоване
програмування (ООП) дає можливість розв’язати задачу структурного
програмування на новому рівні, який передбачає структурування даних
методом моделювання інформаційних об’єктів. Такий підхід дає можливість
покращити процес управління програмним кодом, що є важливим при
реалізації крупних проектів.
Об’єктно-орієнтоване програмування є широко відомим підходом до
розробки комп’ютерних програм, який надає потужні засоби структурування,
повторного використання та захисту коду. Парадигма ООП спирається на
концепцію класів та об’єктів, її використовують у більшості навчальних
програм підготовки програмістів. Існує багато об’єктно-орієнтованих мов
програмування, включно із JavaScript, C ++, Java та Python.
Програмні коди, що досліджувалися в посібнику «Програмування мовою
Python. Структурний підхід», у дійсності базувалися на використанні об’єктів.
Об’єкти використовувалися в операторах, функціях, для них викликалися
методи. Але використання об’єктів було неявним. У запропонованому
посібнику розглядається створення класів та об’єктів, які в подальшому
використовуються в ієрархії наслідування. У першому розділі висвітлені
основні поняття і концепції ООП: класи, об’єкти, наслідування, поліморфізм,
перезавантаження операторів, абстракція та інкапсуляція.
У другому розділі розглядаються особливості розробки графічного
інтерфейсу користувача з точки зору об’єктного підходу. Тобто віджети
графічного модуля досліджуються як об’єкти відповідних класів.
У третьому розділі представлені можливості побудови графіків функцій та
діаграм різних типів засобами модуля matplotlib. Матеріал цього модуля може
бути використаний для самостійної роботи студентів.
До структури кожної теми входить теоретичний матеріал, практичні
індивідуальні завдання та питання для самоконтролю у тому числі з аналізом
програмного коду. Виклад теоретичних відомостей супроводжується
достатньою кількістю прикладів.
Посібник може бути корисним як студентам фізико-математичного
факультету педагогічного університету, так і всім, хто цікавиться об’єктно-
орієнтованим програмуванням та проблемами кодування комп’ютерної
графіки.
4
Розділ І. Об'єктно-орієнтоване програмування
Тема №1. Поняття об'єктно-орієнтованого програмування.
Створення класів і об’єктів
Мета: формування вмінь створення класів і об’єктів, визначення властивостей
об’єктів та атрибутів класу.
Теоретичні питання
План
1. Поняття об'єктно-орієнтованого програмування.
2. Поняття класу та об’єкта.
3. Визначення класу в Python.
4. Створення об’єктів
class Dog:
pass
Атрибути екземпляра
Кожний собака має конкретне ім’я та вік, що, очевидно, важливо знати,
коли ви починаєте фактично створювати різних собак (рис. 1.3). Пам’ятайте:
клас призначений саме для визначення Собаки, а не фактичного створення
примірників окремих собак із конкретними назвами та віком. Не всі собаки
7
мають одне ім’я, нам потрібно мати можливість присвоювати різні значення
різним екземплярам. Звідси необхідність спеціальної змінної self, яка допоможе
відстежувати окремі екземпляри кожного класу.
Атрибути класу
Атрибути екземплярів специфічні для кожного об'єкта, а атрибути класу
однакові для всіх об’єктів – у цьому випадку для всіх собак.
class Dog:
# Class Attribute
species = 'mammal'
Отже, хоча кожний собака має унікальне ім’я та вік, кожний собака буде
ссавцем.
8
4. Створення об’єктів
class Dog:
# Class Attribute
species = 'mammal'
# Is Philo a mammal?
if philo.species == "mammal":
print("{0} is a {1}!".format(philo.name,
philo.species))
class Dog:
9
# Class Attribute
species = 'mammal'
# Output
print("The oldest dog is {} years old.".format(
get_biggest_number(jake.age, doug.age, william.age)))
Практичні завдання
Завдання 1. Вибрати предметну область для створення класу відповідно до
номера прізвища в журналі:
1. транспорт; 7. дерева; 13. котячі;
2. птахи; 8. чотирикутники; 14. спортивні ігри;
3. квіти; 9. автомобілі; 15. плазуни;
4. трикутники; 10. домашні улюбленці; 16. смартфони;
5. роботи; 11. фрукти; 17. динозаври.
6. риби; 12. комп’ютерні ігри;
10
Завдання 2. Створити клас, описати метод __init __ (), в якому
ініціалізувати (вказати) три властивості (атрибути) об'єкта. Для
властивостей використати мінімум 2 типи даних, наприклад, рядковий та
цілочисловий.
Завдання 3. Створити 5 об’єктів класу. Вивести на екран значення
властивостей для кожного об’єкта.
Завдання 4. Визначити атрибут класу. Створити умовний оператор, який
перевіряє наявність цього атрибуту в одного з об’єктів класу.
Завдання 5. Створити функцію, яка визначає найменше значення
властивості (з числовим значенням) серед усіх ініціалізованих об’єктів
класу.
Контрольні запитання
1. Назвіть суть об’єктно-орієнтованого програмування.
2. Що в програмуванні називається класом?
3. Як між собою пов’язані клас та об’єкт (екземпляр класу)?
4. Для чого призначений метод __init__(), або конструктор класу? Чи є він
обов’язковим методом класу?
5. Яку мінімальну кількість параметрів повинен мати метод __init__()? Яке
призначення параметра self?
6. Як створити об’єкти класу? Як вивести на екран значення властивості
об’єкта?
7. Нехай задано клас:
class MyClass:
x = 5
class Person:
degree = "bachelor"
def __init__(self, name, surname, salary):
self.name = name
self.surname = surname
self.salary = salary
person = Person("Jane", "Doe", 12000)
11
Поясніть, для чого призначені та що зберігають наступні змінні:
Person
person
surname
self
salary
degree
class Dog:
# Class Attribute
species = 'mammal'
# instance method
def description(self):
return "{} is {} years old".format(self.name,
self.age)
# instance method
12
def speak(self, sound):
return "{} says {}".format(self.name, sound)
# instance method
def eat(self, food):
return "{} eats {}".format(self.name, food)
class Point:
""" Point class represents and manipulates x,y
coords. """
p = Point(3, 4)
q = Point(6, 3)
r = Point() # r represents the origin (0, 0)
print(p.x, q.y, r.x)
13
Змінна p посилається на об'єкт Point, який містить два атрибути. Кожен
атрибут посилається на число. Доступ до значення атрибута можна отримати,
використовуючи оператор p.x.
Додавання інших методів до класу
Створимо метод distance_from_origin для обчислення відстані від
початку координат до точки:
def distance_from_origin(self):
""" Compute my distance from the origin """
return ((self.x ** 2) + (self.y ** 2)) ** 0.5
print(p.distance_from_origin())
print(q.distance_from_origin())
print(r.distance_from_origin())
def print_point(pt):
print("({0}, {1})".format(pt.x, pt.y))
Виклик функції:
p.print_point()
q.print_point()
r.print_point()
def __str__(self):
return "({0}, {1})".format(self.x, self.y)
Виклик методу:
print(p)
Виклик функції:
m = Point.midpoint(p,q)
print(r)
Виклик методу:
m = p.halfway(q)
print(r)
або
print(Point(3, 4).halfway(Point(5, 12)))
Практичні завдання
Завдання 1. Розробити метод reflect_x у класі Point, що повертає нову
точку, яка є відображенням заданої точки відносно вісі x. Нехай
визначено клас Point:
class Point:
""" Point class represents and manipulates x,y coords.
"""
p = Point(3, 4)
15
q = Point(6, 3)
r = Point()
Контрольні запитання
1. Що в об’єктно-орієнтованому програмуванні називається методом?
2. Як викликати метод для об’єкта?
3. У чому полягають відмінності між методом класу та функцією?
4. Нехай задано клас та екземпляр класу:
class Snake:
def __init__(self, name):
self.name = name
18
2. Створення дочірніх класів та використання наслідування.
Додамо до класу Dog два дочірні класи:
print(jim.run("slowly"))
print(isinstance(jim, Dog))
print(isinstance(julie, jim))
19
Перевірка чи є julie экземпляром jim неможлива, оскільки jim є
екземпляром класу, а не самим класом. Отримується повідомлення про
помилку - TypeError.
class Dog:
... species = 'mammal'
class SomeBreed(Dog):
... pass
...
class SomeOtherBreed(Dog):
... species = 'reptile'
frank = SomeBreed()
print(frank.species)
beans = SomeOtherBreed()
print(beans.species)
Результати:
'mammal'
'reptile'
class Bulldog(Dog):
def __init__(self, name, age, weight):
super().__init__(name, age)
self.weight = weight
20
Також до класу Bulldog додамо метод welcome(), який надасть змогу
сформувати запрошення на змагання:
def welcome(self):
return "{} is {} and his weight is {} kg. \
Welcome to the competition".format(self.name, self.age,
self.weight)
print(jim.welcome())
Практичні завдання
Triangle
EquiTriangle(Triangle) RightTriangle(Triangle)
Контрольні запитання
1. Назвіть суть процесу наслідування в об’єктно-орієнтованому
програмуванні.
2. Які класи називаються батьківськими, а які дочірніми?
3. Як створити дочірній клас?
4. Для чого призначена функція isinstance()? Які її аргументи? Чи
можуть бути аргументами цієї функції два екземпляри класу?
5. Чи можуть дочірні класи замінювати атрибути та поведінку батьківського
класу?
6. Запишіть програмний код для створення класу з іменем Student, який
наслідує властивості та методи класу Person?
7. Нехай задано класи та екземпляр:
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
class Student(Person):
def __init__(self, fname, lname, year):
super().__init__(fname, lname)
self.graduationyear = year
def welcome(self):
print("Welcome", self.firstname, self.lastname,
"to the class of", self.graduationyear)
22
Поясніть:
який клас є батьківським, а який дочірнім?
для чого в класі Student використано функцію super()?
що буде виведено на екран у результаті виконання програмного коду?
чи можна застосувати метод welcome() до об’єктів класу Person?
чи можна застосувати метод printname() до об’єктів класу Student?
Тема № 4. Поліморфізм
Мета: формування вмінь створення та використання поліморфних класів.
План
1. Поняття поліморфізму в ООП.
2. Поліморфізм у Python.
3. Використання поліморфізму в класах.
2. Поліморфізм у Python
У Python багато операторів мають властивість поліморфізму.
Поліморфізм оператора додавання:
num1 = 1
num2 = 2
print(num1+num2)
Результат:
3
str1 = "Python"
str2 = "Programming"
print(str1+" "+str2)
Результат:
23
Python Programming
Той самий оператор виконує різні дії для даних різних типів.
Поліморфізм функцій:
l = [1, 2, 3, 4, 5]
length = len(l)
print(length)
s = "Python Programming"
length = len(s)
print(length)
Результати:
5
18
3
24
Це був загальний погляд на поліморфізм та його реалізацію в мові
Python. Розглянемо поліморфізм у визначених користувачем методах.
25
class Dog:
def __init__(self, name, age):
def description(self):
def speak(self, sound):
def eat(self, food):
class Dog:
def __init__(self, name, age):
def description(self):
def speak(self):
def eat(self):
def run(self):
26
print(dog.run())
Поліморфізм з функцією
Ми також можемо створити функцію, яка може приймати будь-який
об’єкт з урахуванням поліморфізму:
def in_the_park(dog):
print(dog.description())
print(dog.speak())
print(dog.eat())
…
in_the_park(jim)
in_the_park(cookie)
import math
class Circle():
def __init__(self, x = 0.0, y = 0.0, radius = 1.0):
self.x = x
self.y = y
self.radius = radius
def computeArea(self):
return math.pi * self.radius ** 2
def __str__(self):
return "Circle with coordinates {}, {} and radius
{}".format(self.x,
self.y, self.radius)
27
class Rectangle():
def __init__(self, x = 0.0, y = 0.0, width = 1.0,
height = 1.0):
self.x = x
self.y = y
self.width = width
self.height = height
def computeArea(self):
return self.width * self.height
def __str__(self):
return "Rectangle with coordinates {}, {}, \
width {} and height {}".format(self.x, self.y,
self.width, self.height )
circle1 = Circle(10,4,3)
print(circle1)
print("The circle1's area is
{:.3f}".format(circle1.computeArea()))
circle1.move(3,-1)
print(circle1)
rectangle1 = Rectangle(10,10,3,2)
print(rectangle1)
print("The rectangle1's area is
{:.3f}".format(rectangle1.computeArea()) )
rectangle1.move(2,2)
print(rectangle1)
Результати:
Застосуємо наслідування
import math
class Geometry():
def computeArea(self):
pass
def computePerimeter(self):
pass
def __str__(self):
return "Abstract class Geometry should not be
instantiated and \
derived classes should override this method!"
class Circle(Geometry):
29
super(Circle,self).__init__(x,y)
self.radius = radius
def computeArea(self):
return math.pi * self.radius ** 2
def __str__(self):
return "Circle with coordinates {}, {} and radius
{}".format(self.x,
self.y, self.radius)
class Rectangle(Geometry):
def computeArea(self):
return self.width * self.height
def __str__(self):
return "Rectangle with coordinates {}, {}, \
width {} and height {}".format(self.x, self.y,
self.width, self.height )
circle1 = Circle(10,4,3)
print(circle1)
print("The circle1's area is
{:.3f}".format(circle1.computeArea()))
circle1.move(3,-1)
print(circle1)
rectangle1 = Rectangle(10,10,3,2)
print(rectangle1)
print("The rectangle1's area is
{:.3f}".format(rectangle1.computeArea()) )
rectangle1.move(2,2)
30
print(rectangle1)
class Square(Rectangle):
def __str__(self):
return 'Square with coordinates {}, {} \
and sideLength {}'.format(self.x, self.y, self.width )
square1 = Square(5, 5, 8)
print(square1)
print("The square1's area is
{:.3f}".format(square1.computeArea()))
print("The circle1's Perimeter is
{:.3f}".format(square1.computePerimeter()))
square1.move(2,2)
print(square1)
def computeTotalArea(geometryLayer):
area = 0
for geom in geometryLayer:
area += geom.computeArea()
return area
Практичні завдання
32
Контрольні запитання
6. Назвіть суть поліморфізму в об’єктно-орієнтованому програмуванні.
7. Як проявляється поліморфізм в операторі додавання?
8. Як проявляється поліморфізм у функції len(l)?
9. Як відбувається використання поліморфізму в класах? Які класи можна
назвати поліморфними?
10.Чи можна назвати наведені класи поліморфними:
class India():
def capital(self):
print("New Delhi is the capital of India.")
def language(self):
print("Hindi is the most widely spoken language
of India.")
def type(self):
print("India is a developing country.")
class USA():
def capital(self):
print("Washington, D.C. is the capital of USA.")
def language(self):
print("English is the primary language of USA.")
def type(self):
print("USA is a developed country.")
obj_ind = India()
obj_usa = USA()
for country in (obj_ind, obj_usa):
country.capital()
country.language()
country.type()
class Bird:
def intro(self):
print("There are many types of birds.")
33
def flight(self):
print("Most of the birds can fly but some cannot.")
class Sparrow(Bird):
def flight(self):
print("Sparrows can fly.")
class Ostrich(Bird):
def flight(self):
print("Ostriches cannot fly.")
def my_birds(bird):
bird.intro()
bird.flight()
obj_bird = Bird()
obj_spr = Sparrow()
obj_ost = Ostrich()
my_birds(obj_bird)
my_birds(obj_spr)
my_birds(obj_ost)
Поясніть:
чи використовується тут наслідування?
які методи є поліморфними?
що буде виведено на екран у результаті виконання програмного коду?
34
Тема № 5 Перезавантаження операторів, методів та функцій
Мета: формування вмінь перезавантаження операторів, методів та функцій
План
1. Поняття перезавантаження в програмуванні.
2. Модель даних у Python.
3. Перезавантаження деяких функцій та методів.
4. Перезавантаження деяких операторів.
Overriding vs Overloading
Перевизначення (Overriding) методу:
Перевизначення методу – використання методу з однаковим іменем і
однаковими аргументами. Реалізується з наслідуванням. Розглядали в темі
Поліморфізм.
Перезавантаження (Overloading) методу:
Перезавантаження методу – використання методу з однаковим іменем і
різними аргументами.
Відмінність аргументів базується на кількості та типах аргументів.
Процес перезавантаження використовується в одному класі.
Сутність перезавантаження операторів полягає в тому, що один й той
самий оператор демонструє різну поведінку для об’єктів різних класів.
Перезавантаження (Overloading) – це здатність метода, функції або
оператора поводитися по-різному в залежності від параметрів, які
передаються, або операндів, на які діє оператор. Наприклад, оператори + та *
демонструють різну поведінку для об’єктів класу str та об’єктів класів int
або float:
>>> 1 + 2
3
>>> 'hello ' + 'friends'
'hello friends'
>>> 3 * 2
6
>>> 'friends' * 3
'friendsfriendsfriends'
class Arithmetic:
def add(self, a, b):
35
return a + b
def add(self, a, b, c):
return a + b + c
obj = Arithmetic()
print(obj.add(12,14))
print(obj.add(12,14,170))
Результат:
196
class Student:
def hello(self, name=None):
if name is not None:
print('Hey ' + name)
else:
print('Hey ')
class Arithmetic:
def add(self, a=None, b=None, c=None):
# When three params are passed
if a!=None and b!=None and c!=None:
s = a + b + c
return s
# When two params are passed
elif a!=None and b!=None:
s = a + b
return s
obj = Arithmetic()
print(obj.add(12,14))
print(obj.add(12,14,15))
або
class Arithmetic:
def add(self, *args):
37
print(args)
total = 0
for i in args:
print(total)
total += i
return total
obj = Arithmetic()
print(obj.add(17,18,19,20,21))
38
3. Перезавантаження деяких функцій
Перезавантаження функції len()
Кожний клас в Python визначає свою поведінку для вбудованих функцій
і методів.
Коли викликається функція len(), Python опрацьовує виклик як
obj.__len__():
Список усіх методів і функцій для об’єкта класу str можна отримати за
допомогою функції dir()
>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__',
'__dir__', '__doc__', '__eq__', 'rstrip',
…
'split', 'splitlines', 'startswith', 'strip', 'swapcase',
'title', 'translate', 'upper', 'zfill']
class Order:
def __init__(self, cart, customer):
self.cart = list(cart)
self.customer = customer
def __len__(self):
return len(self.cart)
39
order = Order(['banana', 'apple', 'mango'], 'Alice
Jones')
print(len(order))
Результат:
3
def __len__(self):
return float(len(self.cart))
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __abs__(self):
return (self.x ** 2 + self.y ** 2) ** 0.5
vector = Vector(3, 4)
print(abs(vector))
Результат:
5.0
class Vector:
def __init__(self, x, y):
40
self.x = x
self.y = y
def __str__(self):
return '{}i+{}j'.format(self.x, self.y)
vector = Vector(3, 4)
print(str(vector))
def __repr__(self):
return 'Vector({}, {})'.format(self.x, self.y)
vector = Vector(3, 4)
…
print(repr(vector))
class Order:
def __init__(self, cart, customer):
self.cart = list(cart)
self.customer = customer
def __len__(self):
return len(self.cart)
def __bool__(self):
return len(self.cart)>0
41
order1 = Order(['banana', 'apple', 'mango'], 'Alice
Jones')
order2 = Order([], 'Tom Brooks')
print(bool(order1))
print(bool(order2))
Додати
for order in [order1, order2]:
if order:
print("{}'s order is
processing...".format(order.customer))
else:
print("Empty order for customer
{}".format(order.customer))
4. Перезавантаження операторів
Здійснити перезавантаження операторів можна так само як і
перезавантаження функцій.
Перезавантаження оператора +
Оператор + можна перезавантажити за допомогою спеціального методу
__add__(). Реалізуємо можливість додавати нові товари в корзину в Order-
класі. Нехай метод __add__() повертає новий Order-об’єкт, до якого внесені
зміни:
class Order:
def __init__(self, cart, customer):
self.cart = list(cart)
self.customer = customer
Оператор +=
Оператор += є коротним варіантом для виразу obj1 = obj1 + obj2.
Спеціальним методом, що відповідає йому, є __iadd__(). Метод
__iadd__() повинен вносити зміни безпосередньо в аргумент self і
повертати результат, який може бути або не бути self. Ця поведінка сильно
відрізняється від __add__(), оскільки останній створює новий об'єкт і
повертає його, як бачимо вище.
Використання += для двох об'єктів еквівалентно таким операторам:
class Order:
def __init__(self, cart, customer):
self.cart = list(cart)
self.customer = customer
order2 += 'orange'
print(order2.cart)
order2 += 'kiwi'
43
print(order2.cart)
Практичні завдання
Контрольні запитання
1. Назвіть суть перезавантаження операторів в об’єктно-орієнтованому
програмуванні.
2. Як проявляється перезавантаження в операторі додавання?
3. У чому полягає відмінність між перевизначенням (Overriding) та
перезавантаженням (Overloading) методів?
4. Які переваги надає використання перезавантаження?
5. Якщо l – це список, то чи однаковими є оператори len(l) та
l.__len__()?
6. Чи можна сказати, що відбулося перезавантаження методу area():
class Compute:
# area method
def area(self, x = None, y = None):
elif x != None:
return x * x
44
else:
return 0
# object
obj = Compute()
# zero argument
print("Area:", obj.area())
# one argument
print("Area:", obj.area(2))
# two argument
print("Area:", obj.area(4, 5))
class Bubble:
def __init__(self, volume):
self.volume = volume
b1 = Bubble(20)
b2 = Bubble(30)
print(b1 + b2)
class Bubble:
def __init__(self, volume):
self.volume = volume
def __str__(self):
return "volume is {}".format(self.volume)
b1 = Bubble(20)
b2 = Bubble(30)
print(b1)
45
Що тепер буде виведено на екран у результаті виконання програмного
коду?
class Bubble:
def __init__(self, volume):
self.volume = volume
def __str__(self):
return "volume is {}".format(self.volume)
b1 = Bubble(20)
b2 = Bubble(30)
b3 = b1 + b2
print(b3)
Поясніть:
яку дію виконує метод __add__()?
чи відбулося перезавантаження методу __add__()?
що зберігається в змінній b3?
чи буде виведено повідомлення про помилку в результаті виконання
цього програмного коду?
46
Тема № 6. Абстракція та інкапсуляція
Мета: формування вмінь використання абстракції та інкапсуляції при
створенні програм.
План
1. Поняття абстракції.
a. абстрактні класи
b. абстрактні методи
c. абстрактні класи з імплементованими абстрактними методами
d. абстракція в Python
2. Поняття інкапсуляції.
3. Захищені (Protected) атрибути класу.
4. Закриті (Private) атрибути та методи класу.
5. Отримувачі (Getters, геттери) та установники (Setters, сеттери) в Python
1. Поняття абстракції
a. Абстрактні класи
Абстрактний клас - це клас, який містить один або кілька абстрактних
методів.
Абстрактний метод - це метод, який, як правило, описується в
батьківському класі і не реалізується. Реалізація абстрактних методів
відбувається в підкласах (дочірніх класах).
У Python абстрактний клас є похідним із мета-класу ABC, який належить
модулю abc (Abstract Base Class). Тоді
b. Абстрактні методи
Для визначення абстрактних методів в абстрактному класі необхідно
використати декоратор @abstractmethod. Цей декоратор необхідно
імпортувати з модуля abc:
class MyClass(ABC):
@abstractmethod
def mymethod(self):
pass
47
Важливо:
Абстрактний клас може містити як конкретні методи, так і абстрактні.
Абстрактний клас працює як шаблон для інших класів.
Використовуючи абстрактний клас, можна визначити узагальнену
структуру, не забезпечуючи повної реалізації кожного методу. Методи,
що забезпечують загальну функціональність для всіх дочірніх класів,
визначаються як конкретні методи в абстрактному класі. Методи,
реалізація яких може відрізнятися, визначаються як абстрактні методи.
Неможливо створити об’єкт абстрактного класу.
Як правило, абстрактні методи, визначені в абстрактному класі, не
мають операторів тіла (містять pass). Але можна мати абстрактні
методи з реалізацією в абстрактному класі. Тоді будь-який підклас, що
походить від такого абстрактного класу, все таки повинен забезпечити
реалізацію таких абстрактних методів.
Якщо якийсь абстрактний метод не реалізований дочірнім класом,
Python видає помилку.
Наприклад:
class Parent(ABC):
#common functionality
def common(self):
print('In common method of Parent')
@abstractmethod
def vary(self):
pass
class Child1(Parent):
def vary(self):
print('In vary method of Child1')
class Child2(Parent):
def vary(self):
print('In vary method of Child2')
48
# object of Child2 class
obj = Child2()
obj.common()
obj.vary()
Результати:
class Parent(ABC):
#common functionality
def common(self):
print('In common method of Parent')
@abstractmethod
def vary(self):
print('In vary method of Parent')
class Child(Parent):
pass
Результат:
class Parent(ABC):
#common functionality
def common(self):
print('In common method of Parent')
@abstractmethod
def vary(self):
print('In vary method of Parent')
class Child(Parent):
def vary(self):
print('In vary method of Child')
Результат:
d. абстракція в Python
Абстракція передбачає приховування складності та відображення лише
суттєвих ознак об’єкта. Отже, певним чином, абстракція означає
приховування реальної реалізації, а користувач знає тільки, як користуватися
результатом.
Приклади з реального життя: 1) транспортний засіб, на якому ми їдемо,
не дбаючи про принципи його функціонування; 2) телевізор, який надає нам
можливість переглядати програми, не змушуючи знати внутрішні деталі та
процеси роботи телевізора.
class Payment(ABC):
def print_slip(self, amount):
print('Purchase of amount- ', amount)
class CreditCardPayment(Payment):
def payment(self, amount):
print('Credit card payment of- ', amount)
class MobileWalletPayment(Payment):
def payment(self, amount):
print('Mobile wallet payment of- ', amount)
obj1 = CreditCardPayment()
obj1.payment(100)
obj1.print_slip(100)
print(isinstance(obj1, Payment))
print('________')
obj2 = MobileWalletPayment()
obj2.payment(200)
obj2.print_slip(200)
print(isinstance(obj2, Payment))
Результати:
51
2. Поняття інкапсуляції
Інкапсуляція – обмеження прямого доступу до складових об’єкта
(атрибутів і методів). Інкапсуляція робить деякі з компонент доступними
тільки всередині класу.
Тобто інкапсуляція реалізує ідею упаковки атрибутів і методів деякого
об’єкта в один блок. Обмеження на прямий доступ до атрибутів і методів дає
можливість запобігти випадковій зміні даних.
Інкапсуляція в Python працює на рівні угоди між програмістами про те,
які атрибути і методи є загальнодоступними, а які – внутрішніми
(приватними).
Клас є прикладом інкапсуляції (рис. 1.10):
class_basic_encapsulation_1.py
# Protected member
self._a = 2
# Calling constructor of
# Base class
Base.__init__(self)
print("Calling protected member of base class: ")
print(self._a)
obj1 = Base()
#obj2 = Derived()
class_basic_encapsulation_2.py
# Calling constructor of
# Base class
Base.__init__(self)
print("Calling private member of base class: ")
print(self.__c)
# Driver code
obj1 = Base()
print(obj1.a)
Закриті методи
Створимо клас Car, який має два методи: drive () та updateSoftware ().
Коли об’єкт буде створений, він викличе закритий (приватний) метод
__updateSoftware (). Цей метод не можна викликати для об’єкта
безпосередньо, лише з класу:
class_car_encapsulation_1.py
class Car:
def __init__(self):
self.__updateSoftware()
def drive(self):
print('driving')
def __updateSoftware(self):
print('updating software')
redcar = Car()
redcar.drive()
#redcar.__updateSoftware() not accesible from object.
Результати
updating software
driving
Закриті атрибути:
class_car_encapsulation_2.py
class Car:
54
__maxspeed = 0
__name = ""
def __init__(self):
self.__maxspeed = 200
self.__name = "Supercar"
def drive(self):
print('driving with maxspeed
{}'.format(self.__maxspeed))
redcar = Car()
redcar.drive()
redcar.__maxspeed = 10 # will not change variable
because its private
redcar.drive()
Результати
driving with maxspeed 200
driving with maxspeed 200
class_car_encapsulation_3.py
class Car:
__maxspeed = 0
__name = ""
def __init__(self):
self.__maxspeed = 200
self.__name = "Supercar"
def drive(self):
print('driving with maxspeed
{}'.format(self.__maxspeed))
def setMaxSpeed(self,speed):
self.__maxspeed = speed
55
redcar = Car()
redcar.drive()
redcar.setMaxSpeed(320)
redcar.drive()
Результати
driving with maxspeed 200
driving with maxspeed 320
# Basic class
class Basic:
# constructor
def __init__(self, var1, var2, var3):
self.var1 = var1
self._var2 = var2
self.__var3 = var3
# derived class
class Derived(Basic):
# constructor
def __init__(self, var1, var2, var3):
Basic.__init__(self, var1, var2, var3)
57
Отримувачі (Геттери) - це методи, які дають змогу отримати доступ до
приватних атрибутів із класу.
Установники (Сеттери) - це методи, які дають змогу встановити
значення приватних атрибутів у класі.
class Person:
def __init__(self, age = 0):
self._age = age
# getter method
def get_age(self):
return self._age
# setter method
def set_age(self, x):
self._age = x
ray = Person()
print(ray._age)
Результати:
21
21
58
Крок 2. Використаємо функцію property() для управління
поведінкою геттерів та сеттерів.
У Python property() - це вбудована функція, яка визначає та повертає
нове значення властивості об'єкта, має три методи: getter(), setter() та
delete():
class Person:
def __init__(self):
self._age = 0
mark = Person()
mark.age = 10
print(mark.age)
Результати:
59
# 25. Отже, age - це властивість об’єкта, яка дає можливість захистити
доступ приватної змінної.
class Person:
def __init__(self):
self._age = 0
# a setter function
@age.setter
def age(self, a):
if(a < 18):
raise ValueError("Sorry you age is below
eligibility criteria")
print("setter method called")
self._age = a
mark = Person()
mark.age = 19
print(mark.age)
Результати:
60
У наведеному вище коді рядок 15-16 діє як код перевірки, що викликає
ValueError, якщо користувач намагається ініціалізувати вік зі значенням
менше 18. Таким чином, будь-який тип перевірки може бути застосований до
функцій getter або setter.
Абстракція VS Інкапсуляція
Абстракція фокусується на роботі об’єкта, в той час як інкапсуляція
приховує особливості роботи класу.
Абстракція Інкапсуляція
Практичні завдання
61
В абстрактному класі Automobile описати абстрактні методи
start(), stop(), accelerate(), але не реалізовувати їх. У
дочірніх класах імплементувати методи start(), stop(),
accelerate(). Створити по одному об’єкту кожного класу.
Застосувати до них розроблені методи.
Урахувати, що при створенні дочірніх класів, розробнику не потрібно
шукати методи для реалізації, їх можна бачити в абстрактному класі.
Переконатися, що якщо в одному із підкласів (Truck, Car, Bus) не
реалізувати один із методів, то Python автоматично видасть
повідомлення про помилку.
class Robot:
62
Зробити усі змінні в класі Robot приватними. Спробувати
надрукувати таку змінну за межами класу.
Змінити метод move() так, щоб використовувати приватну змінну і
викликати його з основної програми. (Пам’ятайте про необхідність створення
метода, який надає доступ до move() ззовні класу).
Створити метод setter() для однієї зі змінних. Використати створений
метод, щоб змінити значення змінної.
Створити метод getter() для тієї самої змінної, що і метод setter().
Використати метод getter() для доступу та виведення на екран цієї змінної.
Контрольні запитання
1. Назвіть суть абстракції в об’єктно-орієнтованому програмуванні.
2. Які класи і методи називаються абстрактними?
3. Як реалізується абстракція в мові програмування Python?
4. Нехай задано програмний код:
class Animal(ABC):
@abstractmethod
def move(self):
pass
class Human(Animal):
def move(self):
print("I can walk and run")
class Snake(Animal):
def move(self):
print("I can crawl")
class Dog(Animal):
def move(self):
print("I can bark")
class Lion(Animal):
def move(self):
print("I can roar")
63
R = Human()
R.move()
K = Snake()
K.move()
R = Dog()
R.move()
K = Lion()
K.move()
class Snake(Animal):
pass
то чи працюватиме програма?
def __displayPrivateMembers(self):
print("Private Data Member: ", self.__var3)
def accessPrivateMembers(self):
self.__displayPrivateMembers()
64
Розділ ІІ. Графічний інтерфейс користувача
Тема №7. Віджети мітка, кнопка, текстове поле.
Мета: формування вмінь створення графічного інтерфейсу користувача з
використанням віджетів мітка, кнопка, текстове поле та технології Grid.
Теоретичні питання
План
1. Використання модуля tkinter для створення графічного інтерфейсу
користувача.
2. Віджети мітка, кнопка, текстове поле.
3. Менеджер розмітки grid.
print('''
Автомобіль проїхав половину шляху зі швидкістю v1 км/год.
Половину часу, який залишився, він їхав зі швидкістю v2
км/год,
а останню ділянку – зі швидкістю v3 км/год.
Знайти середню швидкість автомобіля на всьому шляху.
'''
)
# уведення даних
v1 = float(input('Уведіть швидкість автомобіля v1 (у км/год)
-> '))
65
v2 = float(input('Уведіть швидкість автомобіля v2 (у км/год)
-> '))
v3 = float(input('Уведіть швидкість автомобіля v3 (у км/год)
-> '))
# виведення результату
print('Середня швидкість автомобіля на всьому шляху = {:.2f}
км/год'.format(v_average)
Результат:
З використанням GUI:
window = Tk()
window.title("example_1")
window.geometry('550x400')
task = '''
Автомобіль проїхав половину шляху зі швидкістю v1 км/год.
Половину часу, який залишився, він їхав зі швидкістю v2
км/год,
а останню ділянку – зі швидкістю v3 км/год.
Знайти середню швидкість автомобіля на всьому шляху.
'''
def culc_average_speed():
v1 = float(txt_v1.get())
v2 = float(txt_v2.get())
v3 = float(txt_v3.get())
lbl_v_average.grid(row=5, column=0)
lbl_result.grid(row=5, column=1)
lbl_unit.grid(row=5, column=2, sticky=W)
def close_window():
window.destroy()
window.mainloop()
Результат:
print('''
Тіло масою 5 кг рухається горизонтально з початковою
швидкістю 1 м/с під дією сили 30 Н,
що напрямлена під кутом 60 градусів до горизонту.
Запишіть рівняння залежності переміщення від часу, якщо
коефіцієнт тертя становить 0,1.
'''
)
g = 9.8
a = (F*cos(alpha_radians) - miu*(m*g -
F*sin(alpha_radians))) / m
print('\nПрискорення a = {:.1f} м/c{}\n'.format(a,chr(178)))
# виведення таблиці
Результат:
69
З використанням GUI:
window = Tk()
window.title("example_1")
window.geometry('800x800')
task = '''
Тіло масою 5 кг рухається горизонтально з початковою
швидкістю 1 м/с
під дією сили 30 Н, що напрямлена під кутом 60 градусів
до горизонту.
Запишіть рівняння залежності переміщення від часу, якщо
коефіцієнт тертя становить 0,1.
'''
lbl_m.grid(row=2, column=0)
lbl_v0.grid(row=3, column=0)
lbl_F.grid(row=4, column=0)
lbl_alpha.grid(row=5, column=0)
lbl_miu.grid(row=6, column=0)
def create_a_table():
m = float(txt_m.get())
v0 = float(txt_v0.get())
F = float(txt_F.get())
alpha = float(txt_alpha.get())
miu = float(txt_miu.get())
g = 9.8
alpha_radians = radians(alpha)
71
a = (F*cos(alpha_radians) - miu*(m*g -
F*sin(alpha_radians))) / m
for t in range(11):
x = v0*t + (a*t**2)/2
str_result = "{:3d} | {:6.1f}".format(t,x)
lbl_result = Label(window,text= str_result,
font=("Arial Bold", 16))
lbl_result.grid(row=t+2, column=3)
def close_window():
window.destroy()
window.mainloop()
Результат:
72
При порівнянні програм та їхніх результатів можна зазначити, що при
використанні графічного інтерфейсу програмний код збільшується, але
створені форми є зручними для введення даних та отримання результатів,
надають можливість моделювати розглядувані фізичні процеси.
73
2. mainloop():
спрацьовує, коли програма готова до запуску.
mainloop() - це нескінченний цикл, який використовується для
запуску додатку, обробляє подію допоки, поки вікно не закриється.
'''
widgets are added here
'''
mainloop()
mainloop()
Результат:
label = Label(tk,
text = "Hello, Tkinter",
bg = "Gainsboro",
fg = "Brown",
font=('helvetica', 24, 'bold'),
relief="ridge",
pady=15, padx=15)
canvas.create_window(200, 75, window=label)
mainloop()
Результат:
75
Кнопка (Button) – це віджет, призначений для взаємодії. Користувач
натискає кнопку, щоб виконати дію.
Створення кнопок:
button1 = Button(tk,
text = "Quit!",
bg = "GhostWhite",
fg = "red",
font=('calibri', 14, 'bold', 'underline'),
relief="ridge",
pady=15, padx=15,
command = tk.destroy)
canvas.create_window(200, 75, window=button1)
button2 = Button(tk,
text = "Click me!",
bg = "GhostWhite",
fg = "green",
font=('calibri', 14, 'bold'),
relief="ridge",
pady=15, padx=15,
command = None)
canvas.create_window(200, 175, window=button2)
76
mainloop()
Результат:
entry = Entry(tk,
bg = "blue",
fg = "yellow",
width = 50,
font = ('calibre',10,'normal'))
canvas.create_window(200, 75, window=entry)
mainloop()
Результат:
77
Однак цікавим для віджетів Entry є не те, як їх стилізувати. Важливо, як
їх використовувати. Є три основні операції, які можна виконати за
допомогою віджетів Entry:
1. Отримання тексту за допомогою .get()
2. Видалення тексту за допомогою .delete()
3. Вставка тексту за допомогою .insert()
>>> entry.delete(0)
>>> entry.delete(0, 4)
>>> entry.delete(0, tk.END)
78
Крок 1. Створення полотна
Canvas - це полотно, на якому можна розміщувати віджети:
tk.title('Square root')
canvas = Canvas(tk, width=400, height=300, bg='light
cyan')
canvas.pack()
txt = Entry(tk)
canvas.create_window(200, 140, window=txt)
def get_square_root():
x = txt.get()
y = float(x)**0.5
str_y = '{:.2f}'.format(y)
79
Кнопка використовується для виконання функції get_square_root():
txt = Entry(tk)
canvas.create_window(200, 140, window=txt)
Кнопка:
Параметри grid:
row, column - значення рядка та стовпця для розташування віджета.
Обидва починаються з 0.
columnsnpan, rowspan – об’єднання стовпців, рядків. Віджет
займатиме декілька стовпців, рядків.
padx, pady - кількість пікселів навколо віджета для створення
зовнішніх відступів.
ipadx, ipady - створення внутрішніх відступів.
sticky - вказати значення s, n, e, w або їх комбінацію, наприклад nw, ne,
sw або se. Параметр указує, до якого боку клітинки віджет буде
прикріплений. Якщо ви використовуєте 'w' + 'e' + 'n' + 's', то віджет
заповнить клітинку. За замовчуванням – він розташовується у центрі
клітинки.
master=Tk()
81
master.title("Grid Widget")
button1=Button(master, text="Submit")
button1.grid(row=2, column=1)
mainloop()
Результат:
master.geometry("250x100")
master.config(bg="lightgrey")
82
button1=Button(master,text="B1")
button1.grid(row=1,column=0)
button2=Button(master, text="B2")
button2.grid(row=1,column=2)
button3=Button(master,text="B3")
button3.grid(row=0,column=1)
button4=Button(master,text="B4")
button4.grid(row=2,column=1)
mainloop()
button1=Button(master,text="B1")
button1.grid(row=1,column=0)
button2=Button(master, text="B2")
button2.grid(row=1,column=2)
button3=Button(master,text="B3")
button3.grid(row=0,column=1)
button4=Button(master,text="B4")
button4.grid(row=2,column=1)
mainloop()
button1=Button(master,text="B1")
button1.grid(row=1,column=1)
button2=Button(master, text="B2")
button2.grid(row=1,column=2)
button3=Button(master,text="B3")
button3.grid(row=1,column=3)
button4=Button(master,text="B4")
button4.grid(row=1,column=4)
button5=Button(master,text="B5")
button5.grid(row=1,column=5)
mainloop()
master=Tk()
master.title("Grid Widget")
84
master.config(bg="lightgrey")
mainloop()
Практичні завдання
Контрольні запитання
1. Для чого призначений інструментарій Tk GUI. Як його підключити до
Python-програми?
86
2. Чим характеризується віджет Мітка? До якого класу модуля tkinter він
належить?
3. Чим характеризується віджет Кнопка? До якого класу модуля tkinter він
належить?
4. Чим характеризується віджет Текстове поле? До якого класу модуля
tkinter він належить?
5. Які вбудовані менеджери розмітки є в модулі tkinter. Назвіть
особливості використання менеджера grid.
6. Нехай задано програмний код:
def change():
b1['text'] = "Обчислити"
b1['bg'] = '#000000'
b1['fg'] = '#ffffff'
root = Tk()
b1 = Button(text="Обчислити",
width=15, height=3)
b1.config(command=change)
b1.pack()
root.mainloop()
b1['text'] = "Обчислити"
b1[' activebackground '] = '#000000'
b1['activeforeground'] = '#ffffff'
87
Тема №8. Віджети перемикачі та прапорці
Мета: формування вмінь створення графічного інтерфейсу користувача з
використанням віджетів Checkbutton, Radiobutton.
Теоретичні питання
План
1. Віджет прапорці.
2. Віджет перемикачі
1. Віджет прапорці
var1 = IntVar()
Checkbutton(tk, text='First', variable=var1).grid(row=0,
sticky=W)
var2 = IntVar()
Checkbutton(tk, text='Second', variable=var2).grid(row=1,
sticky=W)
mainloop()
Результат:
# root
root = Tk()
root.geometry("250x150")
root.mainloop()
Результат:
89
Приклад 1. Створити програму, в результаті роботи якої користувачеві
надається можливість серед запропонованих обрати улюблений колір
(кольори). Вивести на екран назву кольору та 1, якщо користувач обрав цей
колір, 0 в протилежному випадку.
tk = Tk()
tk.title("Check the color")
tk.geometry("210x180")
def display_checked():
'''check if the checkbuttons have been toggled, and
display
a value of '1' if they are checked, '0' if not
checked'''
red = red_var.get()
yellow = yellow_var.get()
green = green_var.get()
blue = blue_var.get()
# Create label
lbl = Label(tk, text="Which colors do you like below?")
lbl.grid(row=0)
tk.mainloop()
Результат:
red: 1
yellow:0
green: 1
blue: 1
def switchState():
if cb1.get() == 1:
disp_Lb.config(text='ON')
elif cb1.get() == 0:
disp_Lb.config(text='OFF')
else:
disp_Lb.config(text='error!')
disp_Lb = Label(ws)
disp_Lb.pack()
ws.mainloop()
Результат:
def switchState():
if cb1.get() == 1:
disp_Lb.config(text='ON')
elif cb1.get() == 0:
disp_Lb.config(text='OFF')
else:
disp_Lb.config(text='error!')
92
switch_on.put(("green",), to=(0, 0, 23,23))
switch_off.put(("red",), to=(24, 0, 47, 23))
cb1 = IntVar()
Checkbutton(ws, image=switch_off, selectimage=switch_on,
onvalue=1, offvalue=0, variable=cb1,
indicatoron=False,
command=switchState).pack(padx=20, pady=10)
disp_Lb = Label(ws)
disp_Lb.pack()
ws.mainloop()
Результат:
def music():
tkinter.messagebox.showinfo(title="music",message="you
select music")
def video():
tkinter.messagebox.showinfo(title="video",message="you
select video")
def photo():
tkinter.messagebox.showinfo(title="photo",message="you
select photo")
CheckVar1 = IntVar()
CheckVar2 = IntVar()
CheckVar3 = IntVar()
Label(a, text="").pack()#space
Label(a, text="").pack()#space
a.mainloop()
2. Віджет перемикачі
var = IntVar()
Radiobutton(tk, text='First', variable=var,
value=1).grid(row=0, sticky=W)
Radiobutton(tk, text='Second', variable=var,
value=2).grid(row=1, sticky=W)
mainloop()
Результат:
# root
root = Tk()
root.geometry("250x150")
95
rdbtn1 = Radiobutton(root, text ='Radiobutton1',
variable=var1, value=1).grid(row=1, column=0)
rdbtn2 = Radiobutton(root, text ='Radiobutton2',
variable=var1, value=2).grid(row=2, column=0)
root.mainloop()
Результат:
Результат:
tk = Tk()
tk.title("Change the color")
tk.geometry("210x320")
def change_color():
97
if var.get() == 1:
lbl2['bg'] = 'red'
elif var.get() == 2:
lbl2['bg'] = 'green'
elif var.get() == 3:
lbl2['bg'] = 'blue'
var = IntVar()
var.set(0)
red = Radiobutton(tk, text="red", variable=var,
value=1).grid(row=1, sticky=W)
green = Radiobutton(tk, text="green", variable=var,
value=2).grid(row=2, sticky=W)
blue = Radiobutton(tk, text="blue", variable=var,
value=3).grid(row=3, sticky=W)
Button(tk, text="Change",
command=change_color).grid(row=5)
tk.mainloop()
Результат:
98
Практичні завдання
99
Завдання 3. Створити програму, в результаті роботи якої користувачеві
надається можливість обирати серед запропонованих імен та відповідно
до імені виводити номер телефона. Один із можливих підходів до
розв’язання завдання представлено на рисунку:
100
з’являється / зникає мітка (мітка може бути представлена у
вигляді картинки);
з’являється інформаційне вікно;
інше.
Контрольні запитання
1. Для чого призначений інструментарій Tk GUI. Як його підключити до
Python-програми?
2. Чим характеризується віджет Прапорці? До якого класу модуля tkinter
він належить?
3. Якщо прапорець встановлено, то якого значення набуває змінна, пов’язана
з параметром variable?
4. Які вбудовані менеджери розмітки є в модулі tkinter. Назвіть
особливості використання менеджера grid.
5. Для чого призначений інструментарій Tk GUI. Як його підключити до
Python-програми?
6. Чим характеризується віджет Перемикачі? До якого класу модуля
tkinter він належить?
7. Чи може властивість variable усіх кнопок однієї групи перемикачів мати
різні значення?
8. Який оператор треба використати, щоб відобразити індикатор вікна
кнопок?
9. Які вбудовані менеджери розмітки є в модулі tkinter. Назвіть
особливості використання менеджера grid.
10.Яка функція обрана у наступному коді?
101
from tkinter import *
root = Tk ()
var1 = IntVar ()
var2 = IntVar ()
ch1 = Checkbutton (root, text = 'sin(x) ', variable =
var1,
onvalue = 1, offvalue = 0)
ch2 = Checkbutton (root, text = 'cos(x)', variable = var2,
onvalue = 0, offvalue = 1)
ch1.pack ()
ch2.pack ()
root.mainloop ()
План
1. Віджет список.
2. Віджет прокрутка.
3. Віджет поле зі списком.
1. Віджет список
tk = Tk()
tk.title('Listbox_1')
tk.geometry("180x200")
lst = Listbox(tk)
102
lst.grid(row=1)
lst.insert(1, 'Python')
lst.insert(2, 'Java')
lst.insert(3, 'C++')
lst.insert(4, 'Any other')
#lst.delete(3)
tk.mainloop()
Результат:
lst1 = ttk.Listbox(tk)
AttributeError: module 'tkinter.ttk' has no attribute
'Listbox'
window = Tk()
window.title('My Window')
window.geometry('500x300')
def print_selection():
103
value = lst.get(lst.curselection())
var1.set(value)
var1 = StringVar()
l = Label(window, bg='green', fg='yellow',font=('Arial',
12),
width=10, textvariable=var1)
l.pack()
var2 = StringVar()
var2.set((1,2,3,4))
lst = Listbox(window, listvariable=var2)
list_items = [11,22,33,44]
for item in list_items:
lst.insert('end', item)
lst.insert(1, 'first')
lst.insert(2, 'second')
lst.delete(2)
lst.pack()
window.mainloop()
Результат:
104
Метод curselection() повертає кортеж індексів вибраних елементів.
2. Віджет прокрутка
tk = Tk()
tk.title('Scrollbar_1')
tk.geometry("200x180")
lst = Listbox(tk)
lst.grid(row=0, column=0)
mainloop()
Результат:
105
Приклад 2. Створити програму, в результаті роботи якої користувачеві
надається можливість додавати та видаляти елементи до списку мов
програмування.
tk = Tk()
tk.title("Program lang Add Delete")
# наповнення списку
languages = ["Python", "JavaScript", "C#", "Java", "C/C+
+", "Swift",
"PHP", "Visual Basic.NET", "F#", "Ruby",
"Rust", "R", "Go",
"T-SQL", "PL-SQL", "Typescript"]
mainloop()
Результат:
# label
ttk.Label(window, text = "Select the Month :",
107
font = ("Times New Roman", 10)).grid(column = 0,
row = 5, padx = 10, pady = 25)
# Combobox creation
n = StringVar()
monthchoosen = ttk.Combobox(window, width = 27,
textvariable = n)
monthchoosen.grid(column = 1, row = 5)
monthchoosen.current()
#monthchoosen.current(2)
window.mainloop()
Результат:
108
Щоб при запуску програми ініціалізувати один із елементів списку,
необхідно використати monthchoosen.current(2) (буде ініціалізовано
елемент February). Спроба створити віджет Combobox без розширення ttk
модуля tkinter призвела до отримання повідомлення про помилку:
def callback():
l2.configure(text=country.get())
# Set label
ttk.Label(window, text = "Select the Country :",
font = ("Times New Roman", 12)).grid(column = 0,
row = 5, padx = 5, pady = 25)
# Create Combobox
n = StringVar()
country = ttk.Combobox(window, width=27, textvariable=n)
109
' Malaysia',
' Italy',
' Turkey',
' Canada')
country.grid(column = 1, row = 5)
country.current()
btn=Button(window,text="Click Here",command=callback)
btn.grid(column=1, row=6)
window.mainloop()
Результат:
Практичні завдання
110
Примітка. Для отримання поточного часу необхідно скористатися методом
datetime модуля datetime та методом sleep модуля time. Детальніше за
адресою https://www.programiz.com/python-programming/datetime/current-time
111
Завдання 4. Розробити програму, в результаті роботи якої створюється
облікова картка особи. Особа може бути
постійним покупцем,
споживачем послуг,
співробітником установи,
власником транспортного засобу,
водієм,
інше.
Контрольні запитання
1. Для чого призначений інструментарій Tk GUI. Як його підключити до
Python-програми?
2. Чим характеризується віджети Список, Прокрутка, Поле зі списком? До
якого класу модуля tkinter вони належать?
3. Для чого призначений метод curselection()?
4. Чи можна використати віджет Поле зі списком без підключення
розширення ttk модуля tkinter?
5. Які вбудовані менеджери розмітки є в модулі tkinter. Назвіть
особливості використання менеджера grid.
6. Яке призначення кнопки у наступному коді?
7. Які необхідно внести зміни у наступний код, щоб була можливість вибору
довільної кількості елементів списку?
SINGLE)
list1 = ["Київ","Харків","Одеса","Львів","Кропивницький"]
for i in list1:
listbox1.insert (END, i)
listbox1.pack ()
tk.mainloop ()
113
Розділ ІІІ. Візуалізація даних
Тема №10. Бібліотека Matplotlib. Графіки функцій
Мета: формування вмінь створення графіків функцій засобами бібліотеки
Matplotlib.
Теоретичні питання
План
1. Загальні поняття
2. Побудова кількох графіків на одному рисунку (полотні)
1. Загальні поняття
114
Рис. 3.1. Об’єкт Рисунок (Figure)
# створення заголовку
plt.title("The First Plot")
plt.show()
115
Результат:
…
import numpy as np
Результат:
116
З аргументами X та Y можна передавати необов’язковий третій аргумент
у вигляді рядка, який вказує колір та тип лінії графіка. Формат за
замовченням є b-, що означає суцільну синю лінію. Використаємо go, що
означає зелені кола:
plt.plot([1,2,3,4],[1,4,9,16], "go")
Результат:
…
# визначення значень x, y та побудова графіка
x = np.arange(1,5)
y = x**3
plt.plot([1,2,3,4],[1,4,9,16], x,y, marker = "^")
…
Результат:
118
Можна визначити межі для осей:
…
# визначення значень x, y та побудова графіка
x = np.arange(1,5)
y = x**3
plt.plot([1,2,3,4],[1,4,9,16], x,y, marker = "^")
plt.axis([0, 6, 0, 70])
…
Результат:
119
Приклад 2. Розглянемо ще один підхід до побудови декількох кривих в
одному графіку:
# створення легенди
120
plt.legend(loc='best')
plt.show()
Результат:
# створення легенди
plt.legend(loc='best')
# створення сітки
plt.grid()
plt.show()
Результат:
121
Форматування сітки здійснюється, наприклад, так:
import numpy as np
import matplotlib.pyplot as plt
N = 8
y = np.zeros(N)
plt.plot(x1, y, 'o')
plt.plot(x2, y + 0.5, 'o')
122
plt.ylim([-0.5, 1])
plt.show()
import numpy as np
import matplotlib.pyplot as plt
plt.show()
123
Результат:
plt.subplot(1,2,1)
plt.plot([1,2,3,4],[1,4,9,16],"go")
plt.title("1st Subplot")
plt.subplot(1,2,2)
x = np.arange(1,5)
y = x**3
plt.plot(x,y, "r^")
plt.title("2nd Subplot")
plt.suptitle("My Sub-plots")
124
plt.show()
…
plt.subplot(2,1,1)
plt.plot([1,2,3,4],[1,4,9,16],"go")
plt.title("1st Subplot")
plt.subplot(2,1,2)
x = np.arange(1,5)
y = x**3
plt.plot(x,y, "r^")
plt.title("2nd Subplot")
…
Результат:
125
Більш зручним є використання методу subpltots(). Цей метод приймає
два аргументи nrow і ncols як кількість рядків і кількість стовпців відповідно,
створює два об'єкти: фігура та осі (системи координат), які зберігаються у
змінних fig та ax, які можна використовувати для зміни атрибутів рівня
фігури та осей відповідно. Зверніть увагу, що ці імена змінних вибирані
довільно:
x = np.arange(1,5)
y = x**3
plt.suptitle("My Sub-plots")
plt.show()
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax_1 = fig.add_subplot(2, 1, 1)
ax_2 = fig.add_subplot(2, 2, 3)
ax_3 = fig.add_subplot(2, 2, 4)
ax_1.plot(x, y)
ax_1.grid(axis = 'x')
ax_1.set_title('axis = "x"')
ax_2.plot(x, y)
ax_2.grid(axis = 'y')
ax_2.set_title('axis = "y"')
ax_3.plot(x, y)
ax_3.grid(axis = 'both')
ax_3.set_title('axis = "both"')
fig.set_figwidth(12)
fig.set_figheight(12)
plt.show()
Результат:
128
Практичні завдання
Варіант
2
y 1= x +1
5
y 1=|x| 2
y 2= x +2
5
1. y 2=| x|+1 x[-4, 5] 2. x [0, 5]
2
y 3=¿ 2 x∨¿ y 4 =|2 x|+ 1 y 3= x +3
5
2
y 4 = x+ 4
5
129
2
y 1=2 x y 1= x
3
x+1
y 2=2 y 2 =4
3. x x[-5, 2] 4. y 3=−3 x +22 x [2.5, 9.5]
y 3=−2
y 4 =−2
x−1 −2
y4 = x+ 8
3
2
y 1= x +1
y 1=2 x 2 5
2
y 2=x −2
y 2= x +2
1 2 5
5. y3= x x[-4, 5] 6. 2 x [-5, 5]
2 y 3= x +3
1
2 5
y4= x −2
3 y4= x+ 4
5
2
3
y 1=x +2 y 1= x
3
y 2=x 3+1 y 2=3 x−14
7. x[-4, 5] 8. y 3=−3 x +22 x [2.5, 9.5]
y 3=x 3
y 4 =x 3−1 −2
y4 = x+ 8
3
y 1=|x|
y 1=¿ 2 x−1∨¿ y 2=2 x−1 y 2=|x−3|
11. x[-4, 4] 12. x[-5, 5]
¿ y 3=−|x −3|
y 4 =−|x−3|+1
y 1=x 2
y 1=2 x−2 y 2=x
3
130
Завдання 4. Побудувати графік функції f(x) згідно варіанту. Знайти
екстремуми функції. Додати до графіка кольорову стрілку, яка буде
вказувати на екстремуми функції.
№ варіанту
№ варіанту
5. 2
f ( x )=2 x −4 x+5 6. f ( x )=6−x −12 x
2
7. f ( x )=4+ 8 x −2 x
2 8. 1 2
f ( x )= x −2 x
4
9. 2
f ( x )=x ( x−4)
2 10. 4
f ( x )=x −2 x −3
2
11. 2
f ( x )=x +6 x−7 12. 2
f ( x )=x +6 x +8
13. 2
f ( x )=x −2 x +3 14. 2
f ( x )=−x +6 x−1
131
Завдання 5. Додати до графіку завдання 4 напис plt.title згідно
варіанту:
2)
1) 3)
4) 6)
5)
7) 8)
9)
132
13) 14)
Контрольні запитання
1. Для чого необхідна бібліотека matplotlib?
2. Які засоби містить бібліотека matplotlib?
3. Які графіки можна побудувати за допомогою бібліотеки matplotlib?
4. Як побудувати графіки з однією і декількома кривими?
5. Якого стилю і кольору буде графік у3?
133
134
Тема №11. Моделювання засобами комп’ютерної графіки
Мета: формування вмінь побудови математичних та комп’ютерних моделей
та створення діаграм засобами бібліотеки Matplotlib.
Теоретичні питання
План
1. Побудова стовпчастих діаграм
2. Побудова кругових діаграм
3. Побудова графіків розсіювання
city=['Delhi','Beijing','Washington','Tokyo','Kyiv']
pos = np.arange(len(city))
Happiness_Index=[60,40,70,65,50]
plt.bar(pos,Happiness_Index,color='blue',edgecolor='black'
)
plt.xticks(pos, city)
plt.xlabel('City', fontsize=16)
plt.ylabel('Happiness_Index', fontsize=16)
plt.title('Barchart - Happiness index across
cities',fontsize=20)
plt.show()
135
Результат:
Горизонтальна гістограма
Використати
plt.barh(pos,Happiness_Index,color='blue',edgecolor='black')
city=['Delhi','Beijing','Washington','Tokyo','Kyiv']
Gender=['Male','Female']
pos = np.arange(len(city))
Happiness_Index_Male=[60,40,70,65,45]
Happiness_Index_Female=[30,60,70,55,55]
plt.bar(pos,Happiness_Index_Male,color='blue',edgecolor='b
lack')
136
plt.bar(pos,Happiness_Index_Female,color='pink',edgecolor=
'black',
bottom=Happiness_Index_Male)
plt.xticks(pos, city)
plt.xlabel('City', fontsize=16)
plt.ylabel('Happiness_Index', fontsize=16)
plt.title('Stacked Barchart - Happiness index across
cities',fontsize=18)
plt.legend(Gender,loc=2)
plt.show()
Результат:
…
plt.bar(pos,Happiness_Index_Male,bar_width,color='blue',ed
gecolor='black')
plt.bar(pos+bar_width,Happiness_Index_Female,bar_width,col
or='pink',
137
edgecolor='black')
…
Результат:
Результат:
139
3. Побудова графіків розсіювання
weight1=[63.3,57,64.3,63,71,61.8,62.9,65.6,64.8,63.1,68.3
,69.7,65.4,66.3,60.7]
height1=[156.3,100.7,114.8,156.3,237.1,123.9,151.8,164.7,
105.4,136.1,175.2,137.4,164.2,151,124.3]
plt.scatter(weight1,height1,c='b',marker='o')
plt.xlabel('weight', fontsize=16)
plt.ylabel('height', fontsize=16)
plt.title('scatter plot - height vs weight',fontsize=20)
plt.show()
Результат:
140
Графік розсіювання з групуванням:
weight1=[57,58.2,58.6,59.6,59.8,60.2,60.5,60.6,60.7,61.3,
61.3,61.4,61.8,61.9,62.3]
height1=[100.7,195.6,94.3,127.1,111.7,159.7,135,149.9,124
.3,112.9,176.7,110.2,123.9,161.9,107.8]
weight2=[62.9,63,63.1,63.2,63.3,63.4,63.4,63.4,63.5,63.6,
63.7,64.1,64.3,64.3,64.7,64.8,65]
height2=[151.8,156.3,136.1,124.2,156.3,130,181.2,255.9,16
3.1,123.1,119.5,179.9,114.8,174.1,108.8,105.4,141.4]
weight3=[69.2,69.2,69.4,69.7,70,70.3,70.8,71,71.1,71.7,71
.9,72.4,73,73.1,76.2]
height3=[166.8,172.9,193.8,137.4,162.4,137.1,169.1,237.1,
189.1,179.3,174.8,213.3,198,191.1,220.6]
weight=np.concatenate((weight1,weight2,weight3))
141
height=np.concatenate((height1,height2,height3))
plt.xlabel('weight', fontsize=16)
plt.ylabel('height', fontsize=16)
plt.title('grouped scatter plot - height vs
weight',fontsize=20)
plt.show()
Результат:
Практичні завдання
143
Завдання 3. Визначити у відсотковому співвідношенні кількість студентів,
що навчаються на кожній із спеціальностей вказаного варіанту курсу і
факультету ЦДПУ ім. В.Винниченка, подати результати у вигляді
кругової діаграми:
1) І курс фізико-математичного факультету,
2) ІІ курс фізико-математичного факультету,
3) ІІІ курс фізико-математичного факультету,
4) ІV курс фізико-математичного факультету,
5) І курс природничо-географічного факультету,
6) ІІ курс мистецького факультету,
7) І курс факультету психології та педагогіки,
8) ІІ курс факультету психології та педагогіки,
9) ІІІ курс природничо-географічного факультету,
10) ІV курс факультету психології та педагогіки,
11) І курс факультету фізичного виховання,
12) І курс факультету іноземних мов,
13) І курс факультету історії та права,
14) І курс факультету філології та журналістики.
Контрольні запитання
144
Рекомендовані джерела
145