📜  PyGTK-TreeView类

📅  最后修改于: 2020-11-08 07:59:41             🧑  作者: Mango


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。要添加顶级项目,父级为“无”。

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,…)

除标题和渲染器外,它还需要零个或多个attribute = column对来指定要从哪个树模型列中检索属性的值。这些参数也可以使用下面给出的TreeViewColumn类的方法来设置。

gtk.CellRenderer是一组用于呈现不同类型数据的对象的基类。派生的类是CellRendererText,CellRendererPixBuf和CellRendererToggle。

TreeViewColumn类的以下方法用于配置其对象-

  • TreeViewColumn.pack_start(cell,expand = True)-此方法将CellRenderer对象打包到开始的列中。如果expand参数设置为True,则将整个分配空间的列分配给单元格。

  • TreeViewColumn.add_attribute(cell,attribute,column)-此方法将属性映射添加到树列中的列表。该是树模型的列。

  • TreeViewColumn.set_attributes()-此方法使用attribute =列对设置渲染器的属性位置

  • TreeViewColumn.set_visible()-如果为True,则树视图列可见

  • TreeViewColumn.set_title()-此方法将“ title”属性设置为指定的值。

  • TreeViewColumn.set_lickable()-如果设置为True,则标题可以占据键盘焦点并被单击。

  • TreeViewColumn.set_alignment(xalign)-此方法将“ alignment”属性设置为xalign的值。

当用户单击treeviewcolumn标题按钮时,将发出“ clicked”信号。

配置TreeViewColumn对象之后,使用append_column()方法将其添加到TreeView小部件中。

以下是TreeView类的重要方法-

  • TreevVew.set_model()-这将为树视图设置“模型”属性。如果树视图已经设置了模型,则此方法将在设置新模型之前将其删除。如果modelNone ,它将取消设置旧模型。

  • TreeView.set_header_clickable()-如果设置为True,则可以单击列标题按钮。

  • TreeView.append_column()-这会将指定的TreeViewColumn追加到列列表中。

  • TreeView.remove_column()-这将从树视图中删除指定的列。

  • TreeView.insert_column()-这会将指定的插入到由position指定的位置的树视图中。

TreeView小部件发出以下信号-

cursor-changed This is emitted when the cursor moves or is set.
expand-collapse-cursor-row This is emitted when the row at the cursor needs to be expanded or collapsed.
row-activated This is emitted when the user double clicks a treeview row
row-collapsed This is emitted when a row is collapsed by the user or programmatic action.
row-expanded This is emitted when a row is expanded via the user or programmatic action.

下面给出了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对象添加到“固定”容器中,将其放置在顶层窗口中。

例子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回调函数,用户选择的项目将显示在窗口的标签上。

带有ListStore的TreeView

例子2

第二个示例从TreeStore构建一个分层的TreeView。该程序遵循以下相同的顺序构建存储,将其设置为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显示为输出-

TreeView与TreeStore