TreeView 类(TreeView Class)
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是多列树小部件的模型。 例如,以下语句创建一个存储,其中一列包含字符串项。
Store = gtk.TreeStore(gobject.TYPE_STRING)
要在TreeStore中添加项目,请使用append()方法。 append()方法有两个参数,parent和row。 要添加顶级项,父级为“无”。
row1 = store.append(None, ['row1'])
您需要重复此语句以添加多行。
要添加子行,请将toplevel行作为父参数传递给append()方法 -
childrow = store.append(row1, ['child1'])
您需要重复此语句以添加多个子行。
现在,创建一个TreeView小部件并使用上面的TreeStore对象作为模型。
treeview = gtk.TreeView(store)
我们现在必须创建TreeViewColumn来显示商店数据。 gtk.TreeViewColumn的对象使用gtk.CelRenderer管理标题和单元格。 使用以下构造函数创建TreeViewColumn对象 -
gtk.TreeViewColumn(title, cell_renderer,…)
除了title和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) - 此方法将属性映射添加到树列中的列表。 该column是树模型的列。
TreeViewColumn.set_attributes() - 此方法使用attribute = column对设置renderer的属性位置
TreeViewColumn.set_visible() - 如果为True,则树视图列可见
TreeViewColumn.set_title() - 此方法将“title”属性设置为指定的值。
TreeViewColumn.set_lickable() - 如果设置为True,标题可以获得键盘焦点,然后单击。
TreeViewColumn.set_alignment(xalign) - 此方法将“alignment”属性设置为xalign的值。
当用户单击treeviewcolumn标题按钮时,将发出“单击”信号。
配置TreeViewColumn对象后,使用append_column()方法将其添加到TreeView小部件中。
以下是TreeView类的重要方法 -
TreevVew.set_model() - 设置树视图的“model”属性。 如果树视图已经有模型集,则此方法将在设置新模型之前将其删除。 如果model为None ,则会取消设置旧模型。
TreeView.set_header_clickable() - 如果设置为True,则可以单击列标题按钮。
TreeView.append_column() - 这将指定的TreeViewColumn追加到列列表中。
TreeView.remove_column() - 这将从树视图中删除指定的列。
TreeView.insert_column() - 这将指定的column插入到树视图中由position指定的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对象添加到固定容器,将其放置在顶层窗口上。
例子1 (Example 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 (Example 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显示为输出 -