Всегда видимые и липкие столбцы в Gtk.TreeView - PullRequest
1 голос
/ 28 марта 2019

У меня есть Gtk.TreeView с 3 столбцами, вставленными в Gtk.Paned.

enter image description here

При изменении размера окна (или заполнении большего количества строк длинным текстом в первом столбце) последние два столбца не должны исчезнуть.

Я хочу, чтобы последние два столбца всегда были видны и , прикрепленные к правой стороне без потери левых столбцов.

После нажатия кнопки, чтобы добавить очень длинную строку, первый столбец не должен расти. Вид этого (быстрый и грязный манипулированный скриншот):

Как это должно выглядеть

enter image description here

Но как это выглядит (но не должно)

enter image description here

В документе я не вижу способа реализовать это. В этом примере код ниже 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()

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Требуются как минимум два изменения:

  1. Чтобы столбец имел нормальный размер с длинной строкой, установите свойство ellipsize для GtkCellRendererText.Это должно быть PangoEllipsizeMode.

  2. Чтобы два правых столбца прилипли к концу, разверните первый столбец, чтобы занять все оставшееся пространство, установив для свойства expand значение * 1013.*.

Создание вашего столбца с такими изменениями:

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, никогда раньше не использовал это.

1 голос
/ 28 марта 2019

Помимо ответа, предоставленного @RandomUser, вы также можете использовать столбец фиксированного размера. Пример:

col_a.set_fixed_width(150)

Добавление set_expand обеспечит другое действие:

col_a.set_expand(True)
...