Проблема с tag_bind() в текстовом виджете Text() tkinter
Хотел добавить HTML теги в виджет Text(). Проблема в строчке self.text.tag_bind("link", "", self.open_link) с text_bind(). Код брал отсюда.
import tkinter as tk
import webbrowser
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title("Демо HTML тегов")
self.text = tk.Text(self, width=50, height=10)
self.btn_link = tk.Button(self, text="Добавить ссылку",
command=self.add_hyperlink)
self.text.tag_config("link", foreground="blue", underline=1)
self.text.tag_bind("link", "", self.open_link)
self.text.tag_bind("link", "",
lambda _: self.text.config(cursor="hand2"))
self.text.tag_bind("link", "",
lambda e: self.text.config(cursor=""))
self.text.pack()
self.btn_link.pack(expand=True)
def add_hyperlink(self):
selection = self.text.tag_ranges(tk.SEL)
if selection:
self.text.tag_add("link", *selection)
def open_link(self, event):
position = "@{},{} + 1c".format(event.x, event.y)
index = self.text.index(position)
prevrange = self.text.tag_prevrange("link", index)
url = self.text.get(*prevrange)
webbrowser.open(url)
if __name__ == "__main__":
app = App()
app.mainloop()
Выдает ошибку:
self.tk.call(what + (sequence, cmd))
_tkinter.TclError: no events specified in binding
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
Вторым параметром для tag_bind нужно передавать событие, к которому привязывается указанная функция/метод/лямбда:
self.text.tag_bind("link", "<Button-1>", self.open_link) # Клик левой клавишей мыши
self.text.tag_bind("link", "<Enter>", # Наведение курсора мыши на объект ("hower")
lambda _: self.text.config(cursor="hand2"))
self.text.tag_bind("link", "<Leave>", # Смещение курсора с объекта
lambda e: self.text.config(cursor=""))
В приведенном источнике имена событий куда-то пропали, возможно имеет смысл сообщить об этом автору статьи.