PyGTK TreeView:防止最后一列增长

时间:2014-12-14 22:21:39

标签: python pygtk gtktreeview

我试图创建一个包含四列的gtk.TreeView,其中前两列可以调整大小,后两列可以调整。换句话说,我希望第三和第四列占用固定数量的空间,我希望第一列和第二列以用户想要的任何比例共享剩余空间。

我的问题是我无法阻止最后一栏增长和缩小。下面的代码应突出显示此问题:如果您运行此代码并尝试调整第一列或第二列的大小,则最后一列将构成差异。

我知道我想要做什么,因为我已经看过其他GTK GUI。两个例子是"信号"林间空地对话和歌曲列表"在quodlibet。感谢有关如何使其发挥作用的任何想法。

import pygtk; pygtk.require('2.0')
import gtk
import pango

window = gtk.Window()
model = gtk.TreeStore(object)
view = gtk.TreeView(model)

columns = [
        ('first', True),
        ('second', True),
        ('third', False),
        ('fourth', False),
]
rows = [
        {
            'first': 'Lorem ipsum dolor sit amet',
            'second': 'consectetur adipiscing elit',
            'third': 'Nam justo sem',
            'fourth': 'malesuada ut ultricies ac',
        }, {
            'first': 'Praesent sit amet nibh turpis',
            'second': 'vitae lacinia metus',
            'third': 'Ut nisi lacus',
            'fourth': 'pretium a diam',
        }
]
for row in rows:
    model.append(None, (row,))

def cell_data_func(column, renderer, model, iter, field):
    text = model.get_value(iter, 0)[field]
    renderer.set_property('text', text)

for field, expand in columns:
    text_renderer = gtk.CellRendererText()
    column = gtk.TreeViewColumn(field, text_renderer)
    column.set_cell_data_func(text_renderer, cell_data_func, field)

    if expand:
        column.set_expand(True)
        column.set_resizable(True)
        text_renderer.set_property('ellipsize', pango.ELLIPSIZE_END)
    else:
        column.set_expand(False)
        column.set_resizable(False)

    view.append_column(column)

window.set_default_size(700, -1)
window.add(view)
window.show_all()
window.connect('destroy', lambda *args: gtk.main_quit())

gtk.main()

2 个答案:

答案 0 :(得分:1)

添加第五列没有任何文字,可以扩展功能并享受:)

.
.
.
columns = [
        ('first', True),
        ('second', True),
        ('third', False),
        ('fourth', False),
        ('', True),
]
.
.
.

答案 1 :(得分:0)

以下是使用Horrizontal Box包装器修改的代码:

import pygtk; pygtk.require('2.0')
import gtk
import pango

window = gtk.Window()
model = gtk.TreeStore(object)
view = gtk.TreeView(model)

columns = [
        ('first', True),
        ('second', True),
        ('third', False),
        ('fourth', False),
]
rows = [
        {
            'first': 'Lorem ipsum dolor sit amet',
            'second': 'consectetur adipiscing elit',
            'third': 'Nam justo sem',
            'fourth': 'malesuada ut ultricies ac',
        }, {
            'first': 'Praesent sit amet nibh turpis',
            'second': 'vitae lacinia metus',
            'third': 'Ut nisi lacus',
            'fourth': 'pretium a diam',
        }
]
for row in rows:
    model.append(None, (row,))

def cell_data_func(column, renderer, model, iter, field):
    text = model.get_value(iter, 0)[field]
    renderer.set_property('text', text)

for field, expand in columns:
    text_renderer = gtk.CellRendererText()
    column = gtk.TreeViewColumn(field, text_renderer)
    column.set_cell_data_func(text_renderer, cell_data_func, field)

    if expand:
        column.set_expand(True)
        column.set_resizable(True)
        text_renderer.set_property('ellipsize', pango.ELLIPSIZE_END)
    else:
        column.set_expand(False)
        column.set_resizable(False)

    view.append_column(column)

window.set_default_size(700, -1)
vertial_panes = gtk.HBox()
vertial_panes.pack_start(view, expand=False)
right_hand_space = gtk.HBox()
vertial_panes.pack_start(right_hand_space, expand=False)
window.add(vertial_panes)
window.show_all()
window.connect('destroy', lambda *args: gtk.main_quit())

gtk.main()

这个概念是由于expand=False,tableview将只分配与其需求一样多的宽度。 right_hand_space可以是任何元素,其展开状态无关紧要,因为GTK将使父HBox填充可用宽度。