You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Gtk3 TreeViewColumn超长文本如何自动加省略号截断?

解决方案

只需修改3处代码即可实现需求:

  1. 导入Pango依赖库,用于配置文本省略规则
  2. 为Name列的文本渲染器开启末尾自动追加省略号的特性
  3. 将滚动区域的水平滚动策略设为禁用,彻底避免横向滚动

修改后完整可运行代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:45:03