将对象连接到 Treeview 小部件中的项目

Connect an Object to an item in a Treeview Widget

我使用 Python 在 Tkinter 中创建了一个 ttk/Treeview 小部件 3. 我想将一个对象连接到它在树视图中列出的名称。为了说明这一点,我创建了以下示例。

import tkinter as tk
from tkinter import ttk

class myclass:
    def __init__(self, name, value):
        self.name=name
        self.value=value

class maintree(ttk.Treeview):
    def __init__(self, master):        
        super().__init__(master)
        self.master = master
        self.my_objects= [myclass("object"+str(_), _) for _ in range(1,11)]
        for my_object in self.my_objects:
            self.insert("", "end", text=my_object.name)

def main(): 
    root = tk.Tk()
    maintree(root).grid()
    root.mainloop()

if __name__ == '__main__':
    main() 

在这个例子中,我想获取树视图中所选名称对应的my_class实例来做一些事情(即显示当前所选my_class对象的值)。

我只知道项目 ID,但不知道如何将某些东西与项目本身联系起来。我感觉我对 treeview 应该如何工作有一些误解。

感谢您的帮助!

insert 方法没有 command 选项。但是,您可以标记每个插入的项目并将标记绑定到事件。所以,我使用对象名称作为标签,然后将其绑定以在鼠标左键单击时执行对象的某些方法。

import tkinter as tk
from tkinter import ttk

class MyClass:
    def __init__(self, name, value):
        self.name=name
        self.value=value

    def callback(self, event=None):
        # event=None is a trick to be able to call the method both directly and 
        # from a binding (that will pass the event argument to the function)
        print(self.name, self.value)

class MainTree(ttk.Treeview):
    def __init__(self, master):        
        super().__init__(master)
        self.master = master
        self.my_objects= [MyClass("object"+str(_), _) for _ in range(1,11)]
        for my_object in self.my_objects:
            self.insert("", "end", text=my_object.name, tags=(my_object.name,))
            self.tag_bind(my_object.name, '<Button-1>', my_object.callback)

def main(): 
    root = tk.Tk()
    MainTree(root).grid()
    root.mainloop()

if __name__ == '__main__':
    main()