Программирования Pythonпояснительная записка
Скачать 0.83 Mb.
|
def mooove(event): 2. c.move(rect, 0 , 2 ) 3. 4. c.bind( ' ,mooove) Теперь рассмотрим как работают теги. В отличие от идентификаторов, которые являются уникальными для каждого объекта, один и тот же тег может присваиваться разным объектам. Дальнейшее обращение к такому тегу позволит изменить все объекты, в которых он был указан. В примере ниже эллипс и линия содержат один и тот же тег, а функция color изменяет цвет всех объектов с тегом group1. Обратите внимание, что в отличие от имени идентификатора (переменная), имя тега заключается в кавычки (строковое значение). 1. oval = c.create_oval( 30 , 10 , 130 , 80 ,tag= "group1" ) 2. c.create_line( 10 , 100 , 450 , 100 ,tag= "group1" ) 3. … 4. def color(event): 5. c.itemconfig( 'group1' ,fill= "red" ,width= 3 ) 6. … 7. c.bind( ' ,color) Еще один метод, который стоит рассмотреть, это delete, который удаляет объект по указанному идентификатору или тегу. В tkinter существуют зарезервированные теги: например, all обозначает все объекты холста. Так в примере ниже функция clean просто очищает холст. 1. def clean(event): 2. c.delete( 'all' ) 3. 4. c.bind( ' ,clean) Метод tag_bind позволяет привязать событие (например, щелчок кнопкой мыши) к определенному объекту. Таким образом, можно реализовать обращение к различным областям холста с помощью одного и того же события. Пример ниже это наглядно иллюстрирует: изменения на холсте зависят от того, где произведен щелчок мышью. 1. from tkinter import * 2. 3. c = Canvas(width= 460 ,height= 100 ,bg= 'grey80' ) 4. c.pack() 5. 6. oval = c.create_oval( 30 , 10 , 130 , 80 ,fill= "orange" ) 7. c.create_rectangle( 180 , 10 , 280 , 80 ,tag= "rect" ,fill= "lightgreen" ) 8. trian = c.create_polygon( 330 , 80 , 380 , 10 , 430 , 80 ,fill= 'white' ,outline= "black" ) 9. 10. def oval_func(event): 11. c.delete(oval) 12. c.create_text( 30 , 10 ,text= "Здесь был круг" ,anchor= "w" ) 13. def rect_func(event): 14. c.delete( "rect" ) 15. c.create_text( 180 , 10 ,text= "Здесь был \n прямоугольник" ,anchor= "nw" ) 16. def triangle(event): 17. c.create_polygon( 350 , 70 , 380 , 20 , 410 , 70 ,fill= 'yellow' ,outline= "black" ) 18. 19. c.tag_bind(oval, ' ,oval_func) 20. c.tag_bind( "rect" , ' ,rect_func) 21. c.tag_bind(trian, ' ,triangle) 22. 23. mainloop() Практическая работа 1. Спишите скрипты, рассмотренные в данном уроке. Выполните их. Объясните увиденное. 2. Подумайте как можно реализовать движение (анимацию) той или иной геометрическое фигуры по холсту. Подсказка: попробуйте использовать цикл while, в теле которого с помощью метода delete удаляется старая фигура, а с помощью move рисуется такая же на новом месте. Особенности работы с виджетом Text модуля Tkinter. Урок 14 Методическая разработка урока Элективный курс: Модуль tkinter. Создание графического интерфейса пользователя с помощью языка программирования Python Уровень: Программирование для начинающих Графический элемент Text предоставляет большие возможности для работы с текстовой информацией. Помимо разнообразных операций с текстом и его форматированием в экземпляр объекта Text можно вставлять другие виджеты (следует отметить, что такая же возможность существует и для Canvas). В данном уроке рассматриваются лишь некоторые возможности виджета Text на примере создания окна с текстовым полем, содержащим форматированный текст, кнопку и возможность добавления экземпляров холста. 1. Для начала создадим текстовое поле, установив при этом некоторые из его свойств: 1. #текстовое поле и его первоначальные настройки 2. tx = Text(font=( 'times' , 12 ),width= 50 ,height= 15 ,wrap=WORD) 3. tx.pack(expand=YES,fill=BOTH) 2. Теперь допустим нам нужно добавить какой-нибудь текст. Сделать это можно с помощью метода insert, передав ему два обязательных аргумента: место, куда вставить, и объект, который следует вставить. Объектом может быть строка, переменная, ссылающаяся на строку или какой-либо другой объект. Место вставки может указываться несколькими способами. Один из них — это индексы. Они записываются в виде 'x.y', где x – это строка, а y – столбец. При этом нумерация строк начинается с единицы, а столбцов с нуля. Например, первый символ в первой строке имеет индекс '1.0', а десятый символ в пятой строке — '5.9'. 1. tx.insert( 1.0 , 'Дзэн Питона \n\ 2. Если интерпретатору Питона дать команду \n\ 3. import this ("импортировать это"), \n\ 4. то выведется так называемый "Дзен Питона". \n Некоторые выражения: \n\ 5. * Если реализацию сложно объяснить — это плохая идея. \n\ 6. * Ошибки никогда не должны замалчиваться. \n\ 7. * Явное лучше неявного. \n\n ' ) Комбинация символов '\n' создает новую строку (т.е. при интерпретации последующий текст начнется с новой строки). Одиночный символ '\' никак не влияет на отображение текста при выполнении кода, его следует вставлять при переносе текста при написании скрипта. Когда содержимого текстового поля нет вообще, то единственный доступный индекс — '1.0'. В заполненном текстовом поле вставлять можно в любое место (где есть содержимое). Если выполнить скрипт, содержащий только данный код (+ импорт модуля Tkinter, + создание главного окна, + mainloop() в конце), то мы увидим текстовое поле с восемью строчками текста. Текст не оформлен. 3. Теперь отформатируем разные области текста по-разному. Для этого сначала зададим теги для нужных нам областей, а затем для каждого тега установим настройки шрифта и др. 1. #установка тегов для областей текста 2. tx.tag_add( 'title' , '1.0' , '1.end' ) 3. tx.tag_add( 'special' , '6.0' , '8.end' ) 4. tx.tag_add( 'special' , '3.0' , '3.11' ) 5. 6. #конфигурирование тегов 7. tx.tag_config( 'title' ,foreground= 'red' , 8. font=( 'times' , 14 , 'underline' ),justify=CENTER) 9. tx.tag_config( 'special' ,background= 'grey85' ,font=( 'Dejavu' , 10 , 'bold' )) Добавление тега осуществляется с помощью метода tag_add. Первый атрибут — имя тега (произвольное), далее с помощью индексов указывается к какой области текстового поля он прикрепляется (начальный символ и конечный). Вариант записи как '1.end' говорит о том, что нужно взять текст до конца указанной строки. Разные области текста могут быть помечены одинаковым тегом. Метод tag_config применяет те или иные свойства к тегу, указанному в качестве первого аргумента. 4. В многострочное текстовое поле можно добавлять не только текст, но и другие объекты. Например, вставим в поле кнопку (ну и функцию заодно). 1. def erase(): 2. tx.delete( '1.0' ,END) 3. 4. #добавление кнопки 5. bt = Button(tx,text= 'Стереть' ,command=erase) 6. tx.window_create(END,window=bt) Кнопка — это виджет. Виджеты добавляются в текстовое поле с помощью метода window_create, где в качестве первой опции указывается место добавления, а второй (window) — в качестве значения присваивается переменная, связанная с объектом. При щелчке ЛКМ (левой кнопкой мыши) по кнопке будет вызываться функция erase, в которой с помощью метода delete удаляется все содержимое поля (от '1.0' до END). 5. А вот более интересный пример добавления виджета в поле Text: 1. def smiley(event): 2. cv = Canvas(height= 30 ,width= 30 ) 3. cv.create_oval( 1 , 1 , 29 , 29 ,fill= "yellow" ) 4. cv.create_oval( 9 , 10 , 12 , 12 ) 5. cv.create_oval( 19 , 10 , 22 , 12 ) 6. cv.create_polygon( 9 , 20 , 15 , 24 , 22 , 20 ) 7. tx.window_create(CURRENT,window=cv) 8. … 9. #ЛКМ -> смайлик 10. tx.bind( ' ,smiley) Здесь при щелчке ЛКМ в любом месте текстового поля будет вызываться функция smiley. В теле данной функции создается объект холста, который в конце с помощью метода window_create добавляется на объект tx. Место вставки указано как CURRENT, т. е. "текущее" - это там, где был произведен щелчок мышью. Практическая работа: 1. Напишите скрипт, описанный в данном уроке. Выполните его. 2. Измените функцию erase таким образом, чтобы удалялся не весь текст, а только третья строка. 3. Привяжите оставшуюся область текста к третьему тегу и с помощью метода tag_config измените шрифт. 4. Добавьте еще какой-нибудь виджет в текстовое поле. |