Программирования Pythonпояснительная записка
Скачать 0.83 Mb.
|
Модуль tkinter. Создание графического интерфейса пользователя с помощью языка программирования Python пояснительная записка Элективный курс по информатике "Модуль tkinter. Создание графического интерфейса пользователя с помощью языка программирования Python" представляет собой вводный курс, знакомящий с особенностями программирования GUI на Python(создание виджет и обработчиков событий, связывание с событими). Место курса "Введение в объектно-ориентированное программирование на Python" в составе образовательной программы дополнительного образования детей "Лаборатория юного линуксоида" — третий год обучения. Курс рассчитан примерно на 12-15 часов. Цели и задачи курса Основной целью данного элективного курса является формирование базовых понятий построения графического интерфейса пользователя (GUI), углубление знаний обучающихся по программированию. Курс не является учебником по Python. Введение в tkinter. Урок 1 Виджеты (графические объекты) и их свойства. Часть 1. Урок 2 Виджеты (графические объекты) и их свойства. Часть 2. Урок 3 Метод bind модуля Tkinter. Урок 7 Программирование событий в Tkinter. Урок 8 Переменные Tkinter. Урок 9 Объект Меню (Menu) в GUI. Урок 10 Диалоговые окна в Tkinter. Урок 11 Геометрические примитивы графического элемента Canvas (холст) модуля Tkinter. Урок 12 Canvas (холст): методы, идентификаторы и теги. Урок 13 Особенности работы с виджетом Text модуля Tkinter. Урок 14 Введение в tkinter. Урок 1 Методическая разработка урока Элективный курс: Модуль tkinter. Создание графического интерфейса пользователя с помощью языка программирования Python Уровень: Программирование для начинающих В многообразии программ, которые пишут программисты, выделяют приложения с графическим пользовательским интерфейсом (GUI). При создании таких программ становятся важными не только алгоритмы обработки данных, но и разработка для пользователя программы удобного интерфейса, взаимодействуя с которым, он будет определять поведение приложения. Современный пользователь в основном взаимодействует с программой с помощью различных кнопок, меню, значков, вводя информацию в специальные поля, выбирая определенные значения в списках и т. д. Эти "изображения" в определенном смысле и формируют GUI, в дальнейшем мы их будем называть виджетами (от англ. widget - "штучка"). Для языка программирования Python такие виджеты включены в специальную библиотеку — tkinter. Если ее импортировать в программу (скрипт), то можно пользоваться ее компонентами, создавая графический интерфейс. Последовательность шагов при создании графического приложения имеет свои особенности. Программа должна выполнять свое основное назначение, быть удобной для пользователя, реагировать на его действия. Мы не будем вдаваться в подробности разработки, а рассмотрим какие этапы приблизительно нужно пройти при программировании, чтобы получить программу с GUI: 1. Импорт библиотеки 2. Создание главного окна 3. Создание виджет 4. Установка их свойств 5. Определение событий 6. Определение обработчиков событий 7. Расположение виджет на главном окне 8. Отображение главного окна 1. импорт модуля tkinter Как и любой модуль, tkinter в Python можно импортировать двумя способами: командами import tkinter или from tkinter import *. В дальнейшем мы будем пользоваться только вторым способом, т. к. это позволит не указывать каждый раз имя модуля при обращении к объектам, которые в нем содержатся. Следует обратить внимание, что в версии Python 3 имя модуля пишется со строчной буквы (tkinter), хотя в более ранних версиях использовалась прописная (Tkinter). Итак, первая строчка программы должна выглядеть так: 1. from tkinter import * 2. создание главного окна В современных операционных системах любое пользовательское приложение заключено в окно, которое можно назвать главным, т.к. в нем располагаются все остальные виджеты. Объект окна верхнего уровня создается при обращении к классу Tk модуля tkinter. Переменную связанную с объектом-окном принято называть root (хотя понятно, что можно назвать как угодно, но так уж принято). Вторая строчка кода: 1. root = Tk() 3. создание виджет Допустим в окне будет располагаться всего одна кнопка. Кнопка создается при обращении к классу Button модуля tkinter. Объект кнопка связывается с какой-нибудь переменной. У класса Button (как и всех остальных классов, за исключением Tk) есть обязательный параметр — объект, которому кнопка принадлежит (кнопка не может "быть ничейной"). Пока у нас есть единственное окно (root), оно и будет аргументом, передаваемым в класс при создании объекта-кнопки: 1. but = Button(root) 4. установка свойств виджет У кнопки много свойств: размер, цвет фона и надписи и др. Мы рассмотрим их на следующем уроке. Пока же установим всего одно свойство — текст надписи (text): 1. but[ "text" ] = "Печать" 5-6. определение событий и их обработчиков Многообразие событий и способов их обработки будет рассмотрено на следующих уроках. Здесь же просто коснемся данного вопроса в связи с потребностью. Что же будет делать кнопка и в какой момент она это будет делать? Предположим, что задача кнопки вывести какое-нибудь сообщение в поток вывода, используя функцию print. Делать она это будет при нажатии на нее левой кнопкой мыши. Действия (алгоритм), которые происходят при том или ином событии, могут быть достаточно сложным. Поэтому часто их оформляют в виде функции, а затем вызывают, когда они понадобятся. Пусть у нас печать на экран будет оформлена в виде функции printer: 1. def printer(event): 2. ( "Как всегда очередной 'Hello World!'" ) Не забывайте, что функцию желательно (почти обязательно) размещать в начале кода. Параметр event – это какое-либо событие. Событие нажатия левой кнопкой мыши выглядит так: . Требуется связать это событие с обработчиком (функцией printer). Для связи предназначен метод bind. Синтаксис связывания события с обработчиком выглядит так: 1. but.bind( " ,printer) 7. размещение виджет Если вы заметите, то в любом приложении виджеты не разбросаны по окну как попало, а хорошо организованы, интерфейс продуман до мелочей и обычно подчинен определенным стандартам. До стандартов нам далеко, нужно просто кнопку как-то отобразить в окне. Самый простой способ — это использование метода pack. 1. but.pack() Если не вставить эту строчку кода, то кнопка в окне так и не появится, хотя она есть в программе. 8. отображение главного окна Ну и наконец, главное окно тоже не появится, пока не будет вызван специальный метод mainloop: 1. root.mainloop() Данная строчка кода должна быть всегда в конце скрипта! В итоге, код программы может выглядеть таким образом: 1. from tkinter import * 2. 3. def printer(event): 4. ( "Как всегда очередной 'Hello World!'" ) 5. 6. root = Tk() 7. but = Button(root) 8. but[ "text" ] = "Печать" 9. but.bind( " ,printer) 10. 11. but.pack() 12. root.mainloop() При программировании графического интерфейса пользователя более эффективным оказывается объектно-ориентированный подход. Поэтому многие «вещи» оформляются в виде классов. В нашем примере также можно использовать класс: 1. from tkinter import * 2. 3. class But_print: 4. def __init__ ( self ): 5. self .but = Button(root) 6. self .but[ "text" ] = "Печать" 7. self .but.bind( " , self .printer) 8. self .but.pack() 9. def printer( self ,event): 10. ( "Как всегда очередной 'Hello World!'" ) 11. 12. root = Tk() 13. obj = But_print() 14. root.mainloop() Практическая работа: 1. Импортируйте модуль tkinter, создайте объект главного окна, примените к нему метод mainloop. Затем выполните скрипт. Что вы видите? 2. Добавьте кнопку на главное окно с помощью такой команды: but = Button(root, text="Печать") В данном случае, при создании кнопки, в класс сразу передается и значение свойства text. Это наиболее часто используемый способ установки свойств (по-сравнению с тем, который приводится в уроке: but["text"] = "Печать"). 3. Расположите виджету на главном окне с помощью метода pack. Запустите скрипт. Что вы видите? Нажмите левой кнопкой мыши на кнопку в окне. Что-нибудь происходит? 4. Создайте какую-нибудь функцию и свяжите ее с событием нажатия кнопки. 5. Снова запустите скрипт и нажмите кнопку. По идее, должно что-то произойти. Виджеты (графические объекты) и их свойства. Часть 1. Урок 2 Методическая разработка урока Элективный курс: Модуль tkinter. Создание графического интерфейса пользователя с помощью языка программирования Python Уровень: Программирование для начинающих На этом уроке мы рассмотрим часть графических объектов (виджет), содержащихся в библиотеке Tkinter: кнопки, поля для ввода, метки, флажки, переключатели и списки. Следует понимать, что графический интерфейс пользователя достаточно стандартен, и поэтому любые подобные библиотеки-модули (в том числе и Tkinter) содержат приблизительно одинаковые виджеты. Каждый класс виджет имеет определенные свойства, значения которых можно задавать при их создании, а также программировать их изменение при действии пользователя и в результате выполнения программы. Кнопки Объект-кнопка создается вызовом класса Button модуля tkinter. При этом обязательным аргументом является лишь родительский виджет (например, окно верхнего уровня). Другие свойства могут указываться при создании кнопки или задаваться (изменяться) позже. Синтаксис: переменная = Button (родит_виджет, *свойство=значение, … ….+) У кнопки много свойств, в примере ниже указаны лишь некоторые из них. 1. from tkinter import * 2. 3. root = Tk() 4. 5. but = Button(root, 6. text= "Это кнопка" , #надпись на кнопке 7. width= 30 ,height= 5 , #ширина и высота 8. bg= "white" ,fg= "blue" ) #цвет фона и надписи 9. 10. but.pack() 11. root.mainloop() bg и fg – это сокращения от background (фон) и foreground (передний план). Ширина и высота измеряются в знакоместах (количество символов). Метки Метки (или надписи) — это достаточно простые виджеты, содержащие строку (или несколько строк) текста и служащие в основном для информирования пользователя. 1. lab = Label(root, text= "Это метка! \n Из двух строк." , font= "Arial 18" ) однострочное текстовое поле Такое поле создается вызовом класса Entry модуля tkinter. В него пользователь может ввести только одну строку текста. 1. ent = Entry(root,width= 20 ,bd= 3 ) bd – это сокращение от borderwidth (ширина границы). Многострочное текстовое поле Text предназначен для предоставления пользователю возможности ввода не одной строки текста, а существенно больше. 1. tex = Text(root,width= 40 , 2. font= "Verdana 12" , 3. wrap=WORD) Последнее свойство (wrap) в зависимости от своего значения позволяет переносить текст, вводимый пользователем либо по символам, либо по словам, либо вообще не переносить, пока пользователь не нажмет Enter. радиокнопки (переключатели) Объект-радиокнопка никогда не используется по одному. Их используют группами, при этом в одной группе может быть «включена» лишь одна кнопка. 1. var=IntVar() 2. var. set ( 1 ) 3. rad0 = Radiobutton(root,text= "Первая" , 4. variable=var,value= 0 ) 5. rad1 = Radiobutton(root,text= "Вторая" , 6. variable=var,value= 1 ) 7. rad2 = Radiobutton(root,text= "Третья" , 8. variable=var,value= 2 ) Одна группа определяет значение одной переменной, т. е. если в примере будет выбрана радиокнопка rad2, то значение переменной будет var будет 2. Изначально также требуется установить значение переменной (выражение var.set(1) задает значение переменной var равное 1). Флажки Объект checkbutton предназначен для выбора не взаимоисключающих пунктов в окне (в группе можно активировать один, два или более флажков или не один). В отличие от радиокнопок, значение каждого флажка привязывается к своей переменной, значение которой определяется опциями onvalue (включено) и offvalue (выключено) в описании флажка. 1. c1 = IntVar() 2. c2 = IntVar() 3. che1 = Checkbutton(root,text= "Первый флажок" , 4. variable=c1,onvalue= 1 ,offvalue= 0 ) 5. che2 = Checkbutton(root,text= "Второй флажок" , 6. variable=c2,onvalue= 2 ,offvalue= 0 ) Списки Вызов класса Listbox создает объект, в котором пользователь может выбрать один или несколько пунктов в зависимости от значения опции selectmode. В примере ниже значение SINGLE позволяет выбирать лишь один пункт из списка. 1. r = [ 'Linux' , 'Python' , 'Tk' , 'Tkinter' ] 2. lis = Listbox(root,selectmode=SINGLE,height=4) 3. for i in r: 4. lis.insert(END,i) Изначально список (Listbox) пуст. С помощью цикла for в него добавляются пункты из списка (тип данных) r. Добавление происходит с помощью специального метода класса Listbox — insert. Данный метод принимает два параметра: куда добавить и что добавить. Большинство методов различных виджет мы рассмотрим по ходу изучения данного курса. Практическая работа Создайте два скрипта на языке программирования Python и с использованием модуля Tkinter генерирующие шаблоны представленные ниже. Виджеты (графические объекты) и их свойства. Часть 2. Урок 3 Методическая разработка урока Элективный курс: Модуль tkinter. Создание графического интерфейса пользователя с помощью языка программирования Python Уровень: Программирование для начинающих На этом уроке мы продолжим рассматривать графические объекты (виджеты), содержащихся в библиотеке Tkinter. Это будут рамка (frame), шкала (scale), полоса прокрутки (scrollbar), окно верхнего уровня (toplevel). Frame (рамка) Как выяснится позже, рамки (фреймы) хороший инструмент для организации остальных виджет в группы внутри окна, а также оформления. 1. from tkinter import * 2. 3. root = Tk() 4. 5. fra1 = Frame(root,width= 500 ,height= 100 ,bg= "darkred" ) 6. fra2 = Frame(root,width= 300 ,height= 200 ,bg= "green" ,bd= 20 ) 7. fra3 = Frame(root,width= 500 ,height= 150 ,bg= "darkblue" ) 8. 9. fra1.pack() 10. fra2.pack() 11. fra3.pack() 12. 13. root.mainloop() Данный скрипт создает три фрейма разного размера. Свойство bd (сокращение от boderwidth) определяет расстояния от края рамки до заключенных в нее виджетов (если они есть). На фреймах также можно размещать виджеты как на основном окне (root). Здесь текстовое поле находится на рамке fra2. 1. ent1 = Entry(fra2,width= 20 ) 2. ent1.pack() Scale (шкала) Назначение шкалы — это предоставление пользователю выбора какого-то значения из определенного диапазона. Внешне шкала представляет собой горизонтальную или вертикальную полосу с разметкой, по которой пользователь может передвигать движок, осуществляя тем самым выбор значения. 1. sca1 = Scale(fra3,orient=HORIZONTAL,length= 300 , 2. from_= 0 ,to= 100 ,tickinterval= 10 ,resolution= 5 ) 3. sca2 = Scale(root,orient=VERTICAL,length= 400 , 4. from_= 1 ,to= 2 ,tickinterval= 0.1 ,resolution= 0.1 ) Свойства: orient определяет направление шкалы; length – длина шкалы в пикселях; from_ и to – с какого значения шкала начинается и каким заканчивается (т. е. диапазон значений); tickinterval – интервал, через который отображаются метки для шкалы; resolution - минимальная длина отрезка, на которую пользователь может передвинуть движок. Scrollbar (полоса прокрутки) Данный виджет позволяет прокручивать содержимое другого виджета (например, текстового поля или списка). Прокрутка может быть как по горизонтали, так и по вертикали. 1. from tkinter import * 2. 3. root = Tk() 4. 5. tx = Text(root,width= 40 ,height= 3 ,font= '14' ) 6. scr = Scrollbar(root,command=tx.yview) 7. tx.configure(yscrollcommand=scr. set ) 8. 9. tx.grid(row= 0 ,column= 0 ) 10. scr.grid(row= 0 ,column= 1 ) 11. root.mainloop() В примере сначала создается текстовое поле (tx), затем полоса прокрутки (scr), которая привязывается с помощью опции command к полю tx по вертикальной оси (yview). Далее поле tx изменяется (конфигурируется) с помощью метода configure: устанавливается значение опции yscrollcommand. Здесь используется незнакомый нам пока еще метод grid, представляющий собой другой способ расположения виджет на окне. Toplevel (окно верхнего уровня) С помощью класс Toplevel создаются дочерние окна, на которых также могут располагаться виджеты. Следует отметить, что при закрытии главного окна (или родительского), окно Toplevel также закрывается. С другой стороны, закрытие дочернего окна не приводит к закрытию главного. 1. win = Toplevel(root,relief=SUNKEN,bd= 10 ,bg= "lightblue" ) 2. win.title( "Дочернее окно" ) 3. win.minsize(width= 400 ,height= 200 ) Метод title определяет заголовок окна. Метод minsize конфигурирует минимальный размер окна (есть метод maxsize, определяющий максимальный размер окна). Если значение аргументов minsize будет таким же как у maxsize, то пользователь не сможет менять размеры окна. |