在pyGTK的TextView / TextBuffer中插入粗体字符

时间:2010-11-23 00:32:30

标签: python pygtk textview gtk-textbuffer

我有一个与之关联的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'更准确

1 个答案:

答案 0 :(得分:5)

在示例代码中,您调用了iter.backward_chars中的TextBuffer.text_inserted 但你永远不会使用它!所以我制作了一个示例脚本来向你展示所需的行为并澄清:

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):
        ''' add "bold" to our active tags list '''
        if 'bold' in self.tags_on:
            del self.tags_on[self.tags_on.index('bold')]
        else:
            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:
            # 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(), iter)



def main():
    window = gtk.Window()
    window.connect('destroy', lambda _: gtk.main_quit())
    window.resize(300, 300)
    tb = TextBuffer()
    tv = gtk.TextView(buffer=tb)

    accel = gtk.AccelGroup()
    accel.connect_group(gtk.keysyms.b,
                        gtk.gdk.CONTROL_MASK,gtk.ACCEL_LOCKED,
                        lambda a,b,c,d: tb.make_bold())
    window.add_accel_group(accel)
    window.add(tv)
    window.show_all()
    gtk.main()

if __name__ == '__main__':
    main()