在tkinter.treeview中选择一个单元格并获取单元格数据

5
我想使用鼠标指针选择由tkinter.treeview()创建的表格中的单元格,并打印出单元格的值。我该怎么做?
以下是创建tkinter.treeview表格的示例代码。在这种情况下,我想使用鼠标指针单击其中一个值,比如“机场”。但是,当我单击该单元格时,整行(即小部件项)会被选中。我该如何避免这种情况,以便获得我想要的结果?
import tkinter as tk
import tkinter.ttk as ttk

class App(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        ttk.Frame.__init__(self, parent, *args, **kwargs)
        self.tree = ttk.Treeview(parent, columns=("size", "modified"))
        self.tree["columns"] = ("date", "time", "loc")

        self.tree.column("date", width=80)
        self.tree.column("time", width=80)
        self.tree.column("loc", width=100)

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

        self.tree.insert("","end",text = "Name",values = ("Date","Time","Loc"))
        self.tree.insert("","end",text = "John",values = ("2017-02-05","11:30:23","Airport"))
        self.tree.insert("","end",text = "Betty",values = ("2014-06-25","18:00:00","Orchard Road"))

        self.tree.grid()

    def selectItem(self, event):
        curItem = self.tree.focus()
        print (self.tree.item(curItem))


if __name__ == "__main__":
    window = tk.Tk()
    app = App(window)
    window.mainloop()

你无法仅突出显示单个单元格,但可以获取所单击的单元格的值。这是你想要的吗?你是否查看了Treeview小部件的文档,以了解有助于了解所单击内容的方法? - Bryan Oakley
是的,那就是我想要的。.identify_element(x, y) 是方法吗? - Sun Bear
当不使用画布时,我如何获取鼠标指针的x和y坐标? - Sun Bear
1
使用事件对象中的x,y值。这些坐标是相对于小部件的。pointerxy返回相对于屏幕的坐标。 - Bryan Oakley
2
你发布的代码展示了所选项目所有列的值,现在你声称已经弄清楚了用户单击的是哪一列。把它们结合起来。 - Bryan Oakley
显示剩余3条评论
1个回答

10

得益于Bryan Oakley的指导,我已经修正了selectItem回调函数为:

def selectItem(self, event):
    curItem = self.tree.item(self.tree.focus())
    col = self.tree.identify_column(event.x)
    print ('curItem = ', curItem)
    print ('col = ', col)

    if col == '#0':
        cell_value = curItem['text']
    elif col == '#1':
        cell_value = curItem['values'][0]
    elif col == '#2':
        cell_value = curItem['values'][1]
    elif col == '#3':
        cell_value = curItem['values'][2]
    print ('cell_value = ', cell_value)

它给了我我想要的东西。希望这个脚本能帮助其他有同样问题的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接