【问题标题】:PyGTK TreeView: Prevent last column from growingPyGTK TreeView:防止最后一列增长
【发布时间】:2014-12-14 22:21:38
【问题描述】:

我正在尝试制作一个具有四列的 gtk.TreeView,其中前两列可以调整大小,而后两列不能。换句话说,我希望第三列和第四列占据固定的空间,并且我希望第一列和第二列以用户想要的任何比例共享剩余空间。

我的问题是我无法阻止最后一列的增长和缩小。下面的代码应该会突出这个问题:如果您运行此代码并尝试调整第一列或第二列的大小,最后一列将弥补差异。

我知道我想要什么可以做到,因为我见过其他 GTK GUI 可以做到这一点。两个例子是glade 中的“信号”对话框和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()

【问题讨论】:

    标签: python pygtk gtktreeview


    【解决方案1】:

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

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

    【讨论】:

    • 是的,这行得通,但我很沮丧,这种解决方法并不能真正让我满意。
    【解决方案2】:

    这是您使用 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 填满可用的宽度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 2013-06-23
      • 2019-05-31
      • 1970-01-01
      相关资源
      最近更新 更多