2016-05-09 7 views
1

Guess мы имеем TreeView которые содержат TreeStore здесь мой код:PyGObject: Как я мог бы получить выбранный элемент в 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 в терминале?

+0

Как было предложено по вашему последнему вопросу, пожалуйста, не используйте ненужные теги, такие как «pygtk» на ваши вопросы. Кроме того, если ответ на ваш предыдущий вопрос помог вам (поскольку вы используете его в своем коде), пожалуйста, примите ответ. – oldtechaa

ответ

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 

Update: Для выполнения этого кода при изменении выбора, добавьте этот код в конструктор:

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.

+0

, но где я включаю эту часть сэр ?? потому что, когда я пытаюсь это сделать, он дает мне ошибку: 'selected_treepath = selected_treepaths [0] # только одна строка может быть' 'выбрана' ' IndexError: индекс индекса вне диапазона –

+0

@AhmedBouabid Когда вы хотите распечатать Фидо на терминал? Вероятно, ошибка связана с тем, что вы вставляете код в конструктор вашего класса TreeStore. В то время выбор еще не существует. –

+0

, когда я запустил код, я покажу мне этот путь '> List One', тогда, если я нажму на список, один пункт отобразит мне 1,2,3,4,5 списка магазина. также у нас есть второй список '> List two' внутри нее, у меня есть foo и Fido,'> List Three' содержат spot.etc , поэтому мне нужно распечатать каждую выбранную строку из списка ListStore, когда когда-либо нажимается например если я нажму 1, покажу мне, что 1 нажата, если я нажму Fido, покажу, что Fido нажата, если я нажму «Spot» ... покажу, что пятно нажато ..... и т. д. по этому пути –