Текстовый буфер (gtk.TextBuffer)

TextBuffer это ключевой компонент системы работы с текстом PyGTK. Он содержит TextTag‘и в TextTagTable и TextMark‘и, которые вместе описывают то, как текст должен быть отображён, и позволяют пользователю интерактивно изменять содержание и внешний вид текста. Как упоминалось в предыдущем разделе, TextBuffer может быть связан с одним или более TextView, которые отображают содержимое TextBuffer.

TextBuffer автоматически создаётся при создании TextView, либо может быть создан с помощью функции:

  textbuffer = TextBuffer(table=None)

где table это TextTagTable. Если table не указан (или None), то будет создан новый TextTagTable.

Существует большое число методов, которые используются для:

  • вставки и удаления текста в буфере
  • создания, удаления и управления метками
  • управления курсором и выделением
  • создания, применения и удаления gtk.TextTag
  • определения и управления gtk.TextIter
  • получения информации о состоянии

13.3.1. Информация о состоянии текстового буфера

Вы можете получить число строк в textbuffer с помощью метода:

  line_count = textbuffer.get_line_count()

Также вы можете получить число символов, используя:

  char_count = textbuffer.get_char_count()

Когда в textbuffer изменяется содержимое, устанавливается флаг modifed. Информацию о состоянии этого флага можо получить с помощью метода:

  modified = textbuffer.get_modified()

Если программа сохраняет содержимое буфера, то следующим методом можно сбросить флаг modifed:

  textbuffer.set_modified(setting)

13.3.2. Создание текстовых каналов (gtk.TextIter)

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.

13.3.3. Вставка, правка и удаление текста

Текст в 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 для каждой встроенной картинки или виджета.

13.3.4. Немного о текстовых метках

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)

13.3.5. Создание и применение gtk.TextTag

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)

13.3.6. Вставка изображений и других виджетов

В дополнение к тексту, 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 и yposwhich_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)

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>