Добавление ссылки на текст в текстовом виджете в Tkinter - PullRequest
0 голосов
/ 14 мая 2018

Я создаю программу уведомления о песне на python, используя Tkinter и bs4.Я извлек песни и соответствующие им URL-адреса с сайта.Я использовал текстовый виджет для хранения песен и их URL-адреса в качестве значения ключа в словаре.

Теперь я хочу добавить ссылки на название песни (хранится в текстовом виджете), чтобы при нажатии на конкретную песню,его URL-адрес открыт в Chrome.

Вот фрагмент кода:

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()

Вот пример вывода:

enter image description here

1 Ответ

0 голосов
/ 14 мая 2018

У меня не было проблем. Создайте файл с именем «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

Импортируйте его в свою программу и вставьте ссылки. Я предоставил образцы данных, которые кажутся разумными. Список песен Болливуда с гиперссылками, а список международных песен - нет. Я просто демонстрация механизма. Вы должны будете написать все обратные вызовы и веб-интерфейс самостоятельно.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...