Виджет Text

vidzhet text Экскурсия по tkinter, часть 2

Уже отмечалось, что наиболее сильными сторонами библиотеки tkinter являются виджеты Text и Canvas. Оба они обладают богатым набором функций. Например, виджет Text оказался достаточно мощным, чтобы на его основе можно было создать веб-броузер Grail — экспериментальный веб-броузер, реализованный на языке Python. Виджет Text поддерживает сложные настройки стилей шрифтов, позволяет встраивать графику, имеет неограниченное количество уровней отката и возврата изменений и многое другое. Виджет Canvas, универсальный графический инструмент, позволяет отображать произвольные изображения и также положен в основу многих приложений для сложной обработки изображений и визуализации.

В главе 11 мы воспользуемся двумя этими виджетами для реализации текстового редактора (PyEdit), графического редактора (PyDraw), часов с графическим интерфейсом (PyClock) и программ для просмотра изображений (PyPhoto и PyView). Однако в этой, экскурсионной главе мы будем использовать эти виджеты в более простых примерах. В примере 9.10 реализован простой интерфейс отображения текста с прокруткой, который может вывести строку текста или файл.

Пример 9.10. PP4E\Gui\Tour\scrolledtext.py

“простой компонент просмотра текста или содержимого файла”

print(‘PP4E scrolledtext’)

from tkinter import *

class ScrolledText(Frame):

def __init__(self, parent=None, text=’’, file=None):

Frame.__init__(self, parent)

self.pack(expand=YES, fill=BOTH) # сделать растягиваемым self.makewidgets() self.settext(text, file)

def makewidgets(self):

sbar = Scrollbar(self)

text = Text(self, relief=SUNKEN)

sbar.config(command=text.yview) # связать sbar и text

text.config(yscrollcommand=sbar.set) # сдвиг одного = сдвиг другого

sbar.pack(side=RIGHT, fill=Y) # первым добавленпосл. обрезан

text.pack(side=LEFT, expand=YES, fill=BOTH) # Text обрезается первым self.text = text

def settext(self, text=’’, file=None): if file:

text = open(file, ‘r’).read()

self.text.delete(‘1.0’, END) # удалить текущий текст

self.text.insert(‘1.0’, text) # добавить в стр. 1, кол. 0

self.text.mark_set(INSERT, ‘1.0’) # установить курсор вставки

self.text.focus() # сэкономить щелчок мышью

def gettext(self): # возвращает строку

return self.text.get(‘1.0’, END+’-1c’) # от начала до конца

if __name__ == ‘__main__’:

root = Tk()

if len(sys.argv) > 1:

st = ScrolledText(file=sys.argv[1]) # имя файла в командной строке else:

st = ScrolledText(text=’Words\ngo here’) # иначе: две строки

def show(event):

print(repr(st.gettext())) # вывести как простую строку

root.bind(‘<Key-Escape>’, show) # esc = выводит дамп текста

root.mainloop()

Подобно объекту ScrolledList из примера 9.9 объект ScrolledText в этом файле создавался как многократно используемый компонент, но точно так же этот сценарий может выполняться автономно, выводя содержимое текстового файла. Так же, как в предыдущем разделе, этот сценарий сначала прикрепляет полосу прокрутки, чтобы при сжатии окна она исчезала последней, и настраивает встроенный объект Text, чтобы он растягивался в обоих направлениях при увеличении размеров окна. Если при запуске передать сценарию аргумент с именем файла, он создаст окно, изображенное на рис. 9.17: сценарий встраивает виджет Text в левую часть окна, а связанную с ним полосу прокрутки — в правую.

Для забавы я заполнил текстовый файл[XXXVIII], отображаемый в окне, с помощью следующего сценария и команд (и не только потому, что я жил в Колорадо рядом с отелем, пользующимся дурной славой):

C:\\PP4E\Gui\Tour> type makefile.py f = open(‘jack.txt’, ‘w’) for i in range(250):

f.write(‘%03d) All work and no play makes Jack a dull boy.\n’ % i)

f.close()

C:\\PP4E\Gui\Tour> python makefile.py

C:\\PP4E\Gui\Tour> python scrolledtext.py jack.txt

PP4E scrolledtext

Рис. 9.17. Сценарий scrolledtext в действии

 

Для просмотра файла его имя нужно передать сценарию в аргументе командной строки — текст файла будет автоматически выведен в новом окне. По умолчанию он выводится шрифтом, который может оказаться разным на разных платформах (и может оказаться не моноширинным в некоторых их них), но в следующем примере мы устраним это несоответствие, передав виджету Text параметр font. Нажатие клавиши Escape вызывает извлечение и вывод всего текстового содержимого виджета в виде единственной строки (подробнее об этом чуть ниже).

Обратите внимание на сообщение PP4E scrolledtext, которое выводится при выполнении сценария. Поскольку в стандартном дистрибутиве Python также есть файл scrolledtext.py (в модуле tkinter.scrolledtext) с совершенно иной реализацией и интерфейсом, данный сценарий идентифицирует себя при выполнении или импортировании, чтобы можно было отличить один от другого. Если сценарий стандартной библиотеки когда-либо будет исключен из дистрибутива, импортируйте тот, что приведен здесь, чтобы получить простое средство просмотра текста, и измените вызовы настройки параметров, чтобы они содержали спецификатор .text (например, x.text.config вместо x.config — библиотечная версия создает подкласс Text, а не Frame).

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий