Оконная графика в языке PythonДля языка Python разработано много разных модулей для программирования оконных приложений. В дистрибутиве языка Python для Windows представлен только один из них — это модуль tkinter. Он очень простой и удобный для программирования несложных приложений, что важно для начинающих программистов. Правда, можно отметить и его недостатки, которых лишены более продвинутые оконные библиотеки для Python'а — например, не реализовано сглаживание линий (antialiasing). Но мы будем использовать tkinter, поскольку только он представлен во всех дистрибутивах языка Python.
Для примера мы рассмотрим программу, которая по кликам
мыши рисует треугольник и вписанную в него окружность:
"triangle.py". Программа начинается с импорта модуля tkinter (мы импортируем все описания из него). Также мы импортируем наши собственные классы R2Vector и R2Point, которые мы используем для решения разнообразных геометрических задач на плоскости R2. Эти классы представлены в модуле R2Graph: from tkinter import * from R2Graph import * Программу мы оформим в виде функции main, которая будет вызываться при исполнении скрипта. Все описания и другие функции будут локализованы внутри функции main:
from tkinter import *
from R2Graph import *
def main():
rootWindow = Tk()
rootWindow.title("Triangle")
rootWindow.geometry("800x600")
. . .
rootWindow.mainloop()
if __name__ == "__main__":
main()
Работа функции main начинается с создания корневого окна с заголовком "Triangle" и начальным размером 800 на 600 пикселей:
rootWindow = Tk()
rootWindow.title("Triangle")
rootWindow.geometry("800x600")
В левой верхней части окна будут расположены две кнопки
"Clear" и "Draw", а ниже будет располагаться дочернее окно,
в котором происходит рисование и обработка кликов мыши.
На приведенном выше рисунке
окно рисования светло-голубого цвета.
Размещение дочерних окон — Layout ManagerУправление расположением дочерних окон в модуле tkinter может выполняться с помощью трех различных менеджеров расположения: place, pack, grid. Мы будем использовать менеждер pack, который в отличие от place позвляет корректировать расположение и размеры дочерних окон при изменении размеров окна верхнего уровня. Опуская фрагменты кода, укажем только тот код, который отвечает за создание и расположение дочерних окон. Их три: кнопки drawButton, clearButton и область рисования drawArea. Для горизонтальной группировки двух кнопок в верхней полоске окна мы создаем еще одно прозрачное окно panel типа Frame. Окно panel будет дочерним для окна верхнего уровня rootWindow, а кнопки drawButton и clearButton — дочерними для окна panel:
panel = Frame(rootWindow)
drawArea = Canvas(rootWindow, bg="lightBlue")
. . .
clearButton = Button(panel, text="Clear", command=clear)
. . .
drawButton = Button(panel, text="Draw", command=drawTriangle)
. . .
panel.pack(fill=X, padx=4, pady=4);
clearButton.pack(side=LEFT)
drawButton.pack(side=LEFT)
drawArea.pack(fill=BOTH, side=TOP, expand=True, padx=4, pady=4)
Рассмотрим подробнее команды, создающие окна. Строка
panel = Frame(rootWindow)
создает прозрачное окно типа Frame, которое нам нужно лишь
для правильного размещения кнопок, которые потом будут добавляться
внутрь окна panel как дочерние окна. Здесь единственный параметр
конструктора — это окно, которое будет родительским для
создаваемого окна, в нашем случае это rootWindow.
Команда
clearButton = Button(panel, text="Clear", command=clear)
создает кнопку clearButton с надписью "Clear".
Родительским окном для нее будет окно panel. Ключевой
параметр command задает функцию, которая будет вызываться
при нажатии на эту кнопку — это функция clear.
Аналогично создается кнопка drawButton:
drawButton = Button(panel, text="Draw", command=drawTriangle)
Отметим, что дочерние окна создаются невидимыми, они появятся на
экране только после того, как будет выполнен метод pack.
. . . |