TextBuffer это ключевой компонент системы работы с текстом PyGTK. Он содержит TextTag‘и в TextTagTable и TextMark‘и, которые вместе описывают то, как текст должен быть отображён, и позволяют пользователю интерактивно изменять содержание и внешний вид текста. Как упоминалось в предыдущем разделе, TextBuffer может быть связан с одним или более TextView, которые отображают содержимое TextBuffer.
TextBuffer автоматически создаётся при создании TextView, либо может быть создан с помощью функции:
textbuffer = TextBuffer(table=None) |
где table это TextTagTable. Если table не указан (или None), то будет создан новый TextTagTable.
Существует большое число методов, которые используются для:
- вставки и удаления текста в буфере
- создания, удаления и управления метками
- управления курсором и выделением
- создания, применения и удаления gtk.TextTag
- определения и управления gtk.TextIter
- получения информации о состоянии
Вы можете получить число строк в textbuffer с помощью метода:
line_count = textbuffer.get_line_count() |
Также вы можете получить число символов, используя:
char_count = textbuffer.get_char_count() |
Когда в textbuffer изменяется содержимое, устанавливается флаг modifed. Информацию о состоянии этого флага можо получить с помощью метода:
modified = textbuffer.get_modified() |
Если программа сохраняет содержимое буфера, то следующим методом можно сбросить флаг modifed:
textbuffer.set_modified(setting) |
TextIter используется для указания позиции между двумя символами в TextBuffer. Методы TextBuffer для управления текстом используют TextIter определения места для применения метода. TextIter имеет большое число методов, которые объясняются в разделе Текстовые каналы.
Основные методы TextBuffer‘а для получения TextIter:
iter = textbuffer.get_iter_at_offset(char_offset) iter = textbuffer_get_iter_at_line(line_number) iter = textbuffer.get_iter_at_line_offset(line_number, line_offset) iter = textbuffer.get_iter_at_mark(mark) |
get_iter_at_offset() возвращает TextIter после char_offset символа, считая от начала текстового буфера.
get_iter_at_line() возвращает TextIter перед первым символом в строке line_number.
get_iter_at_line_offset() возвращает TextIter после line_offset символа в строке line_number.
get_iter_at_mark() возвращает TextIter в позиции, заданной меткой mark.
Следующие методы создают один или более TextIter в особых местах буфера:
startiter = textbuffer.get_start_iter() enditer = textbuffer_get_end_iter() startiter, enditer = textbuffer.get_bounds() start, end = textbuffer.get_selection_bounds() |
get_start_iter() создаёт TextIter перед первым символом в буфере.
get_end_iter() создаёт TextIter после последнего символа в буфере.
get_bounds() создаёт кортеж из двух TextIter. Первый из которых перед первым символом буфера, а второй после последнего.
get_selection_bounds() создаёт кортеж из двух TextIter на месте меток insert и selection_bound.
Текст в TextBuffer может быть установлен с помощью метода:
textbuffer.set_text(text) |
Этот метод заменяет текущее содержимое буфера содержимым text.
Основной метод для вставки символов в текстовый буфер:
textbuffer.insert(iter, text) |
который вставляет text в текстовый буфер, а место вставки определяет iter.
Если вам нужно вставить текст от лица пользователя, используйте метод:
result = textbuffer.insert_interactive(iter, text, default_editable) |
который вставляет text в текстовый буфер, место вставки определяется с помощью iter, но она происходит только если это место является редактируемым (не имеет gtk.TextTag, указывающего что текст в данном месте не редактируемый) и значениеdefault_editable равно TRUE. Возвращаемое значение показывает, произошла ли вставка текста.
default_editable показывает редактируемость текста, не имеющего влияющих на это gtk.TextTag. Обычно default_editable определяется вызовом метода get_editable().
Другие методы для вставки текста:
textbuffer.insert_at_cursor(text) result = textbuffer.insert_at_cursor_interactive(text, default_editable) textbuffer.insert_range(iter, start, end) result = textbuffer.insert_range_interactive(iter, start, end, default_editable) |
insert_at_cursor() это удобный метод, который вставляет текст на месте курсора (метка insert).
insert_range() копирует текст, буферы пикселей и gtk.TextTag между start и end в TextBuffer и вставляет копию в iter.
Интерактивные версии этих методов работают таким-же путём, за исключением того, что вставка происходит только если место является редактируемым.
Наконец, текст может быть вставлен сразу с заранее подготовленными gtk.TextTag с помощью методов:
textbuffer.insert_with_tags(iter, text, tag1, tag2, ...) textbuffer.insert_with_tags_by_name(iter, text, tagname1, tagname2, ...) |
insert_with_tags() вставляет text в буфер, в iter, и применяет заданные gtk.TextTag.
insert_with_tags_by_name() делает то же самое, только позволяет указывать TextTag с помощью имени.
Текст в текстовом буфере может быть удалён с помощью методов:
textbuffer.delete(start, end) result = textbuffer.delete_interactive(start, end, default_editable) |
delete() удаляет текст между start и end TextIter‘ами в буфере.
delete_interactive() удаляет весь редактируемый текст между start и end.
Вы можете получить копию текста из буфера с помощью методов:
text = textbuffer.get_text(start, end, include_hidden_chars=TRUE) text = textbuffer.get_slice(start, end, include_hidden_chars=TRUE) |
get_text() возвращает копию text из текстового буфера между start и end. Неотображаемые символы исключаются при include_hidden_chars, равном FALSE. Символы, отображающие встроенные картинки или виджеты исключаются.
get_slice() то же что и get_text() за тем исключением что text включает символ 0xFFFC для каждой встроенной картинки или виджета.
TextMark похожи на TextIter, в том, что они указывают в TextBuffer на положение между двумя символами. Однако, TextMark сохраняет свою информацию несмотря на изменения буфера. Методы TextMark будут рассматриваться в разделе 13.5.
Текстовый буфер содежит две встроенные метки: метка insert (курсор), и метка selection_bound. Метка insert указывает на курсор, место куда по умолчанию происходит вставка текста, а метка selection_bound в сочетании с insert определяют границы выделения текста.
Встроенные метки могут быть получены с помощью методов:
insertmark = textbuffer.get_insert() selection_boundmark = textbuffer.get_selection_bound() |
Метки insert и selection_bound могут быть одновременно перемещены в определённое место с помощью метода:
textbuffer.place_cursor(where) |
where это gtk.TextIter, указывающий место для перемещения. Метод place_cursor() нужен для того, чтобы избежать выделения текста при перемещении меток раздельно.
TextMark создаются с помощью метода:
mark = textbuffer.create_mark(mark_name, where, left_gravity=FALSE) |
Где mark_name это имя, связанное с меткой (может быть None для создания анонимной метки), where это TextIter, указывающий на позицию метки в текстовом буфере, а left_gravity показывает где будет находиться метка после вставки текста на неё (слева, еслиTRUE или справа, если FALSE).
Метка может быть перемещена по текстовому буферу с помощью методов:
textbuffer.move_mark(mark, where) textbuffer.move_mark_by_name(name, where) |
mark определяет перемещаемую метку. Имя перемещаемой метки определяет name. Место where, определяемое для перемещения – это TextIter.
Метка может быть удалена с помощью методов:
textbuffer.delete_mark(mark) textbuffer.delete_mark_by_name(name) |
Метка может быть получена из имени с помощью:
mark = textbuffer.get_mark(name) |
TextTag содержат один или более атрибутов (например цвет фона и шрифта, шрифт, редактируемость), которые могут быть применены для одного или более отрывков текста в TextBuffer. Атрибуты, которые могут быть указаны свойствами TextTag, мы рассмотрим в Разделе 13.6.1, “gtk.TextTag”.
TextTag может быть создан с атрибутами, и установлен в TextTagTable текстового буфера с помощью метода:
tag = textbuffer.create_tag(name=None, attr1=val1, attr2=val2, ...) |
где name это строка определяющая имя для TextTag или None для создания анонимного TextTag, а пары атрибут=значение указывают значения для нужных вам атрибутов. Смотрите раздел посвящённый gtk.TextTag для информации о возможных атрибутах.
TextTag может быть применён для отрывка текста в текстовом буфере с помощью методов:
textbuffer.apply_tag(tag, start, end) textbuffer.apply_tag_by_name(name, start, end) |
tag это TextTag, применяемый к тексту. name это имя применяемого TextTag. start и end это TextIter’ы, которые определяют текст для применения метода.
TextTag также может быть удалён из отрывка текста с помощью методов:
textbuffer.remove_tag(tag, start, end) textbuffer.remove_tag_by_name(name, start, end) |
Все TextTag в определённом отрывке текста могут быть удалены с помощью метода:
textbuffer.remove_all_tags(start, end) |
В дополнение к тексту, TextBuffer может содержать изображения или прикреплять виджеты к якорю. Виджеты могут быть прикреплены к любому TextView, который отображает буфер с якорем.
Картинка может быть вставлена с помощью метода:
textbuffer.insert_pixbuf(iter, pixbuf) |
где iter указывает на место вставки pixbuf. Изображение считается за один символ, и отображается в выводе get_slice() (но не get_text()!!!) как символ Unicode “0xFFFC”.
Виджет GTK+ может быть вставлен в TextView на место указанное якорем (TextChildAnchor). TextChildAnchor считается за один символ и отображается “0xFFFC”, также как и изображение.
TextChildAnchor может быть создан и вставлен в буфер с помощью метода:
anchor = text_buffer.create_child_anchor(iter) |
где iter указывает на место размещения TextChildAnchor.
TextChildAnchor также может быть создан с помощью этих двух опреаций:
anchor = gtk.TextChildAnchor() text_buffer.insert_child_anchor(iter, anchor) |
Тогда виджет может быть добавлен на TextView к якорю с помощью метода:
text_view.add_child_at_anchor(child, anchor) |
Список виджетов на якоре можно получить с помощью метода:
widget_list = anchor.get_widgets() |
Также виджет может быть добавлен на TextView с помощью метода:
text_view.add_child_in_window(child, which_window, xpos, ypos) |
где виджет child размещается в which_window на позицию, указанную в xpos и ypos. which_window указывает в какое из окон, содержащих TextView произойдёт размещение виджета:
gtk.TEXT_WINDOW_TOP gtk.TEXT_WINDOW_BOTTOM gtk.TEXT_WINDOW_LEFT gtk.TEXT_WINDOW_RIGHT gtk.TEXT_WINDOW_TEXT gtk.TEXT_WINDOW_WIDGET |
Предыдущая страница | На уровень выше | Следующая страница |
13.2. Представление текста | Оглавление | 13.4. Текстовые каналы (gtk.TextIter) |