Вывести имя родителя для каждого выбора, когда выбрано несколько узлов в дереве Tkinter - PullRequest
0 голосов
/ 17 октября 2019

Я хочу, чтобы пользователь выбирал несколько узлов из разных веток дерева Tkinter. Чтобы я мог продолжить процесс, я должен знать родительскую ветвь каждого выбора.

  • Когда я выбираю только один узел, я могу получить родительский идентификатор, используя приведенный ниже код.
  • Когда я выбираю несколько узлов (нажимая клавишу ctrl), я просто получаю родительскийузел первого выбора

Как мне получить родительский узел для всех выборов, выполненных одновременно?

Вот мой рабочий код:

import ttk
import Tkinter as tk

def select():
    item_iid = tree.selection()[0]
    parent_iid = tree.parent(item_iid)
    node = tree.item(parent_iid)['text']
    print node

root = tk.Tk()
tree = ttk.Treeview(root,show="tree")#, selectmode=EXTENDED)  
tree.config(columns=("col1"))

#SUb treeview
style = ttk.Style(root)
style.configure("Treeview")
tree.configure(style="Treeview")

tree.insert("", "0", "item1", text="Branch1",)
tree.insert("", "1", "item2", text="Branch2")

#sub tree using item attribute to achieve that
tree.insert("item1", "1", text="FRED")
tree.insert("item1", "1", text="MAVIS")
tree.insert("item1", "1", text="BRIGHT")

tree.insert("item2", "2", text="SOME")
tree.insert("item2", "2", text="NODES")
tree.insert("item2", "2", text="HERE")

tree.pack(fill=tk.BOTH, expand=True)
tree.bind("<Return>", lambda e: select()) 

root.mainloop()

Текущий вывод:

enter image description here

Может отображать имя родителя при выборе только одного узла

Когда выполняется множественный выбор родительского элемента только первого отображаемого, ожидаяимя родителя для каждого выбранного узла.

Отображается Branch1, т.е. только для первого выбора:

enter image description here

1 Ответ

1 голос
/ 17 октября 2019

selection ()

Возвращает кортеж выбранных элементов.

(источник) (выделено мной)


.selection() возвращает кортеж всех элементов, выбранных в Treeview. В первой строке функции вы явно выбираете только первый элемент:

def select():
    item_iid = tree.selection()[0] #<---Right here you tell Python that you only want to use the first item from the tuple.
    parent_iid = tree.parent(item_iid)
    node = tree.item(parent_iid)['text']
    print node

Внесение простого изменения в функцию, позволяющее выполнить цикл по всем элементам кортежа, разрешит это:

def select():
    for i in tree.selection():
        item_iid = i
        parent_iid = tree.parent(item_iid)
        node = tree.item(parent_iid)['text']
        print(node)
...