Уже отмечалось, что наиболее сильными сторонами библиотеки 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