Python Gtk3 TreeViewColumn超长文本如何自动加省略号截断?
解决方案
只需修改3处代码即可实现需求:
- 导入Pango依赖库,用于配置文本省略规则
- 为Name列的文本渲染器开启末尾自动追加省略号的特性
- 将滚动区域的水平滚动策略设为禁用,彻底避免横向滚动
修改后完整可运行代码如下:
import sys import gi gi.require_version("Gtk", "3.0") gi.require_version("Gdk", "3.0") gi.require_version("Pango", "1.0") from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import Pango class ListWindow(Gtk.Window): def __init__(self): super().__init__(title="List Demo") self.set_border_width(10) self.set_default_size(400, 300) header = Gtk.HeaderBar(title="List Demo") header.props.show_close_button = True self.set_titlebar(header) self.scrollable = Gtk.ScrolledWindow() # 水平滚动永不触发,垂直滚动自动显示 self.scrollable.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) self.colour_list = Gtk.ListStore(str, int, int, int, GdkPixbuf.Pixbuf) self.tree_view = Gtk.TreeView(model=self.colour_list) self.tree_view.set_headers_visible(True) # 右对齐渲染器 right_justify = Gtk.CellRendererText() right_justify.set_alignment(1.0, 0.5) # Name列单独配置渲染器,开启省略号 name_renderer = Gtk.CellRendererText() name_renderer.props.ellipsize = Pango.EllipsizeMode.END name_renderer.props.ellipsize_set = True # 如果需要文本换行就取消下面两行注释 # name_renderer.props.wrap_mode = Pango.WrapMode.WORD # name_renderer.props.wrap_width = 200 # 五列定义 column1 = Gtk.TreeViewColumn("Name", name_renderer, text=0) column2 = Gtk.TreeViewColumn("Red", right_justify, text=1) column3 = Gtk.TreeViewColumn("Grn", right_justify, text=2) column4 = Gtk.TreeViewColumn("Blu", right_justify, text=3) column5 = Gtk.TreeViewColumn("Swatch", Gtk.CellRendererPixbuf(), pixbuf=4) columns = [column1, column2, column3, column4, column5] for i, col in enumerate(columns): if i == 0: col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) col.set_expand(True) col.set_resizable(True) else: col.set_sizing(Gtk.TreeViewColumnSizing.FIXED) col.set_expand(False) col.set_resizable(False) self.tree_view.append_column(col) self.populateList() self.scrollable.add(self.tree_view) self.add(self.scrollable) self.show_all() def getColouredPixmap(self, r, g, b, a=255): CHANNEL_BITS = 8 WIDTH = 64 HEIGHT = 32 swatch = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, CHANNEL_BITS, WIDTH, HEIGHT) swatch.fill((r << 24) | (g << 16) | (b << 8) | a) return swatch def populateList(self): swatch = self.getColouredPixmap(184, 134, 11) self.colour_list.append(['Sarcoline (literally meaning: "flesh coloured", so varies...)', 184, 134, 11, swatch]) try: fin = open('/etc/X11/rgb.txt', 'rt') records = fin.readlines() fin.close() except: records = """ 245 255 250 MintCream 240 255 255 azure 240 248 255 alice blue 230 230 250 lavender 255 240 245 lavender blush """.split('\n') for rec in records: if len(rec.strip()) > 0 and rec[0] != '!' and rec.find('gray') == -1: rec = rec.strip().replace('\t', ' ') while rec.find(' ') != -1: rec = rec.replace(' ', ' ') r, g, b, desc = rec.split(' ', 3) r = int(r) g = int(g) b = int(b) swatch = self.getColouredPixmap(r, g, b) self.colour_list.append([desc.capitalize(), r, g, b, swatch]) if __name__ == "__main__": win = ListWindow() win.connect("destroy", Gtk.main_quit) win.show_all() Gtk.main()
内容的提问来源于stack exchange,提问作者Kingsley
相关产品推荐
相关产品推荐

