4

TextView とそれに関連付けられた TextBuffer があります。

ユーザーが Ctrl+b を押すと、ユーザーが Ctrl+b をもう一度押すまで、テキストを太字で入力し始めたいと思います。

私は独自の方法を試していましたが、うまくいきませんでした。その後、メーリング リストで次の投稿を見つけました

私と同じ問題で、誰かが与えた解決策は

アプリケーションは、TextBuffer 内のタグを管理するために必要な簿記を処理する必要があります。カーソル位置にテキストが挿入されると、アプリはテキストが挿入されていることを示すシグナルをキャッチし、挿入されたテキストに必要なタグを適用する必要があります。これは、TextBuffer の "insert-text" シグナルをキャッチし (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()

メソッド make_bold() は、誰かが Ctrl+b を押すたびにメイン スクリプトから呼び出されます。

理論的には、これはメーリング ヘルプが指示したことを正確に実行しています。しかし、機能していません。入力時にテキストが太字で表示されません。左矢印キーを押してカーソルを元に戻し、文字を入力すると、カーソルの右側の文字が太字になります。

どうすればこのタスクを達成できますか?

また、誰かがこれに「textbuffer」というタグを追加できますか? 新しいタグを作成できず、そのタグは「textview」よりも正確なように感じます

4

1 に答える 1

5

サンプル コードiter.backward_charsでは in を呼び出します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()
于 2010-11-23T06:04:11.183 に答える