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_FLIGHT
    • 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,…)
    
    除了标题和渲染器之外,它还需要零个或多个属性=列对来指定要从哪个树模型列中检索属性值。这些参数也可以使用下面给出的 TreeViewColumn 类的方法来设置。
    gtk.CellRenderer 是一组对象的基类,用于呈现不同类型的数据。派生类是 CellRendererText、CellRendererPixBuf 和 CellRendererToggle。
    TreeViewColumn 类的以下方法用于配置其对象 -
    • TreeViewColumn.pack_start(cell, expand = True) - 此方法将 CellRenderer 对象打包到开始列中。如果 expand 参数设置为 True,则将整个分配空间的列分配给单元格。
    • TreeViewColumn.add_attribute(cell, attribute, column) - 此方法将属性映射添加到树列中的列表。这column是树模型的列。
    • TreeViewColumn.set_attributes() - 此方法设置属性位置renderer使用attribute = column
    • TreeViewColumn.set_visible() - 如果True,树视图列可见
    • TreeViewColumn.set_title() - 此方法将“title”属性设置为指定的值。
    • TreeViewColumn.set_lickable() - 如果设置为 True,标题可以获取键盘焦点,并被单击。
    • TreeViewColumn.set_alignment(xalign) - 此方法将“对齐”属性设置为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() - 这插入指定的column在指定的位置进入树视图position.
    TreeView 小部件发出以下信号 -
    cursor-changed 当光标移动或设置时发出。
    expand-collapse-cursor-row 当光标处的行需要展开或折叠时发出。
    row-activated 当用户双击一个treeview
    row-collapsed 当用户或编程操作折叠行时会发出此消息。
    row-expanded 当通过用户或编程操作扩展行时会发出此消息。
    下面给出了 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 对象添加到 Fixed 容器,它被放置在顶层窗口中。
  • 示例 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函数被调用。
    带有 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 显示为输出 -
    带有 TreeStore 的 TreeView