Как сделать последний размер gtk.TreeViewColumn изменяемым? - PullRequest
5 голосов
/ 23 июля 2011

Можно использовать gtk.TreeViewColumn.set_resizable(True), чтобы изменить размер столбца вручную ... кроме последнего столбца - он всегда занимает доступное пространство.

Хотя в большинстве случаев это разумно, я использую TreeView-in-a-ScrolledView, и мне бы хотелось иметь возможность сжимать / расширять последний столбец.

В настоящее время я используюследующий ключ:

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 голосов
/ 23 июля 2011

Было бы легче помочь, если бы вы опубликовали отдельный рабочий пример, с которым мы могли бы поиграть! :)

Однако - если я правильно понимаю ваш вопрос (в чем я не уверен на 100%, если честно) - возможно, вы думаете о проблеме в неправильных терминах: то, что вы называете «изменением размера последнего столбца» на самом деле "изменение размера контейнера дерева".

Если это так, вы должны просто добавить изменяемый размер контейнера между прокручиваемым окном и представлением дерева.

НТН!

...