Python 将对象连接到Treeview小部件中的项目
我使用Python3在Tkinter中创建了一个ttk/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
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小部件的属性后,我发现每当选择发生变化时,无论是项目被选中还是未被选中,小部件都会生成一个“事件”。因此,用“”替换“”应该可以满足您的需要。