Учебная страница курса биоинформатики,
год поступления 2014
Графические программы в Python
Скрипты: можно писать программку в файлике (например, myProgram.py), а потом запускать его так:
python myProgram.py
Графический интерфейс
В современных операционных системах любое пользовательское приложение графическое приложение со всеми его кнопочками, галочками и другими фитюличками (виджетами) располагается в главном окне. Для языка программирования Python такие виджеты включены в специальную библиотеку — Tkinter. Если ее импортировать в программу (скрипт), то можно пользоваться ее компонентами, создавая графический интерфейс.
Сегодня кнопочек не будет, но зато мы будем чего-нибудь рисовать.
Последовательность шагов при создании минимального графического:
- Импорт библиотеки
- Создание главного окна
- ...
- Last. Отображение главного окна
Импорт модуля tkinter
Как и любой модуль, tkinter в Python можно импортировать двумя способами: командами
или
В дальнейшем мы будем пользоваться только вторым способом, т. к. это позволит не указывать каждый раз имя модуля при обращении к объектам, которые в нем содержатся. Следует обратить внимание, что в версии Python 3 имя модуля пишется со строчной буквы (tkinter), хотя в более ранних версиях использовалась прописная (Tkinter). Итак, первая строчка программы должна выглядеть так:
1 from tkinter import Tk, Canvas
Создание главного окна
1 root = Tk() # root – корневое окошко.
Отображение главного окна
Главное окно не появится, пока не будет вызван специальный метод mainloop:
1 root.mainloop()
Данная строчка кода должна быть всегда в конце скрипта!
mainloop – основной цикл программы. В основном цикле программа периодически обращается к операционной системе по мере её выполнения, чтобы узнать не произошли ли какие-нибудь изменения, чтобы среагировать на них должным образом. Например, когда меняется размер окошка, какие-то элементы нужно растянуть (или сжать), какие-то сдвинуть.
Добавление разных графических элементов (виджетов) в окно это описывается между строчкой создания окна и mainloop:
- Импорт библиотеки
- Создание главного окна
- Создание фитюлички
- Добавление фитюлички в окно
- ...
- Last. Отображение главного окна
Сегдня мы будем рисовать шарики. Для этого нужно создать и добывить в окно холст – Canvas.
Canvas (холст) — это достаточно сложный объект библиотеки tkinter.
Он позволяет располагать на самом себе графические примитивы. Это могут быть как геометрические фигуры, узоры, вставленные изображения, так и другие виджеты (например, метки, кнопки, текстовые поля).
И это еще не все. Отображенные на холсте объекты можно изменять и перемещать (при желании) в процессе выполнения скрипта.
Учитывая все это, canvas находит широкое применение: создание рисунков, программируемая анимация и др.
Перед тем как создавать геометрические фигуры на холсте следует разобраться с координатами и единицами измерения расстояния.
Нулевая точка (0,0) для объекта Canvas располагается в верхнем левом углу.
У любой точки первое число — это расстояние от нулевого значения по оси X, второе — по оси Y.
Прямая. Стрелка.
1 canv.create_line(200,50,300,50,width=3,fill="blue")
2 #линия начинается из точки (200,50), а заканчивается в точке (300,50).Свойство fill позволяет задать цвет линии отличный от черного
3 canv.create_line(0,0,100,100,width=2,arrow="last")
4 #линия начинается в точке (0,0), заканчивается — в (100,100). arrow – установливает стрелку (в конце, начале или по обоим концам линии).
5 canv.create_line(0,0,50,20,100,100,width=2,smooth="true")
6 #линия проходит через три точки, применен алгоритм сглаживания (сплайн).
Прямоугольник.
Метод create_rectangle создает прямоугольник. Аналогично линии в скобках первыми аргументами прописываются четыре числа.
Первые две координаты обозначают верхний левый угол прямоугольника, вторые — правый нижний.
Опция outline определяет цвет границы прямоугольника.
Произвольный многоугольник.
Чтобы создать произвольный многоугольник, требуется задать пары координат для каждой его точки.
1 canv.create_polygon([250,100],[200,150],[300,150],fill="yellow")
Квадратные скобки при задании координат используются для удобочитаемости (их можно не использовать).
Овал.
При создании эллипса задаются координаты гипотетического прямоугольника, описывающего данный эллипс.
1 canv.create_oval([20,200],[150,300],fill="gray50")
Программка для рисования шарика:
1 import tkinter
2 import random
3 #from tkinter import *
4 root=tkinter.Tk()
5 canvas_size = 500
6 canv = tkinter.Canvas(root, width=canvas_size, height=canvas_size, bg="white")
7 canv.pack()
8 size = 150
9 x=100
10 y=200
11 color = "red"
12 canv.create_oval(x,y,x+size,y+size, fill=color, width=0)
13 root.mainloop()
Чтобы нарисовать несколько шариков разного цвета, нам нужен набор цветов, из которых выбирать.
Cписки, в них пишут в скобочках через запятую:
1 colors = ["red","orange","yellow","green","blue","cyan","magenta","light blue"]
Чтобы рисовать шарики в случайном месте, случайного размера и случайного цвета, нам понадобится модуль random.
Random
модуль random: в нём есть функция randint(a,b), которая возвращает равномерное распределение в диапазоне [a,b] (оба конца включены), есть функция choice(список), которая возвращает случайный элемент списка (с равными вероятностями), а ещё есть куча полезных штук типа гауссовское распределение, нормальное распределение и т.п.
Программка для рисования шариков:
1 import tkinter
2 import random
3 root=tkinter.Tk()
4 canvas_size = 500
5 colors = ["red","orange","yellow","green","blue","cyan","magenta","light blue"]
6 canv = tkinter.Canvas(root, width=canvas_size, height=canvas_size, bg="white")
7 canv.pack()
8 #создаем 10 шариков
9 for i in range(10):
10 # создаем шарик со случайным размером, координатами и цветом
11 size = random.randint(1,canvas_size/2)
12 x=random.randint(0, canvas_size-size)
13 y=random.randint(0, canvas_size-size)
14 color = random.choice(colors)
15 print(x,y,size)
16 canv.create_oval(x,y,x+size,y+size, fill=color, width=0)
17
18 root.mainloop()
Бывает полезно координаты точек хранить в списках. Программа рисует клику (полносвязный граф).
1 import tkinter
2 import random
3 import math
4 root=tkinter.Tk()
5 canvas_size = 500
6 colors = ["red","orange","yellow","green","blue","cyan","magenta","light blue"]
7 canv = tkinter.Canvas(root, width=canvas_size, height=canvas_size, bg="white")
8 canv.pack()
9 npoints = 5
10 x = []
11 y = []
12 for i in range(npoints):
13 x.append(random.randint(0, canvas_size))
14 y.append(random.randint(0, canvas_size))
15 for i in range(npoints):
16 for j in range(i + 1, npoints):
17 color = random.choice(colors)
18 canv.create_line(x[i], y[i], x[j], y[j], fill = color, width = 2)
19 root.mainloop()