如何让最后一个gtk.TreeViewColumn可调整大小?

6 投票
1 回答
1973 浏览
提问于 2025-04-16 22:07

你可以使用 gtk.TreeViewColumn.set_resizable(True) 这个方法,让表格的列可以手动调整大小……除了最后一列,它总是会占满剩余的空间。

虽然这样在大多数情况下是合理的,但我在使用带滚动条的TreeView时,希望最后一列也能缩小或扩展。

目前我使用了以下的临时解决办法:

def add_dummy_column(treeview):

    def put_dummy_last(treeview, dummy):
        columns = treeview.get_columns()
        last = next(reversed(columns), None)
        if not last or last == dummy:
            return
        if dummy in columns:
            treeview.move_column_after(dummy, last)
        else:
            treeview.append_column(dummy)

    dummy = gtk.TreeViewColumn()
    dummy.set_min_width(1)
    dummy.set_fixed_width(1)
    dummy.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
    dummy.set_resizable(False)
    dummy.set_expand(False)
    treeview.connect('columns-changed', put_dummy_last, dummy)
    return dummy

不过,这个临时列总是会造成一些麻烦:让TreeView的列循环变得复杂等等。有没有更好、更优雅的解决方案呢?

更新:其实这个方法是有效的

在尝试制作一个简单的示例时,我发现其实不需要我的临时解决办法也能正常工作。这里是一个不使用gtk.ScrolledWindow的简单示例:

import gtk

window = gtk.Window()
window.connect('destroy', lambda *args: gtk.main_quit())

vbox = gtk.VBox()
window.add(vbox)

table = gtk.TreeView(gtk.ListStore(str, str, str))

for i in range(3):
    column = gtk.TreeViewColumn('Column {}'.format(1 + i))
    column.set_resizable(True)
    column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
    column.set_min_width(20)
    column.set_fixed_width(80)
    column.set_expand(False)
    table.append_column(column)

vbox.pack_start(table)

vbox.pack_start(gtk.Statusbar(), False)

window.set_default_size(300, 300)
window.show_all()
gtk.main()

试着缩小最后一列——这是不可能的。不过,如果你把

vbox.pack_start(table)

改成

container = gtk.ScrolledWindow()
vbox.pack_start(container)
container.add(table)

你就可以轻松地扩展和缩小最后一列了。

1 个回答

2

如果你能提供一个完整的、可以运行的示例,那就更容易帮到你了! :)

不过,老实说,如果我理解你的问题没错的话(我不敢保证我完全理解),你可能是从错误的角度在思考这个问题:你所说的“调整最后一列的大小”,其实是“调整树形视图容器的大小”。

如果是这样的话,你只需要在滚动窗口和树形视图之间加一个可以调整大小的容器就可以了。

希望这对你有帮助!

撰写回答