Программирования Pythonпояснительная записка
Скачать 0.83 Mb.
|
практическая работа 1. Создайте два скрипта на языке программирования Python и с использованием модуля Tkinter генерирующие шаблоны представленные ниже. 2. Создайте приложение, состоящее из главного и двух дочерних окон. На каждом из трех окон должны располагаться один или два любых графических объекта. Метод bind модуля Tkinter. Урок 7 Методическая разработка урока Элективный курс: Модуль tkinter. Создание графического интерфейса пользователя с помощью языка программирования Python Уровень: Программирование для начинающих Приложения с графическим интерфейсом пользователя (GUI) должны не просто красиво отображаться на экране, но и выполнять какие-либо действия, реализуя тем самым потребности пользователя. На прошлых уроках было рассказано как создать GUI, на этом уроке рассмотрим как добавить ему функциональность, т.е возможность совершать с его помощью те или иные действия. В отличие от консольных приложений, которые обычно выполняются при минимальных внешних воздействиях, графическое приложение обычно ждет каких-либо внешних воздействий (щелчков кнопкой мыши, нажатий клавиш на клавиатуре, изменения виджетов) и затем выполняет заложенное программистом действие. Из такого принципа работы можно вывести следующую схему настройки функциональности GUI: на виджет что-то «влияет» из вне → выполняется какая-то функция (действие). Внешнее воздействие на графический компонент называется событием. Событий достаточно много (основной их перечень мы рассмотрим на следующем занятии). На этом занятии будем использовать лишь два вида событий: щелчок левой кнопкой мыши () и нажатие клавиши Enter (). Одним из способов связывания виджета, события и функции (того, что должно происходить после события) является использование метода bind. Синтаксис связывания представлен на рисунке ниже. Рассмотрим различные примеры добавления функциональности GUI. Пример 1. 1. def output(event): 2. s = ent.get() 3. if s == "1" : 4. tex.delete( 1.0 ,END) 5. tex.insert(END, "Обслуживание клиентов на втором этаже" ) 6. elif s == "2" : 7. tex.delete( 1.0 ,END) 8. tex.insert(END, "Пластиковые карты выдают в соседнем здании" ) 9. else : 10. tex.delete( 1.0 ,END) 11. tex.insert(END, "Введите 1 или 2 в поле слева" ) 12. 13. from tkinter import * 14. root = Tk() 15. 16. ent = Entry(root,width= 1 ) 17. but = Button(root,text= "Вывести" ) 18. tex = Text(root,width= 20 ,height= 3 ,font= "12" ,wrap=WORD) 19. 20. ent.grid(row= 0 ,column= 0 ,padx= 20 ) 21. but.grid(row= 0 ,column= 1 ) 22. tex.grid(row= 0 ,column= 2 ,padx= 20 ,pady= 10 ) 23. 24. but.bind( " ,output) 25. 26. root.mainloop() Рассмотрим код, начиная с 16-й строки. В строках 16-18 создаются три виджета: однострочное текстовое поле, кнопка и многострочное текстовое поле. В первое поле пользователь должен что-то ввести, затем нажать кнопку и получить ответ во втором поле. В строках 20-22 используется менеджер grid для размещения виджетов. Свойства padx и pady определяют количество пикселей от виджета до края рамки (или ячейки) по осям x и y соответственно. В стоке 24 как раз и происходит связывание кнопки с событием нажатия левой кнопки мыши и функцией output. Все эти три компонента (виджет, событие и функция) связываются с помощью метода bind. В данном случае, при нажатии левой кнопкой мыши по кнопке but будет вызвана функция output. Итак, если вдруг пользователь щелкнет левой кнопкой мыши по кнопке, то выполнится функция output (ни в каком другом случае она выполняться не будет). Данная функция (строки 1-11) выводит информацию во второе текстовое поле. Какую именно информацию, зависит от того, что пользователь ввел в первое текстовое поле. В качестве аргумента функции передается событие (в данном случае ). Внутри веток if-elif-else используются методы delete и insert. Первый из них удаляет символы из текстового поля, второй — вставляет. 1.0 — обозначает первую строку, первый символ (нумерация символов начинается с нуля). Пример 2. 1. li = [ "red" , "green" ] 2. def color(event): 3. fra.configure(bg=li[0]) 4. li[0],li[1] = li[1],li[0] 5. 6. def outgo(event): 7. root.destroy() 8. 9. from tkinter import * 10. root = Tk() 11. 12. fra = Frame(root,width= 100 ,height= 100 ) 13. but = Button(root,text= "Выход" ) 14. 15. fra.pack() 16. but.pack() 17. 18. root.bind( " ,color) 19. but.bind( " ,outgo) 20. 21. root.mainloop() Здесь создаются два виджета (строки 12, 13): фрейм и кнопка. Приложение реагирует на два события: нажатие клавиши Enter в пределах главного окна (строка 18) и нажатие левой кнопкой мыши по кнопке but (строка 19). В первом случае вызывается функция color, во втором — outgo. Функция color изменяет цвет фона (bg) фрейма (fra) с помощью метода configure, который предназначен для изменения значения свойств виджетов в процессе выполнения скрипта. В качестве значения опции bg подставляется первый элемент списка. Затем в списке два элемента меняются местами, чтобы при следующем нажатии Enter цвет фрейма снова изменился. В функции outgo вызывается метод destroy по отношению к главному окну. Данный метод предназначен для «разрушения» виджета (окно закроется). практическая работа 1. Создайте приложение, в котором меняется размер фрейма в зависимости от того, какая из трех объектов-кнопок была нажата. 2. Напишите скрипт, генерирующий окно с меткой и текстовым полем. После ввода пользователем текста в поле и нажатия Enter, введенный текст должен отображаться в метке. Программирование событий в Tkinter. Урок 8 Методическая разработка урока Элективный курс: Модуль tkinter. Создание графического интерфейса пользователя с помощью языка программирования Python Уровень: Программирование для начинающих Обычно, чтобы графическое приложение что-то сделало, должно случиться какое-нибудь событие, т. е. воздействие на GUI из вне. Типы событий Можно выделить три основных типа событий: производимые мышью, нажатиями клавиш на клавиатуре, а также события, возникающие в результате изменения других графических объектов. Способ записи При вызове метода bind событие передается в качестве первого аргумента. Название события заключается в кавычки, а также в знаки < и >. Событие описывается с помощью зарезервированных последовательностей ключевых слов. События, производимые мышью и т. д. Пример: 1. from tkinter import * 2. def b1(event): 3. root.title( "Левая кнопка мыши" ) 4. def b3(event): 5. root.title( "Правая кнопка мыши" ) 6. def move(event): 7. root.title( "Движение мышью" ) 8. 9. root = Tk() 10. root.minsize(width = 500 , height= 400 ) 11. 12. root.bind( ' ,b1) 13. root.bind( ' ,b3) 14. root.bind( ' ,move) 15. 16. root.mainloop() В этой программе меняется надпись в заголовке главного окна в зависимости от того двигается мышь, щелкают левой или правой кнопкой мыши. События, производимые с помощью клавиатуры Буквенные клавиши можно записывать без угловых скобок (например, 'L'). Для неалфавитных клавиш существуют специальные зарезервированные слова * * * и т. д. Сочетания клавиш пишутся через тире. Например: * 1. from tkinter import * 2. 3. def exit_(event): 4. root.destroy() 5. def caption(event): 6. t = ent.get() 7. lbl.configure(text = t) 8. 9. root = Tk() 10. 11. ent = Entry(root, width = 40 ) 12. lbl = Label(root, width = 80 ) 13. 14. ent.pack() 15. lbl.pack() 16. 17. ent.bind( ' ,caption) 18. root.bind( ' ,exit_) 19. 20. root.mainloop() При нажатии клавиши Enter в пределах текстовой строки (ent) вызывается функция caption, которая помещает символы из текстовой строки (ent) в метку (lbl). Нажатие комбинации клавиш Ctrl + z приводит к закрытию главного окна. практическая работа 1. Напишите следующую программу. На главном окне находится несколько флажков и текстовое поле. При щелчке левой кнопкой мыши в пределах текстового поля в нем должны отображаться значения включенных флажки (появляться сообщение о том, какие флажки включены), при щелчке правой кнопкой мыши — значения выключенных флажков. 2. Напишите скрипт, генерирующий в окне два текстовых поля и рамку. Размер рамки можно менять с помощью вводимых значений в текстовые поля (определяют длину и ширину) и нажатии клавиши пробел на клавиатуре. Переменные Tkinter. Урок 9 Методическая разработка урока Элективный курс: Модуль tkinter. Создание графического интерфейса пользователя с помощью языка программирования Python Уровень: Программирование для начинающих Библиотека Tkinter содержит специальные классы, объекты которых выполняют роль переменных для хранения значений о состоянии различных виджет. Изменение значения такой переменной ведет к изменению и свойства виджета, и наоборот: изменение свойства виджета изменяет значение ассоциированной переменной. Существует несколько таких классов Tkinter, предназначенных для обработки данных разных типов. 1. StringVar() - для строк; 2. IntVar() - целых чисел; 3. DoubleVar() - дробных чисел; 4. BooleanVar() - для обработки булевых значений (true и false). Пример 1. Во втором уроке мы уже использовали переменную-объект типа IntVar() при создании группы радиокнопок: 1. var=IntVar() 2. var. set ( 1 ) 3. rad0 = Radiobutton(root,text= "Первая" ,variable=var,value= 0 ) 4. rad1 = Radiobutton(root,text= "Вторая" ,variable=var,value= 1 ) 5. rad2 = Radiobutton(root,text= "Третья" ,variable=var,value= 2 ) Здесь создается объект класса IntVar и связывается с переменной var. С помощью метода set устанавливается начальное значение, равное 1. Три радиокнопки относятся к одной группе: об этом свидетельствует одинаковое значение опции (свойства) variable. Variable предназначена для связывания переменной Tkinter с радиокнопкой. Опция value определяет значение, которое будет передано переменной, если данная кнопка будет в состоянии "включено". Если в процессе выполнения скрипта значение переменной var будет изменено, то это отразится на группе кнопок. Например, это делается во второй строчке кода: включена кнопка rad1. Если метод set позволяет устанавливать значения переменных, то метод get, наоборот, позволяет получать (узнавать) значения для последующего их использования. 1. def display(event): 2. v = var.get() 3. if v == 0: 4. ( "Включена первая кнопка" ) 5. elif v == 1: 6. ( "Включена вторая кнопка" ) 7. elif v == 2: 8. ( "Включена третья кнопка" ) 9. 10. but = Button(root,text= "Получить значение" ) 11. but.bind( ' ,display) При вызове функции display в переменную v ―записывается― значение, связанное в текущий момент с переменной var. Чтобы получить значение переменной var, используется метод get (вторая строчка кода). Пример 2. Несколько сложнее обстоит дело с флажками. Поскольку состояния флажков независимы друг друга, то для каждого должна быть введена собственная ассоциированная переменная-объект. 1. from tkinter import * 2. 3. root = Tk() 4. 5. var0=StringVar() # значение каждого флажка ... 6. var1=StringVar() # ... хранится в собственной переменной 7. var2=StringVar() 8. # если флажок установлен, то в ассоциированную переменную ... 9. # ...(var0,var1 или var2) заносится значение onvalue, ... 10. # ...если флажок снят, то - offvalue. 11. ch0 = Checkbutton(root,text= "Окружность" ,variable=var0, 12. onvalue= "circle" ,offvalue= "-" ) 13. ch1 = Checkbutton(root,text= "Квадрат" ,variable=var1, 14. onvalue= "square" ,offvalue= "-" ) 15. ch2 = Checkbutton(root,text= "Треугольник" ,variable=var2, 16. onvalue= "triangle" ,offvalue= "-" ) 17. 18. lis = Listbox(root,height=3) 19. def result(event): 20. v0 = var0.get() 21. v1 = var1.get() 22. v2 = var2.get() 23. l = [v0,v1,v2] # значения переменных заносятся в список 24. lis.delete( 0 , 2 ) # предыдущее содержимое удаляется из Listbox 25. for v in l: # содержимое списка l последовательно ... 26. lis.insert(END,v) # ...вставляется в Listbox 27. 28. but = Button(root,text= "Получить значения" ) 29. but.bind( ' ,result) 30. 31. ch0.deselect() # "по умолчанию" флажки сняты 32. ch1.deselect() 33. ch2.deselect() 34. 35. ch0.pack() 36. ch1.pack() 37. ch2.pack() 38. but.pack() 39. lis.pack() 40. 41. root.mainloop() Пример 3. Помимо свойства (опции) variable, связывающей виджет с переменной-объектом Tkinter (IntVar, StringVar и др.), у многих виджет существует опция textvariable, которая определяет текст-содержимое или текст-надпись виджета. Несмотря на то, что «текстовое свойство» может быть установлено для виджета и изменено в процессе выполнения кода без использования ассоциированных переменных, иногда такой способ изменения оказывается более удобным. 1. from tkinter import * 2. root = Tk() 3. v = StringVar() 4. ent1 = Entry (root, textvariable = v,bg= "black" ,fg= "white" ) 5. ent2 = Entry(root, textvariable = v) 6. ent1.pack() 7. ent2.pack() 8. root.mainloop() Здесь содержимое одного текстового поля немедленно, отображается в другом, т.к. оба поля привязаны к одной и той же переменной v. Практическая работа 1. Напишите скрипт, как в примере с флажками; в отличии от примера значения ассоциированных переменных должны отображаться в метке (Label) через запятую. 2. Напишите программу, в которой пользователь может определить цвет рамки (Frame) c помощью шкалы (Scale). Объект Меню (Menu) в GUI. Урок 10 Методическая разработка урока Элективный курс: Модуль tkinter. Создание графического интерфейса пользователя с помощью языка программирования Python Уровень: Программирование для начинающих Что такое меню Меню — это объект, который присутствует во многих пользовательских приложениях. Находится оно под строкой заголовка и представляет собой выпадающие списки под словами; каждый такой список может содержать другой вложенный в него список. Каждый пункт списка представляет собой команду, запускающую какое-либо действие или открывающую диалоговое окно. Создание меню в Tkinter 1. from tkinter import * 2. root = Tk() 3. 4. m = Menu(root) #создается объект Меню на главном окне 5. root.config(menu=m) #окно конфигурируется с указанием меню для него 6. 7. fm = Menu(m) #создается пункт меню с размещением на основном меню (m) 8. m.add_cascade(label= "File" ,menu= fm ) #пункту располагается на основном меню (m) 9. fm .add_command(label= "Open..." ) #формируется список команд пункта меню 10. fm .add_command(label= "New" ) 11. fm .add_command(label= "Save..." ) 12. fm .add_command(label= "Exit" ) 13. 14. hm = Menu(m) #второй пункт меню 15. m.add_cascade(label= "Help" ,menu=hm) 16. hm.add_command(label= "Help" ) 17. hm.add_command(label= "About" ) 18. 19. root.mainloop() Метод add_cascade добавляет новый пункт в меню, который указывается как значение опции menu. Метод add_command добавляет новую команду в пункт меню. Одна из опций данного метода (в примере выше ее пока нет) — command – связывает данную команду с функцией- обработчиком. Можно создать вложенное меню. Для этого создается еще одно меню и с помощью add_cascade привязать к родительскому пункту. 1. nfm = Menu( fm ) 2. fm .add_cascade(label= "Import" ,menu=nfm) 3. nfm.add_command(label= "Image" ) 4. nfm.add_command(label= "Text" ) Привязка функций к меню Каждая команда меню обычно должна быть связана со своей функцией, выполняющей те или иные действия (выражения). Связь происходит с помощью опции command метода add_command. Функция обработчик до этого должна быть определена. Для примера выше далее приводятся исправленные строки добавления команд ―About‖, ―New‖ и ―Exit‖, а также функции, вызываемые, когда пользователь щелкает левой кнопкой мыши по соответствующим пунктам подменю. 1. |