python - Python Tkinter Treeview(如何链接父母和孩子)
问题描述
您好,我想做类似的事情,您能建议一个允许我这样做的功能吗?谢谢
我在窗户上的东西:
- GrandParents
- Parents
Child1
Child2
- Parents2
Child3
- GrandParents2
Children
...
我想在控制台中得到什么:
GrandParents_Parents_Child1
GrandParents_Parents_Child2
GrandParents_Parents2_Child3
GrandParents2_Children
...
我的代码:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("Treeview")
entry = tk.Entry(root)
tv = ttk.Treeview()
menu = tk.Menu(root, tearoff = False)
def add():
if not tv.exists(entry.get()) and entry.get() != "":
if tv.selection() == ():
tv.insert('', 'end', entry.get(), text=entry.get())
else:
tv.insert(tv.selection()[0], 'end', entry.get(), text=entry.get())
def popup(event):
menu.tk_popup(event.x_root, event.y_root)
def unselect(event):
if len(tv.selection()) > 0:
tv.selection_remove(tv.selection()[0])
menu.add_command(label="Add", command=add)
tv.bind("<Button-3>", popup)
tv.bind("<Button-1>", unselect)
tv.pack()
entry.pack()
root.mainloop()
解决方案
我提供了一个小例子,你可以如何实现这一点。使用 item 的可选参数iid来识别它,并使用 Treeview 的parent(item)方法获取信息:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("Treeview")
entry = tk.Entry(root)
tv = ttk.Treeview()
#list of all parents of the selected item
parents = []
def get_parent(item):
parent = tv.parent(item)
parents.append(parent) #add parent to list
if tv.parent(parent): #if parent has a parent
get_parent(parent)
def get_tree(event):
selected = tv.selection()
if tv.parent(selected):
get_parent(selected)
print(f'the parantes of {selected} are {parents}')
parents.clear()#clear list after printing
##insert some items and use the optional parameter idd i.e. Grandparent
tv.insert('', 'end', 'Grandparent', text='Grandparent')
tv.insert('Grandparent', 'end', 'Parent', text='Parent')
tv.insert('Parent', 'end', 'Child', text='Child')
##bind treeview select event
tv.bind('<<TreeviewSelect>>', get_tree)
menu = tk.Menu(root, tearoff = False)
def add():
if not tv.exists(entry.get()) and entry.get() != "":
if tv.selection() == ():
tv.insert('', 'end', entry.get(), text=entry.get())
else:
tv.insert(tv.selection()[0], 'end', entry.get(), text=entry.get())
def popup(event):
menu.tk_popup(event.x_root, event.y_root)
def unselect(event):
if len(tv.selection()) > 0:
tv.selection_remove(tv.selection()[0])
menu.add_command(label="Add", command=add)
tv.bind("<Button-3>", popup)
tv.bind("<Button-1>", unselect)
tv.pack()
entry.pack()
root.mainloop()
推荐阅读
- azure-cosmosdb - 如何仅比较 cosmos db 中的日期部分
- javascript - 在 JS 蛇游戏中,不能在画布边框周围骑蛇
- node.js - 如何将 npm 包更新为最新提交?
- coq - 所有子目标均已满足,但无法集中证明
- javascript - 如何从 JS 中的函数访问父对象“this”?
- sql-server - 是否存在确保一列具有且仅匹配列的约束
- c# - 如何更好地在 WPF 中对图像列表框进行样式化?
- php - 单击链接时如何在新选项卡中查看 PDF?
- python - 避免 Networkx 中节点和边的重叠
- oracle - 如何在 obiee 中创建词/标签云