samtun samtun - 5 months ago 28
Python Question

python tkinter tree get selected item values

I'm just starting with a small tkinter tree program in python 3.4.

I'm stuck with returning the first value of the row selected.
I have multiple rows with 4 columns and I am calling an a function on left-click on a item:

tree.bind('<Button-1>', selectItem)


The function:

def selectItem(a):
curItem = tree.focus()
print(curItem, a)


This gives me something like this:

I003 <tkinter.Event object at 0x0179D130>


It looks like the selected item gets identified correctly.
All I need now is how to get the first value in the row.

tree-creation:

from tkinter import *
from tkinter import ttk

def selectItem():
pass

root = Tk()
tree = ttk.Treeview(root, columns=("size", "modified"))
tree["columns"] = ("date", "time", "loc")

tree.column("date", width=65)
tree.column("time", width=40)
tree.column("loc", width=100)

tree.heading("date", text="Date")
tree.heading("time", text="Time")
tree.heading("loc", text="Loc")
tree.bind('<Button-1>', selectItem)

tree.insert("","end",text = "Name",values = ("Date","Time","Loc"))

tree.grid()
root.mainloop()

Answer

To get the selected item and all its attributes and values, you can use the item method:

def selectItem(a):
    curItem = tree.focus()
    print tree.item(curItem)

This will output a dictionary, from which you can then easily retrieve individual values:

{'text': 'Name', 'image': '', 'values': [u'Date', u'Time', u'Loc'], 'open': 0, 'tags': ''}

Also note that the callback will be executed before the focus in the tree changed, i.e. you will get the item that was selected before you clicked the new item. One way to solve this is to use the event type ButtonRelease instead.

tree.bind('<ButtonRelease-1>', selectItem)