У меня есть TextView и связанный с ним TextBuffer.
Когда пользователь нажимает Ctrl+b, я бы хотел, чтобы текст начинал печатать жирным шрифтом, пока пользователь снова не нажмет Ctrl+b.
Я пробовал свои собственные методы, которые не работали, а затем нашел этот пост в списке рассылки: http://www.daa.com.au/pipermail/pygtk/2009-April/016951.html
Та же проблема, что и у меня, и решение, которое кто-то дал,
Ваше приложение должно будет вести учет, необходимый для управления тегами в TextBuffer. Когда текст вставляется в курсор, ваше приложение должно поймать сигнал, указывающий, что текст вставляется, а затем применить необходимые теги к вставленному тексту. Я думаю, это можно сделать, поймав сигнал вставки текста TextBuffer (используя connect_after(), чтобы убедиться, что текст уже был вставлен), а затем применив теги к тексту в обратном вызове.
Так что я попытался это. Это мой текстовый буфер.py
import gtk
import pango
class TextBuffer(gtk.TextBuffer):
def __init__(self):
gtk.TextBuffer.__init__(self)
self.connect_after('insert-text', self.text_inserted)
# A list to hold our active tags
self.tags_on = []
# Our Bold tag.
self.tag_bold = self.create_tag("bold", weight=pango.WEIGHT_BOLD)
def get_iter_position(self):
return self.get_iter_at_mark(self.get_insert())
def make_bold(self, text):
''' add "bold" to our active tags list '''
self.tags_on.append('bold')
def text_inserted(self, buffer, iter, text, length):
# A text was inserted in the buffer. If there are ny tags in self.tags_on, apply them
if self.tags_on:
print self.get_iter_position()
# This sets the iter back N characters
iter.backward_chars(length)
# And this applies tag from iter to end of buffer
self.apply_tag_by_name('bold', self.get_iter_position(), self.get_end_iter())
print self.get_iter_position()
метод make_bold() вызывается из основного скрипта всякий раз, когда кто-то нажимает Ctrl+b.
Теоретически это делает именно то, что сказала помощь по рассылке. Но не работает. Текст не выделяется жирным шрифтом, когда я печатаю. Если я нажимаю стрелку влево и перемещаю курсор назад, а затем ввожу символ, то символы справа от курсора выделяются жирным шрифтом.
Как я могу выполнить эту задачу?
Кроме того, может ли кто-нибудь добавить к этому тег «текстовый буфер»? Я не могу создавать новые теги, и мне кажется, что этот тег более точен, чем «текстовое представление».