我有一个 TextView 和一个与之关联的 TextBuffer。
当用户按下 Ctrl+b 时,我希望文本开始以粗体输入,直到用户再次按下 Ctrl+b。
我正在尝试自己的方法,但没有成功,然后我在邮件列表中找到了这篇文章: http ://www.daa.com.au/pipermail/pygtk/2009-April/016951.html
和我一样的问题,有人给出的解决方案是
您的应用程序必须处理管理 TextBuffer 中的标签所需的簿记。当在光标处插入文本时,您的应用程序必须捕获指示正在插入文本的信号,然后将所需的标签应用于插入的文本。我认为这可以通过捕获TextBuffer“插入文本”信号(使用connect_after()确保文本已被插入)然后将标签应用于回调中的文本来完成。
所以我尝试了这个。这是我的 textbuffer.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()
每当有人按下 Ctrl+b 时,都会从主脚本调用方法 make_bold()。
从理论上讲,这正是邮件帮助所说的那样。但不工作。我键入时文本未显示为粗体。如果我按向左箭头并向后移动光标,然后键入一个字符,则光标右侧的字符会变为粗体。
我怎样才能完成这项任务?
另外,有人可以在其中添加标签“textbuffer”吗?我无法创建新标签,我觉得该标签比“textview”更准确