Виджет Treeview отображает содержимое модели, реализующей интерфейс gtk.TreeModel. PyGTK предоставляет следующие типы моделей —
- gtk.ListStore
- gtk.TreeStore
- gtk.TreeModelSort
ListStore — это модель списка. При связывании с виджетом gtk.TreeView он создает поле списка, содержащее элементы для выбора. Объект gtk.ListStore объявлен со следующим синтаксисом:
store = gtk.ListStore(column_type)
Список может иметь несколько столбцов, предопределенные константы типа:
- gobject.TYPE_BOOLEAN
- gobject.TYPE_BOXED
- gobject.TYPE_CHAR
- gobject.TYPE_DOUBLE
- gobject.TYPE_ENUM
- gobject.TYPE_FLOAT
- gobject.TYPE_INT
- gobject.TYPE_LONG
- gobject.TYPE_NONE
- gobject.TYPE_OBJECT
- gobject.TYPE_STRING
- gobject.TYPE_UCHAR
- gobject.TYPE_UINT
- gobject.TYPE_ULONG
- gtk.gdk.pixbuf и т. д.
Например, объект ListStore для хранения строковых элементов объявляется как —
store = gtk.ListStore(gobject.TYPE_STRING
Для добавления товаров в магазин используются методы append () —
store.append (["item 1"])
TreeStore — модель для многоколонного виджета Tree. Например, следующий оператор создает хранилище с одним столбцом, имеющим строковый элемент.
Store = gtk.TreeStore(gobject.TYPE_STRING)
Чтобы добавить элементы в TreeStore, используйте метод append (). Метод append () имеет два параметра, родительский и строковый. Чтобы добавить элемент верхнего уровня, родительский None.
row1 = store.append(None, ['row1'])
Вам нужно повторить этот оператор, чтобы добавить несколько строк.
Чтобы добавить дочерние строки, передайте строку верхнего уровня в качестве родительского параметра в метод append () —
childrow = store.append(row1, ['child1'])
Вам нужно повторить этот оператор, чтобы добавить несколько дочерних строк.
Теперь создайте виджет TreeView и используйте вышеуказанный объект TreeStore в качестве модели.
treeview = gtk.TreeView(store)
Теперь нам нужно создать TreeViewColumn для отображения данных магазина. Объект gtk.TreeViewColumn управляет заголовком и ячейками, используя gtk.CelRenderer. Объект TreeViewColumn создается с помощью следующего конструктора —
gtk.TreeViewColumn(title, cell_renderer,…)
В дополнение к заголовку и средству визуализации требуется ноль или более пар атрибут = столбец, чтобы указать, из какого столбца модели дерева следует извлечь значение атрибута. Эти параметры также могут быть установлены с использованием методов класса TreeViewColumn, приведенных ниже.
Gtk.CellRenderer — это базовый класс для набора объектов для визуализации различных типов данных. Производными классами являются CellRendererText, CellRendererPixBuf и CellRendererToggle.
Следующие методы класса TreeViewColumn используются для настройки его объекта:
-
TreeViewColumn.pack_start (cell, expand = True) — этот метод упаковывает объект CellRenderer в начальный столбец. Если для параметра расширения установлено значение «Истина», ячейке выделяется все выделенное пространство столбцов.
-
TreeViewColumn.add_attribute (ячейка, атрибут, столбец) — этот метод добавляет отображение атрибута в список в столбце дерева. Столбец является столбцом модели дерева.
-
TreeViewColumn.set_attributes () — этот метод устанавливает расположение атрибутов средства визуализации, используя пары attribute = column
-
TreeViewColumn.set_visible () — если True, столбец дерева виден
-
TreeViewColumn.set_title () — этот метод устанавливает для свойства «title» указанное значение.
-
TreeViewColumn.set_lickable () — если установлено значение True, заголовок может иметь фокус клавиатуры и быть нажатым.
-
TreeViewColumn.set_alignment (xalign) — этот метод устанавливает для свойства «alignment» значение xalign .
TreeViewColumn.pack_start (cell, expand = True) — этот метод упаковывает объект CellRenderer в начальный столбец. Если для параметра расширения установлено значение «Истина», ячейке выделяется все выделенное пространство столбцов.
TreeViewColumn.add_attribute (ячейка, атрибут, столбец) — этот метод добавляет отображение атрибута в список в столбце дерева. Столбец является столбцом модели дерева.
TreeViewColumn.set_attributes () — этот метод устанавливает расположение атрибутов средства визуализации, используя пары attribute = column
TreeViewColumn.set_visible () — если True, столбец дерева виден
TreeViewColumn.set_title () — этот метод устанавливает для свойства «title» указанное значение.
TreeViewColumn.set_lickable () — если установлено значение True, заголовок может иметь фокус клавиатуры и быть нажатым.
TreeViewColumn.set_alignment (xalign) — этот метод устанавливает для свойства «alignment» значение xalign .
Сигнал «нажал» испускается, когда пользователь нажимает кнопку заголовка древовидного столбца .
После настройки объекта TreeViewColumn он добавляется в виджет TreeView с помощью метода append_column ().
Ниже приведены важные методы класса TreeView:
-
TreevVew.set_model () — устанавливает свойство «модель» для дерева. Если древовидная структура уже имеет набор моделей, этот метод удалит его перед настройкой новой модели. Если модель None , это приведет к сбросу старой модели.
-
TreeView.set_header_clickable () — при значении True можно нажимать кнопки заголовка столбца.
-
TreeView.append_column () — это добавляет указанный TreeViewColumn к списку столбцов.
-
TreeView.remove_column () — удаляет указанный столбец из дерева.
-
TreeView.insert_column () — вставляет указанный столбец в древовидную структуру в месте, указанном позицией .
TreevVew.set_model () — устанавливает свойство «модель» для дерева. Если древовидная структура уже имеет набор моделей, этот метод удалит его перед настройкой новой модели. Если модель None , это приведет к сбросу старой модели.
TreeView.set_header_clickable () — при значении True можно нажимать кнопки заголовка столбца.
TreeView.append_column () — это добавляет указанный TreeViewColumn к списку столбцов.
TreeView.remove_column () — удаляет указанный столбец из дерева.
TreeView.insert_column () — вставляет указанный столбец в древовидную структуру в месте, указанном позицией .
Виджет TreeView излучает следующие сигналы:
курсора изменился | Это испускается, когда курсор перемещается или установлен. |
развернуть свернуть-курсор-строка | Это испускается, когда строка в курсоре должна быть расширена или свернута. |
Ряд активированных | Это излучается, когда пользователь дважды щелкает строку дерева |
рядный разрушились | Это испускается, когда строка свернута пользователем или программным действием. |
рядного расширен | Это испускается, когда строка раскрывается с помощью пользователя или программного действия. |
Два примера виджета TreeView приведены ниже. Первый пример использует ListStore для создания простого ListView.
Здесь создается объект ListStore и к нему добавляются строковые элементы. Этот объект ListStore используется в качестве модели для объекта TreeView —
store = gtk.ListStore(str) treeView = gtk.TreeView() treeView.set_model(store)
Затем CellRendererText добавляется к объекту TreeViewColumn, и то же самое добавляется к TreeView.
rendererText = gtk.CellRendererText() column = gtk.TreeViewColumn("Name", rendererText, text = 0) treeView.append_column(column)
TreeView Object помещается в окно верхнего уровня, добавляя его в фиксированный контейнер.
Пример 1
Соблюдайте следующий код —
import pygtk pygtk.require('2.0') import gtk class PyApp(gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title("TreeView with ListStore") self.set_default_size(250, 200) self.set_position(gtk.WIN_POS_CENTER) store = gtk.ListStore(str) store.append (["PyQt"]) store.append (["Tkinter"]) store.append (["WxPython"]) store.append (["PyGTK"]) store.append (["PySide"]) treeView = gtk.TreeView() treeView.set_model(store) rendererText = gtk.CellRendererText() column = gtk.TreeViewColumn("Python GUI Libraries", rendererText, text=0) treeView.append_column(column) fixed = gtk.Fixed() lbl = gtk.Label("select a GUI toolkit") fixed.put(lbl, 25,75) fixed.put(treeView, 125,15) lbl2 = gtk.Label("Your choice is:") fixed.put(lbl2, 25,175) self.label = gtk.Label("") fixed.put(self.label, 125,175) self.add(fixed) treeView.connect("row-activated", self.on_activated) self.connect("destroy", gtk.main_quit) self.show_all() def on_activated(self, widget, row, col): model = widget.get_model() text = model[row][0] self.label.set_text(text) def main(): gtk.main() return if __name__ == "__main__": bcb = PyApp() main()
Выбранный пользователем элемент отображается на ярлыке в окне при вызове функции обратного вызова on_activation .
Пример 2
Второй пример строит иерархическое TreeView из TreeStore. Эта программа следует той же последовательности построения хранилища, установки его в качестве модели для TreeView, разработки TreeViewColumn и добавления его в TreeView.
import gtk class PyApp(gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title("TreeView with TreeStore") self.set_size_request(400,200) self.set_position(gtk.WIN_POS_CENTER) vbox = gtk.VBox(False, 5) # create a TreeStore with one string column to use as the model store = gtk.TreeStore(str) # add row row1 = store.append(None, ['JAVA']) #add child rows store.append(row1,['AWT']) store.append(row1,['Swing']) store.append(row1,['JSF']) # add another row row2 = store.append(None, ['Python']) store.append(row2,['PyQt']) store.append(row2,['WxPython']) store.append(row2,['PyGTK']) # create the TreeView using treestore treeview = gtk.TreeView(store) tvcolumn = gtk.TreeViewColumn('GUI Toolkits') treeview.append_column(tvcolumn) cell = gtk.CellRendererText() tvcolumn.pack_start(cell, True) tvcolumn.add_attribute(cell, 'text', 0) vbox.add(treeview) self.add(vbox) self.connect("destroy", gtk.main_quit) self.show_all() PyApp() gtk.main()
Следующее TreeView отображается в качестве вывода —