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 отображается как вывод -