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

将Gtk.TreeView嵌入Gtk.ScrolledWindow后滚动条滑块比例异常

Gtk.ScrolledWindow嵌入TreeView后滚动条滑块比例失调的解决方案

问题说明

把Gtk.TreeView嵌入Gtk.ScrolledWindow实现滚动功能时,遇到滚动条滑块比例失调(尺寸过大)的问题:TreeView当前仅显示3行,下方还有7行未展示,预期滑块比例应为1/3,但实际滑块大小不符合预期。鼠标滚轮和键盘箭头键的滚动功能正常,手动修改滚动条页面大小也无法解决该问题。

最小复现代码

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class TreeViewScrollIssue(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="TreeView Scroll Issue")
        self.set_default_size(200, 100)

        scrolled_window = Gtk.ScrolledWindow()
        scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
        self.add(scrolled_window)

        liststore = Gtk.ListStore(str)
        # 添加10行数据,仅显示3行
        for i in range(10):
            liststore.append([f"Row {i+1}"])

        treeview = Gtk.TreeView(model=liststore)
        renderer = Gtk.CellRendererText()
        column = Gtk.TreeViewColumn("Rows", renderer, text=0)
        treeview.append_column(column)

        scrolled_window.add(treeview)

win = TreeViewScrollIssue()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

解决方法

通过内嵌CSS设置滚动条滑块(slider)和滑道(trough)的最小尺寸,让滚动条能正确计算滑块比例。修改后的完整代码如下:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk

class TreeViewScrollFix(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="TreeView Scroll Fix")
        self.set_default_size(200, 100)

        # 加载CSS修复滚动条滑块比例
        css_provider = Gtk.CssProvider()
        css_style = """
        scrollbar slider {
            min-height: 20px;
        }
        scrollbar trough {
            min-height: 80px;
        }
        """
        css_provider.load_from_data(css_style.encode())
        Gtk.StyleContext.add_provider_for_screen(
            Gdk.Screen.get_default(),
            css_provider,
            Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
        )

        scrolled_window = Gtk.ScrolledWindow()
        scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
        self.add(scrolled_window)

        liststore = Gtk.ListStore(str)
        for i in range(10):
            liststore.append([f"Row {i+1}"])

        treeview = Gtk.TreeView(model=liststore)
        renderer = Gtk.CellRendererText()
        column = Gtk.TreeViewColumn("Rows", renderer, text=0)
        treeview.append_column(column)

        scrolled_window.add(treeview)

win = TreeViewScrollFix()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

原理说明

限制滑块的最小高度,避免因TreeView显示行数较少导致滑块被过度拉伸;同时设置滑道的最小高度,让滚动条能基于TreeView的实际内容高度计算滑块比例,最终使滑块尺寸符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:47:19