如何替换Tkinter Treeview长超链接显示文本并保留跳转功能
实现Treeview列显示短文本并保留超链接功能
可以实现这个需求,核心思路是将显示文本替换为“点击这里”,同时把真实链接存储起来,点击时读取存储的链接打开。以下是两种可行方案:
方案一:使用隐藏列存储真实链接
通过新增一个隐藏列存放长链接,界面只显示“点击这里”,点击时从隐藏列读取真实链接。
from tkinter import * from tkinter import ttk import webbrowser as wb root=Tk() root.title('Decision Tree') root.geometry("600x600") my_tree = ttk.Treeview(root) # 定义列:新增RealLink列用于存储真实链接 my_tree['columns'] = ("Decision", "RealLink", "Hyperlinks", "ID") # 格式化列:将RealLink列设为隐藏 my_tree.column("#0", width=250, minwidth=100) my_tree.column("#1", width=0, stretch="No") my_tree.column("RealLink", width=0, stretch="No") my_tree.column("Hyperlinks", anchor=W, width=200) my_tree.column("ID", anchor=CENTER, width=80) # 创建表头 my_tree.heading("#0", text="Decision", anchor=W) my_tree.heading("#1", text="", anchor=W) my_tree.heading("RealLink", text="", anchor=W) my_tree.heading("Hyperlinks", text="Hyperlinks", anchor=W) my_tree.heading("ID", text="ID", anchor=CENTER) # 顶层数据 my_tree.insert(parent='', index='1', iid=0, text="Problem 1", values=("", "", "", "1")) my_tree.insert(parent='', index='1', iid=2, text="Problem 2", values=("", "", "", "3")) my_tree.insert(parent='', index='1', iid=1, text="Problem 3", values=("", "", "", "2")) my_tree.tag_configure('tag1', foreground='Blue', font=('Helvetica' ,8, 'bold', 'italic')) # 添加子级:RealLink存真实链接,Hyperlinks显示"点击这里" my_tree.insert(parent='0', index='end', iid=6, text="Prob 1 level 2", values=("", "www.google.com", "点击这里", "1.1"), tags='tag1') my_tree.insert(parent='1', index='end', iid=7, text="Prob 3 level 2", values=("", "www.google.com", "点击这里", "3.1"), tags='tag1') my_tree.insert(parent='2', index='end', iid=8, text="Prob 2 level 2", values=("", "www.google.com", "点击这里", "2.1"), tags='tag1') # 二级子级数据 my_tree.insert(parent='6', index='end', iid=9, text="Prob 1 level 3", values=("", "", "", "1.11")) my_tree.insert(parent='7', index='end', iid=10, text="Prob 2 level 3", values=("", "", "", "2.21")) def open_link(event): tree = event.widget region = tree.identify_region(event.x, event.y) col = tree.identify_column(event.x) iid = tree.identify('item', event.x, event.y) # 判断点击的是Hyperlinks列单元格 if region == 'cell' and col == '#3': # 从隐藏列读取真实链接 link = tree.item(iid)['values'][1] wb.open_new_tab(link) # 绑定左键点击事件 my_tree.bind('<Button-1>', open_link) my_tree.pack(pady=20) root.mainloop()
方案二:使用字典映射iid与链接
无需新增列,用字典存储每行iid对应的真实链接,点击时通过iid查找链接。
from tkinter import * from tkinter import ttk import webbrowser as wb root=Tk() root.title('Decision Tree') root.geometry("600x600") my_tree = ttk.Treeview(root) # 定义原有列 my_tree['columns'] = ("Decision", "Hyperlinks", "ID") # 格式化列 my_tree.column("#0", width=250, minwidth=100) my_tree.column("#1", width=0, stretch="No") my_tree.column("Hyperlinks", anchor=W, width=200) my_tree.column("ID", anchor=CENTER, width=80) # 创建表头 my_tree.heading("#0", text="Decision", anchor=W) my_tree.heading("#1", text="", anchor=W) my_tree.heading("Hyperlinks", text="Hyperlinks", anchor=W) my_tree.heading("ID", text="ID", anchor=CENTER) # 顶层数据 my_tree.insert(parent='', index='1', iid=0, text="Problem 1", values=("", "", "1")) my_tree.insert(parent='', index='1', iid=2, text="Problem 2", values=("", "", "3")) my_tree.insert(parent='', index='1', iid=1, text="Problem 3", values=("", "", "2")) my_tree.tag_configure('tag1', foreground='Blue', font=('Helvetica' ,8, 'bold', 'italic')) # 定义字典存储iid与真实链接的映射 link_map = {} # 添加子级:Hyperlinks显示"点击这里",同时记录链接映射 my_tree.insert(parent='0', index='end', iid=6, text="Prob 1 level 2", values=("", "点击这里", "1.1"), tags='tag1') link_map[6] = "www.google.com" my_tree.insert(parent='1', index='end', iid=7, text="Prob 3 level 2", values=("", "点击这里", "3.1"), tags='tag1') link_map[7] = "www.google.com" my_tree.insert(parent='2', index='end', iid=8, text="Prob 2 level 2", values=("", "点击这里", "2.1"), tags='tag1') link_map[8] = "www.google.com" # 二级子级数据 my_tree.insert(parent='6', index='end', iid=9, text="Prob 1 level 3", values=("", "", "1.11")) my_tree.insert(parent='7', index='end', iid=10, text="Prob 2 level 3", values=("", "", "2.21")) def open_link(event): tree = event.widget region = tree.identify_region(event.x, event.y) col = tree.identify_column(event.x) iid = tree.identify('item', event.x, event.y) # 判断点击的是Hyperlinks列单元格 if region == 'cell' and col == '#2': # 通过iid从字典获取真实链接 link = link_map.get(iid) if link: wb.open_new_tab(link) # 绑定左键点击事件 my_tree.bind('<Button-1>', open_link) my_tree.pack(pady=20) root.mainloop()
两种方案都能实现需求:界面显示“点击这里”,点击后打开原长链接。方案一适合需要保留列结构的场景,方案二更简洁轻量。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

