tkinter Treeview:获取选定的项目值

Posted

技术标签:

【中文标题】tkinter Treeview:获取选定的项目值【英文标题】:tkinter Treeview: get selected item values 【发布时间】:2015-08-17 07:40:31 【问题描述】:

我只是从 python 3.4 中的一个小型 tkinter 树程序开始。

我坚持返回所选行的第一个值。 我有 4 列的多行,我在左键单击一个项目时调用一个函数:

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

功能:

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

这给了我这样的东西:

I003 <tkinter.Event object at 0x0179D130>

看起来所选项目已正确识别。 我现在只需要如何获取行中的第一个值。

树创建:

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()

【问题讨论】:

你能添加创建树的代码吗? (或者如果它太长,则更短但类似) 添加了树创建脚本。这不是我的整个程序,而是它的基本部分。 好像回调是在树中的焦点改变之前执行的,所以你总是得到之前选择的值。 感谢您的建议,这可能是真的,但我遇到的第一个问题仍然是:我如何返回所选行第一列中的值? 【参考方案1】:

要获取所选项目及其所有属性和值,可以使用item 方法:

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

这将输出一个字典,然后您可以从中轻松检索单个值:

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

还请注意,回调将在树中的焦点更改之前执行,即您将在单击新项目之前获得被选中的项目。解决此问题的一种方法是改用事件类型ButtonRelease

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

【讨论】:

谢谢,这正是我想要的。 如何从输出字典中获取特定值?你能解释一下吗? 完美、简单、实用 Nisarg Parekh: tree.item(curItem, 'text') 和 tree.item(curItem)['text'] 都将检索该项目的 'text' 元素。如果您想一次更改其他列,而不是使用 tree.item(curItem, 'values') 或 tree.item(curItem, values=['new', 'values', 'here']) 你可以使用 tree.set(curItem, 'time') 来检索或 tree.set(curItem, time='value') 来改变。【参考方案2】:

这是获取在 python tkinter 树视图中选择的行的信息的一个很好的例子。请允许我代表这里讨论的最终整洁的编码。我使用 python 3.8

from tkinter import *
from tkinter import ttk

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

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('<ButtonRelease-1>', selectItem)

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

tree.grid()
root.mainloop()

结果是

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

您可以复制、粘贴和尝试。挺好的。

【讨论】:

【参考方案3】:

如果您想将行作为列名:值对:

def selectItem(a):
    curRow = tree.set(a)
    loc_value = curRow["loc"]

或者你想通过列名获取单元格值

def selectItem(a):
    loc_value = tree.set(a, column="loc")

【讨论】:

以上是关于tkinter Treeview:获取选定的项目值的主要内容,如果未能解决你的问题,请参考以下文章

在 tkinter ttk treeview 中格式化单个单元格/项目而不是整行

如何从 Treeview / Tkinter (SQLite) 中的不同表中获取不同的值?

单击 Tkinter Treeview 小部件的项目的命令?

python tkinter treeview右键单击(Button-3)事件以选择树视图中的项目

WPF - MVVM Treeview获取所选项目[重复]

使用 tkinter Treeview 小部件显示目录内容