Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Hyperlink Messagebox prototype

By: jncornett on Nov 22nd, 2012  |  syntax: Python  |  size: 2.36 KB  |  views: 88  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. import re
  2. import webbrowser
  3. from Tkinter import *
  4.  
  5. class HyperlinkMessageBox(Toplevel):
  6.     hyperlinkPattern = re.compile(r'<a href="(?P<address>.*?)">(?P<title>.*?)'
  7.                                   '</a>')
  8.     def __init__(self, master, title=None, message=None, **options):
  9.         Toplevel.__init__(self, master)
  10.         self.geometry("200x200")
  11.         self.title(title or master.title())
  12.         self.text = Text(self, wrap=WORD, bg=master.cget('bg'),
  13.                          height=self.cget('height'))
  14.         self._formatHyperLink(message)
  15.         self.text.config(state=DISABLED)
  16.         self.text.pack(side=TOP, fill=X)
  17.         self.makeButtons()
  18.  
  19.     def makeButtons(self):
  20.         Button(self, text="Ok",
  21.                command=lambda *a, **k: self.destroy()).pack()
  22.  
  23.     def _formatHyperLink(self, message):
  24.         text = self.text
  25.         start = 0
  26.         for index, match in enumerate(self.hyperlinkPattern.finditer(message)):
  27.             groups = match.groupdict()
  28.             text.insert("end", message[start: match.start()])
  29.             #insert hyperlink tag here
  30.             text.insert("end", groups['title'])
  31.             text.tag_add(str(index),
  32.                          "end-%dc" % (len(groups['title']) + 1),
  33.                          "end",)
  34.             text.tag_config(str(index),
  35.                             foreground="blue",
  36.                             underline=1)
  37.             text.tag_bind(str(index),
  38.                           "<Enter>",
  39.                           lambda *a, **k: text.config(cursor="hand"))
  40.             text.tag_bind(str(index),
  41.                           "<Leave>",
  42.                           lambda *a, **k: text.config(cursor="arrow"))
  43.             text.tag_bind(str(index),
  44.                           "<Button-1>",
  45.                           self._callbackFactory(groups['address']))
  46.             start = match.end()
  47.         else:
  48.             text.insert("end", message[start:])
  49.  
  50.     def _callbackFactory(self, url):
  51.         return lambda *args, **kwargs: webbrowser.open(url)
  52.        
  53.    
  54. if __name__ == "__main__":
  55.     import re
  56.     def dirsel(obj, search):
  57.         for item in dir(obj):
  58.             if re.search(search, item):
  59.                 print item
  60.  
  61.     root = Tk()
  62.     h = HyperlinkMessageBox(root, "My App", 'Some message <a href="http://www.google.com">Google</a>.')
  63.     root.mainloop()