我试图创建一个包含四列的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()
答案 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填充可用宽度。