Is there way to replace the value that is displayed (in this case a very long hyperlink) in a Tkinter treeview column with something shorter (but it still open the hyperlink)? The example I have is similar to the screenshot below, except the Google link is actually a very long OneNote link. I would like to be able to replace the text that is displayed with a "Click Here". So for this example, "Click Here" would take the user to
The code I'm using to add the hyperlink is as follows:
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)
#Define the columns
my_tree['columns'] = ("Decision", "Hyperlinks", "ID")
#format the columns
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)
#Create Headings
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)
#Add Data (Top Level)
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'))
#Add child level 1
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',)
#Add child level 2
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 # get the treeview widget
region = tree.identify_region(event.x, event.y)
col = tree.identify_column(event.x)
iid = tree.identify('item', event.x, event.y)
if region == 'cell' and col == '#2':
link = tree.item(iid)['values'][1] # get the link from the selected row
wb.open_new_tab(link) # open the link in a browser tab
# bind left-click to 'open_link'
my_tree.bind('<Button-1>', open_link)
#pack to the screen
my_tree.pack(pady=20)
root.mainloop()
CodePudding user response:
You can store the links in a dictionary, with the key being whatever you want to display to the user. Then it’s just a matter of looking up the link when the user clicks.
Another alternative is to put the actual link in a hidden column.