PyGObject:我怎样才能在treeStore中获取所选项目

时间:2016-05-09 16:17:08

标签: python gtk gtk3 pygobject

猜猜我们的TreeView包含一个TreeStore,这里是我的代码:

#!/usr/bin/python
# coding=utf-8
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk

class TreeStore(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_default_size(200, 200)
        self.connect("destroy", Gtk.main_quit)

        mylist = ["1","2","3","4","5"]

        scrolledwindow = Gtk.ScrolledWindow()
        scrolledwindow.set_hexpand(True)
        scrolledwindow.set_vexpand(True)
        self.add(scrolledwindow)

        treestore = Gtk.TreeStore(str)
        ListOne = treestore.append(None, ["List One"])
        ListTwo = treestore.append(None, ["List Two"])
        ListThree = treestore.append(None, ["List Three"])


        treeview = Gtk.TreeView()
        treeview.set_model(treestore)
        scrolledwindow.add(treeview)

        cellrenderertext = Gtk.CellRendererText()

        treeviewcolumn = Gtk.TreeViewColumn("Lists")
        treeview.append_column(treeviewcolumn)
        treeviewcolumn.pack_start(cellrenderertext, True)
        treeviewcolumn.add_attribute(cellrenderertext, "text", 0)

        for listItem in mylist:
            treestore.append(ListOne, [listItem])

        treestore.append(ListTwo, ["foo"])
        treestore.append(ListTwo, ["Fido"])
        treestore.append(ListThree, ["Spot"])

window = TreeStore()
window.show_all()

Gtk.main()

然后在这里输出
enter image description here
例如,我从列表二中选择Fido,我怎样才能选择,在终端中准确地获取和打印Fido?

1 个答案:

答案 0 :(得分:1)

首先,您需要获取关联的TreeSelection对象。然后,您可以使用get_selected_rows()获取指向所选项目的树路径列表。使用这些树路径来检索文本并完成。

treestore, selected_treepaths= treeview.get_selection().get_selected_rows()
selected_treepath= selected_treepaths[0] # only one row can be selected
selected_row= treestore[selected_treepath]
text= selected_row[0] # index 0 because this is a TreeStore with only one item of type str
print text

更新:要在选择更改时运行此代码,请将此代码添加到构造函数中:

class TreeStore(Gtk.Window):
    def __init__(self):
        ...
        treeview.connect('cursor-changed', self.selection_changed)

每次选择更新时都会调用此函数:

def selection_changed(self, treeview):
    treestore, selected_treepaths= treeview.get_selection().get_selected_rows()
    selected_treepath= selected_treepaths[0] # only one row can be selected
    if len(selected_treepath)==1: # check if a toplevel node is selected
        # get a TreeIter to iterate over all children
        treeiter= treestore.get_iter(selected_treepath)
        treeiter= treestore.iter_children(treeiter)
        children= []
        while treeiter:
            children.append(treestore[treeiter][0]) # treestore[treeiter] gives us the row,
                                                    # [0] gives us the text in that row
            treeiter= treestore.iter_next(treeiter) # move on to the next child
        print ','.join(children)
    else: # not a toplevel node
        selected_row= treestore[selected_treepath]
        text= selected_row[0] # index 0 because this is a TreeStore with only one item of type str
        print text

这将检查是否选择了顶级节点(列表一,列表二,列表三),并打印出相关项目。可以找到相关文档(针对TreeIters和TreePaths)here