Gtk.TreeView 中始终可见且粘性的列
Always visible and sticky columns in Gtk.TreeView
我有这个 Gtk.TreeView
,其中 3 列嵌入到 Gtk.Paned
。
当我调整 window 大小时(或在第一列中用更长的文本填充更多行),最后两列不应消失。
我想让最后两列始终可见并且粘在右边而不丢失左边的列。
单击按钮添加一个很长的字符串后,第一列不应增长。有点像这样(快速和肮脏的操作截图):
它应该是什么样子
但看起来如何(但不应该)
我在文档中看不到实现它的方法。在下面的示例代码中,Gtk.TreeView
嵌入到 Gtk.ScrolledWindow
中以允许垂直滚动条。
#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import GLib
class TreeView(Gtk.TreeView):
def __init__(self):
# model
self.model = Gtk.ListStore.new([str, int, int])
for i in range(1, 6):
self.model.append([('text {} '.format(i))*i, i*10, i])
# view
Gtk.TreeView.__init__(self, self.model)
col_a = Gtk.TreeViewColumn('str',
Gtk.CellRendererText(single_paragraph_mode=True),
text=0)
col_b = Gtk.TreeViewColumn('int',
Gtk.CellRendererText(),
text=1)
col_c = Gtk.TreeViewColumn('int',
Gtk.CellRendererText(),
text=2)
self.append_column(col_a)
self.append_column(col_b)
self.append_column(col_c)
# scrollable
self.scroll = Gtk.ScrolledWindow()
self.scroll.add(self)
self.scroll.set_policy(hscrollbar_policy=Gtk.PolicyType.NEVER,
vscrollbar_policy=Gtk.PolicyType.AUTOMATIC)
def on_button(self, event):
self.model.append(['long text '*20, 0, 0])
class Window(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title='Mein Gtk-Fenster')
#self.set_default_size(100, 120)
# tree & button
self.view = TreeView()
self.btn = Gtk.Button('add long row')
self.btn.connect('clicked', self.view.on_button)
# layout
#box = Gtk.VBox()
#box.pack_start(self.btn, False, False, 10)
#box.pack_start(self.view.scroll, True, True, 10)
#self.add(box)
self.paned = Gtk.Paned.new(orientation=Gtk.Orientation.HORIZONTAL)
self.paned.pack1(self.view.scroll)
self.paned.pack2(self.btn)
self.add(self.paned)
self.connect('destroy', Gtk.main_quit)
self.show_all()
if __name__ == '__main__':
win = Window()
Gtk.main()
至少需要进行两项更改:
要使长字符串的列保持正常大小,请设置 GtkCellRendererText
的 ellipsize
属性。应该是 PangoEllipsizeMode
.
为了让右边的两列坚持到最后,通过将 expand
属性 设置为 [=,扩展第一列以获取所有剩余的 space 15=].
您创建的专栏进行了这些更改:
col_a = Gtk.TreeViewColumn('str',
Gtk.CellRendererText(single_paragraph_mode=True,
ellipsize=Pango.EllipsizeMode.END),
text=0)
col_a.set_expand(True)
认为您不需要 single-paragraph-mode
,以前从未使用过。
除了@RandomUser 提供的答案外,您还可以使用固定大小的列。示例:
col_a.set_fixed_width(150)
添加 set_expand 将提供不同的操作:
col_a.set_expand(True)
我有这个 Gtk.TreeView
,其中 3 列嵌入到 Gtk.Paned
。
当我调整 window 大小时(或在第一列中用更长的文本填充更多行),最后两列不应消失。
我想让最后两列始终可见并且粘在右边而不丢失左边的列。
单击按钮添加一个很长的字符串后,第一列不应增长。有点像这样(快速和肮脏的操作截图):
它应该是什么样子
但看起来如何(但不应该)
我在文档中看不到实现它的方法。在下面的示例代码中,Gtk.TreeView
嵌入到 Gtk.ScrolledWindow
中以允许垂直滚动条。
#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import GLib
class TreeView(Gtk.TreeView):
def __init__(self):
# model
self.model = Gtk.ListStore.new([str, int, int])
for i in range(1, 6):
self.model.append([('text {} '.format(i))*i, i*10, i])
# view
Gtk.TreeView.__init__(self, self.model)
col_a = Gtk.TreeViewColumn('str',
Gtk.CellRendererText(single_paragraph_mode=True),
text=0)
col_b = Gtk.TreeViewColumn('int',
Gtk.CellRendererText(),
text=1)
col_c = Gtk.TreeViewColumn('int',
Gtk.CellRendererText(),
text=2)
self.append_column(col_a)
self.append_column(col_b)
self.append_column(col_c)
# scrollable
self.scroll = Gtk.ScrolledWindow()
self.scroll.add(self)
self.scroll.set_policy(hscrollbar_policy=Gtk.PolicyType.NEVER,
vscrollbar_policy=Gtk.PolicyType.AUTOMATIC)
def on_button(self, event):
self.model.append(['long text '*20, 0, 0])
class Window(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title='Mein Gtk-Fenster')
#self.set_default_size(100, 120)
# tree & button
self.view = TreeView()
self.btn = Gtk.Button('add long row')
self.btn.connect('clicked', self.view.on_button)
# layout
#box = Gtk.VBox()
#box.pack_start(self.btn, False, False, 10)
#box.pack_start(self.view.scroll, True, True, 10)
#self.add(box)
self.paned = Gtk.Paned.new(orientation=Gtk.Orientation.HORIZONTAL)
self.paned.pack1(self.view.scroll)
self.paned.pack2(self.btn)
self.add(self.paned)
self.connect('destroy', Gtk.main_quit)
self.show_all()
if __name__ == '__main__':
win = Window()
Gtk.main()
至少需要进行两项更改:
要使长字符串的列保持正常大小,请设置
GtkCellRendererText
的ellipsize
属性。应该是PangoEllipsizeMode
.为了让右边的两列坚持到最后,通过将
expand
属性 设置为 [=,扩展第一列以获取所有剩余的 space 15=].
您创建的专栏进行了这些更改:
col_a = Gtk.TreeViewColumn('str',
Gtk.CellRendererText(single_paragraph_mode=True,
ellipsize=Pango.EllipsizeMode.END),
text=0)
col_a.set_expand(True)
认为您不需要 single-paragraph-mode
,以前从未使用过。
除了@RandomUser 提供的答案外,您还可以使用固定大小的列。示例:
col_a.set_fixed_width(150)
添加 set_expand 将提供不同的操作:
col_a.set_expand(True)