代码之家  ›  专栏  ›  技术社区  ›  sqram

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

  •  4
  • sqram  · 技术社区  · 14 年前

    我有一个文本视图和一个文本缓冲区。

    当用户按下Ctrl+b时,我希望在用户再次按下Ctrl+b之前文本开始以粗体输入。

    我试着用我自己的方法,但没有奏效,然后我在邮件列表上找到了这篇文章: http://www.daa.com.au/pipermail/pygtk/2009-April/016951.html

    和我一样的问题,有人给出的解决方案是

    你的申请将不得不处理所需的簿记管理 文本缓冲区中的标记。当光标处插入文本时,你的应用程序 对插入的文本应用所需的标记。我想这是可以做到的 通过捕捉文本缓冲区“插入文本”信号(使用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 回复  |  直到 7 年前
        1
  •  5
  •   cyraxjoe    14 年前

    在您调用的示例代码中 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()