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

时间:2017-01-25 15:34:35

标签: python tkinter ttk

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

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,但我不知道如何将商品连接到商品本身。我觉得我对树视图应该如何运作有一些误解。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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