You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:35:23