Гиперссылка в текстовом виджете Tkinter?

Я разрабатываю часть своего текущего программного проекта и хочу использовать ссылки вместо Buttons. Я действительно не хотел использовать Text виджет, но это все, что я мог найти, когда я гуглил тему. Во всяком случае, я нашел пример этого, но продолжаю получать эту ошибку:

TclError: bitmap "blue" not defined

когда я добавляю эту строку кода (с помощью IDLE)

hyperlink = tkHyperlinkManager.HyperlinkManager(text)

код модуля находится здесь и код для скрипта местонахождение здесь

у кого-нибудь есть идеи?

часть, которая дает проблемы говорит foreground="blue", который известен как цвет в Tkinter, не так ли?

2 ответов


Если вы не хотите использовать текстовый виджет, вам не нужно. Альтернативой является использование метки и привязка к ней щелчков мыши. Несмотря на то, что это ярлык, он все еще реагирует на события.

например:

import tkinter as tk

class App:
    def __init__(self, root):
        self.root = root
        for text in ("link1", "link2", "link3"):
            link = tk.Label(text=text, foreground="#0000ff")
            link.bind("<1>", lambda event, text=text: self.click_link(event, text))
            link.pack()

    def click_link(self, event, text):
        print("You clicked '%s'" % text)

root = tk.Tk()
app = App(root)
root.mainloop()

Если вы хотите, вы можете получить фантазии и добавить дополнительную привязку к <Enter> и <Leave> события, чтобы вы могли изменить внешний вид, когда пользователь зависает. И, конечно же, вы можете изменить шрифт так, чтобы текст подчеркивался, если вы так решите.

Tk является замечательный инструментарий, который дает вам строительные блоки, чтобы сделать почти все, что вы хотите. Вам просто нужно смотреть на виджеты не как на набор готовых стен и дверей, а скорее как на груду поясничных, кирпичей и раствора.


"blue" действительно должно быть приемлемо (так как вы находитесь в Windows, Tkinter должен использовать встроенную таблицу имен цветов-это может быть системная неправильная конфигурация на X11, но не на Windows); поэтому это озадачивающая проблема (возможно, неправильное представление Tkinter...?). Что произойдет, если вы используете foreground="#00F" вместо этого, например? Это не объясняет проблему, но может позволить вам обойти ее, по крайней мере...