We're back after a server migration that caused effbot.org to fall over a bit harder than expected. Expect some glitches.

Tkinter Text Widget Hyperlink Manager

October 25, 2000 | Fredrik Lundh

The tkHyperlinkManager module is a simple container for Text widget hyperlinks. Just create a manager for your text widget, and use the add method to register actions.

    text = Text(...)
    hyperlink = HyperlinkManager(text)
    text.insert(INSERT, "this is a link", hyperlink.add(callback))

Here’s the code:

Support module for Text hyperlinks (File: tkHyperlinkManager.py)
from Tkinter import *

class HyperlinkManager:

    def __init__(self, text):

	self.text = text

	self.text.tag_config("hyper", foreground="blue", underline=1)

	self.text.tag_bind("hyper", "<Enter>", self._enter)
	self.text.tag_bind("hyper", "<Leave>", self._leave)
	self.text.tag_bind("hyper", "<Button-1>", self._click)

	self.reset()

    def reset(self):
	self.links = {}

    def add(self, action):
        # add an action to the manager.  returns tags to use in
        # associated text widget
	tag = "hyper-%d" % len(self.links)
	self.links[tag] = action
	return "hyper", tag

    def _enter(self, event):
	self.text.config(cursor="hand2")

    def _leave(self, event):
	self.text.config(cursor="")

    def _click(self, event):
	for tag in self.text.tag_names(CURRENT):
	    if tag[:6] == "hyper-":
		self.links[tag]()
		return

And here’s an example:

# File: hyperlink-1.py

import tkHyperlinkManager

from Tkinter import *

root = Tk()
root.title("hyperlink-1")

text = Text(root)
text.pack()

hyperlink = tkHyperlinkManager.HyperlinkManager(text)

def click1():
    print "click 1"

text.insert(INSERT, "this is a ")
text.insert(INSERT, "link", hyperlink.add(click1))
text.insert(INSERT, "\n\n")

def click2():
    print "click 2"

text.insert(INSERT, "this is another ")
text.insert(INSERT, "link", hyperlink.add(click2))
text.insert(INSERT, "\n\n")

mainloop()