Определить ссылки в тексте и возможность взаимодействия с ней
Как определить в tkinter в тексте ссылку? Возможно как-то ее выделить и если возможно, то при нажатии на нее открыть браузер с ней.
from tkinter import *
from tkinter import scrolledtext
window = Tk()
txtscroll = scrolledtext.ScrolledText(window, width=20, height=20)
txtscroll.insert(INSERT, 'https://google.com')
txtscroll.config(state='disabled')
txtscroll.grid(row=0, column=0, sticky=W+NS+E, padx=(5,5), pady=(5,5))
window.mainloop()
Ответы (2 шт):
Автор решения: Игорь Крещенников
→ Ссылка
Можно через регулярные выражения искать:
import re
import webbrowser
from tkinter import *
from tkinter import scrolledtext
def open_link(event):
try:
start, end = event.widget.tag_prevrange("link", "insert")
except ValueError:
start, end = "1.0", "1.0"
link = event.widget.get(start, end)
webbrowser.open_new_tab(link)
window = Tk()
txtscroll = scrolledtext.ScrolledText(window, width=20, height=20)
txtscroll.insert(INSERT, 'произвольный текст https://google.com произвольный текст '
'https://ru.stackoverflow.com/questions/1497622/')
txtscroll.grid(row=0, column=0, sticky=W + NS + E, padx=(5, 5), pady=(5, 5))
# привязываем регулярное выражение к событию нажатия на ссылку
txtscroll.tag_config("link", foreground="blue", underline=1)
regex = r'\b(https?://[^\s]+)\b'
for match in re.finditer(regex, txtscroll.get("1.0", END)):
start = txtscroll.index("1.0 + %d chars" % match.start())
end = txtscroll.index(start + " +%d chars" % len(match.group(0)))
txtscroll.tag_add("link", start, end)
txtscroll.tag_bind("link", "<Button-1>", open_link)
window.mainloop()
Автор решения: splash58
→ Ссылка
По мотивам вот этого ответа Python TKinter get clicked tag in text widget
import re
import webbrowser
from tkinter import *
from tkinter import scrolledtext
def click(event):
# get the index of the mouse click
index = event.widget.index("@%s,%s" % (event.x, event.y))
# get the indices of all "link" tags
tag_indices = list(event.widget.tag_ranges('link'))
# iterate them pairwise (start and end index)
for start, end in zip(tag_indices[0::2], tag_indices[1::2]):
# check if the tag matches the mouse click index
if event.widget.compare(start, '<=', index) and event.widget.compare(index, '<', end):
# take string between tag start and end
webbrowser.open_new_tab(event.widget.get(start, end))
window = Tk()
txtscroll = scrolledtext.ScrolledText(window, width=20, height=20)
txtscroll.insert(INSERT, 'текст со ссылками')
txtscroll.grid(row=0, column=0, sticky=W + NS + E, padx=(5, 5), pady=(5, 5))
# привязываем регулярное выражение к событию нажатия на ссылку
txtscroll.tag_config("link", foreground="blue", underline=1)
regex = r'(https?://\S+)'
for match in re.finditer(regex, txtscroll.get("1.0", END)):
start = txtscroll.index("1.0 + %d chars" % match.start())
end = txtscroll.index("1.0 + %d chars" % match.end())
txtscroll.tag_add("link", start, end)
txtscroll.tag_bind("link", "<Button-1>", click)
window.mainloop()