Kodomo

Пользователь

Учебная страница курса биоинформатики,
год поступления 2014

Графические программы в Python

Скрипты: можно писать программку в файлике (например, myProgram.py), а потом запускать его так:

python myProgram.py

Графический интерфейс

В современных операционных системах любое пользовательское приложение графическое приложение со всеми его кнопочками, галочками и другими фитюличками (виджетами) располагается в главном окне. Для языка программирования Python такие виджеты включены в специальную библиотеку — Tkinter. Если ее импортировать в программу (скрипт), то можно пользоваться ее компонентами, создавая графический интерфейс.

Сегодня кнопочек не будет, но зато мы будем чего-нибудь рисовать.

Последовательность шагов при создании минимального графического:

  1. Импорт библиотеки
  2. Создание главного окна
  3. ...
  4. Last. Отображение главного окна

Импорт модуля tkinter

Как и любой модуль, tkinter в Python можно импортировать двумя способами: командами

   1 import tkinter
   2 # и можем пользоваться из этого модуля tkinter.Tk() и tkinter.Canvas() под такими именами

или

   1 from tkinter import Tk, Canvas
   2 # и можем пользоваться из этого модуля tkinter.Tk() под именем Tk() и аналогично Canvas()

В дальнейшем мы будем пользоваться только вторым способом, т. к. это позволит не указывать каждый раз имя модуля при обращении к объектам, которые в нем содержатся. Следует обратить внимание, что в версии Python 3 имя модуля пишется со строчной буквы (tkinter), хотя в более ранних версиях использовалась прописная (Tkinter). Итак, первая строчка программы должна выглядеть так:

   1 from tkinter import Tk, Canvas

Создание главного окна

   1 root = Tk() # root – корневое окошко.

Отображение главного окна

Главное окно не появится, пока не будет вызван специальный метод mainloop:

   1 root.mainloop()

Данная строчка кода должна быть всегда в конце скрипта!

mainloop – основной цикл программы. В основном цикле программа периодически обращается к операционной системе по мере её выполнения, чтобы узнать не произошли ли какие-нибудь изменения, чтобы среагировать на них должным образом. Например, когда меняется размер окошка, какие-то элементы нужно растянуть (или сжать), какие-то сдвинуть.

Добавление разных графических элементов (виджетов) в окно это описывается между строчкой создания окна и mainloop:

  1. Импорт библиотеки
  2. Создание главного окна
  3. Создание фитюлички
  4. Добавление фитюлички в окно
  5. ...
  6. Last. Отображение главного окна

Сегдня мы будем рисовать шарики. Для этого нужно создать и добывить в окно холст – Canvas.

Canvas (холст) — это достаточно сложный объект библиотеки tkinter.

Он позволяет располагать на самом себе графические примитивы. Это могут быть как геометрические фигуры, узоры, вставленные изображения, так и другие виджеты (например, метки, кнопки, текстовые поля).

И это еще не все. Отображенные на холсте объекты можно изменять и перемещать (при желании) в процессе выполнения скрипта.

Учитывая все это, canvas находит широкое применение: создание рисунков, программируемая анимация и др.

Перед тем как создавать геометрические фигуры на холсте следует разобраться с координатами и единицами измерения расстояния.

Нулевая точка (0,0) для объекта Canvas располагается в верхнем левом углу.

У любой точки первое число — это расстояние от нулевого значения по оси X, второе — по оси Y.

   1 canv = Canvas(root, width=500,height=500,bg="lightblue", cursor="pencil") #создаём объект-холст
   2 canv.pack() #разместим на главном окне

Прямая. Стрелка.

   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 создает прямоугольник. Аналогично линии в скобках первыми аргументами прописываются четыре числа.

Первые две координаты обозначают верхний левый угол прямоугольника, вторые — правый нижний.

   1 x = 75
   2 y = 110
   3 canv.create_rectangle(x,y,x+80,y+50,fill="white",outline="blue",width=2)

Опция 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 random.random() # возвращает случайное число из интервала [0.0, 1.0).
   2 random.randint(a, b) # возвращает случайное целое число из интервала [a, b].
   3 random.choice(["a","b","c"]) # возвращает случайный элемент из данного списка.

Программка для рисования шариков:

   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()