PyGTK - Класс TreeView
Виджет 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 () имеет два параметра: parent и row. Чтобы добавить элемент верхнего уровня, parent - 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 в начальный столбец. Если для параметра expand установлено значение True, ячейке назначается все выделенное пространство столбцов.
TreeViewColumn.add_attribute (ячейка, атрибут, столбец) - этот метод добавляет отображение атрибута в список в столбце дерева. Вcolumn столбец модели дерева.
TreeViewColumn.set_attributes () - этот метод устанавливает расположение атрибутов renderer используя attribute = column пары
TreeViewColumn.set_visible () - Если True, столбец древовидной структуры виден
TreeViewColumn.set_title () - этот метод устанавливает свойство "title" на указанное значение.
TreeViewColumn.set_lickable () - если установлено значение True, заголовок может принимать фокус клавиатуры и быть нажатым.
TreeViewColumn.set_alignment (xalign) - этот метод устанавливает для свойства "alignment" значение xalign.
Сигнал «нажатие» излучается, когда пользователь нажимает кнопку заголовка столбца treeviewcolumn .
После настройки объекта TreeViewColumn он добавляется в виджет TreeView с помощью метода append_column ().
Ниже приведены важные методы класса TreeView:
TreevVew.set_model () - устанавливает свойство «модель» для древовидной структуры. Если в древовидном представлении уже установлена модель, этот метод удалит ее перед установкой новой модели. Еслиmodel является None, это отключит старую модель.
TreeView.set_header_clickable () - если установлено значение True, кнопки заголовка столбца можно нажимать.
TreeView.append_column () - добавляет указанный TreeViewColumn к списку столбцов.
TreeView.remove_column () - удаляет указанный столбец из древовидной структуры.
TreeView.insert_column () - вставляет указанный column в древовидное представление в месте, указанном position.
Виджет TreeView излучает следующие сигналы -
курсор-изменен | Это испускается, когда курсор перемещается или установлен. |
развернуть-свернуть-строку курсора | Это излучается, когда строку под курсором необходимо развернуть или свернуть. |
активированный строкой | Это излучается, когда пользователь дважды щелкает treeview строка |
свернутый ряд | Это происходит, когда строка сворачивается пользователем или программным действием. |
расширенный по строкам | Это генерируется, когда строка расширяется с помощью пользовательского или программного действия. |
Ниже приведены два примера виджета TreeView. В первом примере для создания простого ListView используется ListStore.
Здесь создается объект 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 помещается в окно верхнего уровня путем добавления его в фиксированный контейнер.
Пример 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_activated callback вызывается функция.
Пример 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 отображается как вывод -