0
votes

I am creating a song notification program in python using Tkinter and bs4. I have extracted songs and their corresponding urls from a site. I have used text widget to store songs and have their urls as key value in a dictionary.

Now I want to add links to the songs name(stored in text widget) so that when I click a particular song, its url is opened in chrome.

Here is the snippet of Code:

from tkinter import *
import webbrowser
from bollywood_top_50 import bollywood_songs_list , bollywood_songs_dict
from international_top_50 import international_songs_list


b_songs_list  = bollywood_songs_list()
b_songs_dict =  bollywood_songs_dict()
i_songs_list = international_songs_list()

root = Tk()
S = Scrollbar(root)
T = Text(root, height=20, width=30,cursor="hand2")
S.pack(side=RIGHT, fill=Y)
T.pack(side=LEFT, fill=Y)
S.config(command=T.yview)
T.config(yscrollcommand=S.set)    


def callback_a():
    T.delete(1.0,END)
    for songs in b_songs_list:
       T.insert(END, songs + '\n')   

def callback_b():
    T.delete(1.0,END)
    for songs in i_songs_list:
        T.insert(END, songs + '\n')        

bollywood_button = Button(root,text="Bollywood-Top-50", command=callback_a)
bollywood_button.pack()

international_button = Button(root,text="International-Top-50", command=callback_b)
international_button.pack()

Here is the sample output:

enter image description here

1
When i tried importing tkHyperlinkManager...It doesn't import anything..but when i run program using tkHyperlinkManager.. No such module error is presented..Abhishek Sharma

1 Answers

4
votes

I had no problem. Create a file called "tkHyperlinkManager.py" that contains:

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

Import it to your program and insert links. I've supplied sample data which seems reasonable. The list of Bollywood songs are with hyperlinks and the list of International songs are not. I'ts just a demonstration of the mechanism. You will have to write all the callbacks and web interface yourself.

from tkinter import *
from tkHyperlinkManager import *

b_songs_list  = ['Bollywood song 1','Bollywood song 2','Bollywood song 3']
i_songs_list = ['International song 1','International song 2','International song 3']

root = Tk()
S = Scrollbar(root)
T = Text(root, height=20, width=30,cursor="hand2")
hyperlink = HyperlinkManager(T)
S.pack(side=RIGHT, fill=Y)
T.pack(side=LEFT, fill=Y)
S.config(command=T.yview)
T.config(yscrollcommand=S.set)    

def click1():
    print('click1')

def callback_a():   # Bollywood songs WITH hyperlinks
    T.delete(1.0,END)
    for songs in b_songs_list:
       T.insert(END, songs, hyperlink.add(click1))
       T.insert(END, '\n')

def callback_b():
    T.delete(1.0,END)
    for songs in i_songs_list:
        T.insert(END, songs + '\n')        

bollywood_button = Button(root,text="Bollywood-Top-50", command=callback_a)
bollywood_button.pack()

international_button = Button(root,text="International-Top-50", command=callback_b)
international_button.pack()