如何防止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
相关产品推荐
相关产品推荐

