Вставка полужирных символов в TextView/TextBuffer pyGTK

У меня есть 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.

Теоретически это делает именно то, что сказала помощь по рассылке. Но не работает. Текст не выделяется жирным шрифтом, когда я печатаю. Если я нажимаю стрелку влево и перемещаю курсор назад, а затем ввожу символ, то символы справа от курсора выделяются жирным шрифтом.

Как я могу выполнить эту задачу?

Кроме того, может ли кто-нибудь добавить к этому тег «текстовый буфер»? Я не могу создавать новые теги, и мне кажется, что этот тег более точен, чем «текстовое представление».


person sqram    schedule 23.11.2010    source источник


Ответы (1)


В примере кода вы вызываете iter.backward_chars в TextBuffer.text_inserted, но вы никогда не используете этот iter!, поэтому я делаю пример сценария, чтобы показать вам желаемое поведение и пояснить:

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()
person cyraxjoe    schedule 23.11.2010