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

如何防止Gtk ListBox条目被缩小(避免文本不可读)

解决Gtk ListBox条目随数量增加被压缩的问题

问题核心是:当ScrolledWindow内的ListBox条目过多时,自动生成的ListBoxRow默认允许垂直方向收缩,导致内部标签被挤压变形。你之前给内部Box设置set_size_request无效,是因为需要对ListBoxRow本身进行限制,而非它的子控件。

以下是两种有效解决方案:

方案一:直接设置ListBoxRow属性

修改你的add_list_box_entry方法,获取添加Box后自动生成的ListBoxRow,设置其垂直方向不可收缩,保持自然高度:

def add_list_box_entry(self, lhs, rhs, lbox, set_min_size=False):
    box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5)
    
    # 左侧标签:左对齐,允许水平扩展
    lhs_label = Gtk.Label(label=lhs, xalign=0)
    lhs_label.set_hexpand(True)
    box.pack_start(lhs_label, True, True, 1)
    
    # 右侧标签:右对齐,不扩展
    rhs_label = Gtk.Label(label=f'({rhs})')
    rhs_label.set_halign(Gtk.Align.END)
    box.pack_start(rhs_label, False, False, 5)
    
    # 添加Box到ListBox,获取对应的ListBoxRow
    row = lbox.add(box)
    
    # 关键设置:阻止Row垂直收缩,保持自身自然高度
    row.set_vexpand(False)
    row.set_valign(Gtk.Align.FILL)
    
    # 可选:基于Box的自然高度设置Row的最小高度(非固定像素)
    if set_min_size:
        min_height, _ = box.get_preferred_height()
        row.set_size_request(-1, min_height)

方案二:用CSS全局控制ListBoxRow样式

如果希望所有ListBox条目统一保持最小高度,用CSS更简洁,且使用相对单位避免固定像素:

在初始化ListBox时添加以下代码:

self.test_list = Gtk.ListBox()
self.test_list.connect("row_activated", some_method)

# 创建CSS提供者
css_provider = Gtk.CssProvider()
# 用em单位(基于字体大小)设置最小高度和内边距,适配不同显示环境
css_provider.load_from_data(b"""
listboxrow {
    min-height: 1.5em;
    padding: 4px 8px;
}
""")

# 将CSS应用到全局屏幕
screen = Gdk.Screen.get_default()
Gtk.StyleContext.add_provider_for_screen(
    screen,
    css_provider,
    Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
)

self.test_list_window.add(self.test_list)

这两种方法都能有效阻止ListBox条目被压缩,且不需要依赖固定像素高度,适配性更好。

内容的提问来源于stack exchange,提问作者Carcophan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:25:52