【问题标题】:PyGObject : How could i get selected item in treeStorePyGObject:我如何在 treeStore 中获得选定的项目
【发布时间】:2016-05-09 16:17:08
【问题描述】:

猜猜我们有包含 TreeStore 的 TreeView 这是我的代码:

#!/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()

然后这是输出

例如这里我从列表二中选择了Fido,我怎样才能被选中,在终端中准确获取并打印 Fido?

【问题讨论】:

  • 正如您上一个问题所建议的那样,请不要在您的问题上使用不相关的标签,例如pygtk。此外,如果您之前问题的答案对您有所帮助(因为您在代码中使用它),请接受答案。

标签: python gtk gtk3 pygobject


【解决方案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 找到。

【讨论】:

  • 但是我在哪里包括那部分先生?因为当我尝试它时,它给了我一个错误说selected_treepath= selected_treepaths[0] # only one row can beselectedIndexError: list index out of range
  • @AhmedBouabid 你想什么时候将 Fido 打印到终端?该错误可能是因为您将代码放入 TreeStore 类的构造函数中。那时还没有选择。
  • ,当我运行代码时,我会以这种方式显示> List One,然后如果我单击列表一项,我将显示 1、2、3、4、5 我的项目的列表存储。我们还有第二个列表是 > List two 在她里面我有 foo 和 Fido ,> List Three 包含点 ..etc 所以我需要在点击时打印所有 listStore 的每个选定行,例如,如果我点击 1 显示我 1被点击,如果我点击 Fido 显示我 Fido 被点击,如果我点击 Spot ... 向我显示 Spot 被点击 .....etc 以这种方式
  • @AhmedBouabid 答案已更新。下次请尝试在原始问题中提及您的所有要求。您的问题不包含“每次选择更改时打印”或“打印 1,2,3,4,5”。
猜你喜欢
  • 2015-03-26
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多