Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将对象连接到Treeview小部件中的项目_Python_Tkinter_Ttk - Fatal编程技术网

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

Python 将对象连接到Treeview小部件中的项目,python,tkinter,ttk,Python,Tkinter,Ttk,我使用Python3在Tkinter中创建了一个ttk/Treeview小部件。我想将一个对象连接到树状视图中列出的名称。为了说明这一点,我创建了以下示例 import tkinter as tk from tkinter import ttk class myclass: def __init__(self, name, value): self.name=name self.value=value class maintree(ttk.Treevi

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

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_类实例来执行某些操作(即,显示当前所选my_类对象的值)

我只知道项目ID,但不知道如何将某些内容连接到项目本身。我觉得我对treeview的工作原理有一些误解


我感谢你的帮助

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

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() 
将tkinter作为tk导入
从tkinter导入ttk
类别MyClass:
定义初始化(自身、名称、值):
self.name=name
自我价值=价值
def回调(自,事件=无):
#event=None是一个技巧,可以直接调用方法,也可以直接调用方法
#来自绑定(将事件参数传递给函数)
打印(self.name、self.value)
类MainTree(ttk.Treeview):
定义初始(自我,主):
超级()。\uuuu初始化\uuuuu(主)
self.master=master
self.my_objects=[MyClass(“object”+str(u),u)表示范围(1,11)内的u]
对于self.my_对象中的my_对象:
self.insert(“,”end“,text=my\u object.name,tags=(my\u object.name,))
self.tag_bind(my_object.name',my_object.callback)
def main():
root=tk.tk()
MainTree(根).grid()
root.mainloop()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

首先:非常感谢!进一步:我可以扩展此方法以处理其他方法(例如使用箭头键)的选择更改吗?我现在使用
id(my_对象)
作为标记名,因为这为每个对象提供了唯一的id。另外,在
self.tag\u bind…
行之后添加
self.tag\u bind(id(my\u object),'',my\u object.callback)
可以让您通过键盘执行回调,这与我在前面的评论中所要求的非常接近。在查看Treeview小部件的属性后,我发现每当选择发生变化时,无论是项目被选中还是未被选中,小部件都会生成一个“事件”。因此,用“”替换“”应该可以满足您的需要。