Как мне составить список GTK 2 с множественным выбором? - PullRequest
0 голосов
/ 19 июня 2020

В выпуске GTK 3 добавлен виджет ListBox, поддерживающий несколько элементов, выбираемых из списка :

image

I'd like to achieve the same effect with GTK 2. I'm considering using a ScrolledWindow with a VBox of CheckButton's. I fear it's not going to look very good though; как это , но с полосой прокрутки :

Кто-нибудь знает хороший способ эмулировать функциональность в первом образе с помощью GTK 2?

1 Ответ

0 голосов
/ 19 июня 2020

Оказывается, был способ сделать это , скрытый в документации ! Фактически, вы должны найти его вплоть до GTK 2.0 , но константа выбора могла иметь другое имя (SELECTION_MULTI).

Виджет выглядит так:

A user interface with a list showing multiple elements selected

Цветовая схема унаследована от моей темы GNOME, так что не обращайте внимания на стиль окна. Этот виджет работает с клавишами Ctrl и Shift. Он не имеет автоматического множественного выбора, просто нажимая на разные элементы.

Вот (Python 2) MWE, который я сделал для этого:

import gtk


class UI(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)
        self.set_position(gtk.WIN_POS_CENTER)
        self.set_default_size(250, 150)

        store = gtk.ListStore(str)
        for i in range(7):
            # The list notation here is odd, but required.
            store.append(["Item %d" % i])

        tree_view = gtk.TreeView()
        tree_view.set_model(store)

        # The view can support a whole tree, but we want just a list.
        renderer = gtk.CellRendererText()
        column = gtk.TreeViewColumn("Multiple Selection", renderer, text=0)
        tree_view.append_column(column)

        # This is the part that enables multiple selection.
        tree_view.get_selection().set_mode(gtk.SELECTION_MULTIPLE)

        scrolled_tree = gtk.ScrolledWindow()
        scrolled_tree.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
        scrolled_tree.add_with_viewport(tree_view)

        self.add(scrolled_tree)


def main():
    win = UI()
    win.connect("destroy", gtk.main_quit)
    win.show_all()
    gtk.main()


if __name__ == "__main__":
    main()
...