📅  最后修改于: 2020-11-08 07:59:41             🧑  作者: Mango
Treeview小部件显示实现gtk.TreeModel接口的模型的内容。 PyGTK提供以下类型的模型-
ListStore是一个列表模型。当与gtk.TreeView小部件关联时,它会产生一个列表框,其中包含要从中选择的项目。使用以下语法声明gtk.ListStore对象-
store = gtk.ListStore(column_type)
一个列表可能有多列,预定义的类型常量是-
例如,用于存储字符串项目的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()-这将为树视图设置“模型”属性。如果树视图已经设置了模型,则此方法将在设置新模型之前将其删除。如果model为None ,它将取消设置旧模型。
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对象添加到“固定”容器中,将其放置在顶层窗口中。
观察以下代码-
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回调函数,用户选择的项目将显示在窗口的标签上。
第二个示例从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显示为输出-