4


2

PyGTK TreeViewでのワードラップ

PyGTK TreeView内でテキストを折り返すにはどうすればよいですか?

4 Answer


6


gtk.TreeViewのテキストはgtk.CellRendererTextを使用してレンダリングされ、テキストの折り返しはセルレンダラーで適切なプロパティを設定することになります。 テキストを折り返すには、セルレンダラーで `wrap-width`プロパティ(ピクセル単位)を設定する必要があります。 また、 `wrap-mode`プロパティを適切な値に設定することもできます。 例えば:

renderer.props.wrap_width = 100
renderer.props.wrap_mode = gtk.WRAP_WORD

残念ながら、列の幅を調整可能なワードラップが必要な場合、PyGTKは自動的にそれを行いません。 ただし、適切な効果を得るには、動的に「ラップ幅」を設定できる必要があります。 gtk.Labelにはこのようなhttps://stackoverflow.com/questions/1893748/pygtk-dynamic-label-wrapping [既知の回避策]があり、sproatyの回答にリンクされているガイドも同様のことをしているようです。


1


これはGTKの組み込み機能ではないようですが、以下に詳述するように、独自のTreeCellRendererを作成できます。

しかし、かなり複雑に見えます。


1


私のブログ投稿での答えは、私が使用している現在のカスタムレンダラーのTextCellRendererでラップ幅とラップモードの動作を設定するだけでカイがすでに答えているため、「適切に」行う方法を見つける前からでした:

layout = cairo_context.create_layout()
font = pango.FontDescription("Sans")
font.set_size(pango.SCALE * (self.get_property('font_size')))
font.set_style(pango.STYLE_NORMAL)
font.set_weight(pango.WEIGHT_BOLD)
layout.set_font_description(font)
w=800  # the width I want to wrap at
layout.set_width(pango.SCALE * w)
layout.set_wrap(pango.WRAP_WORD)
layout.set_markup("my text to write out and wrap at the right width")

これは明らかにpango cairoを使用するため、pango.SCALEで必要な幅の倍数を覚えておく必要があります。


0


この質問の解決策を探している間に、私はたまたま異なるソースからこれをまとめました。 列幅を変更すると、テキストは動的に折り返されます。

def set_column_width(column, width, renderer, pan = True):
   column_width = column.get_width()
   #print "column %s size %s" % (column.get_title(), column_width)
   renderer.props.wrap_width = column_width
   if pan:
      renderer.props.wrap_mode = pango.WRAP_WORD
   else:
      renderer.props.wrap_mode = gtk.WRAP_WORD


cell_renderer = gtk.CellRendererText()
column = gtk.TreeViewColumn()

column.connect_after("notify::width", set_column_width, cell_renderer)