python Tkinter 将文本显示为超链接

标签 python selenium tkinter hyperlink

我正在使用 Selenium 和 Tkinter 为我的大学网站创建一个简单的搜索引擎。我的代码创建 GUI 并生成指向搜索框中输入的查询的 URL 链接。是否可以将这些生成的 URL 作为 GUI 中可点击的超链接?如果是这样,我将如何去做?

import selenium.webdriver as webdriver
from selenium.webdriver.chrome.options import Options
from tkinter import *



def get_results(search_term, num_results = 10):
    url = "https://www.startpage.com"
    options = Options()
    options.add_argument('--headless')
    options.add_argument('--disable-gpu')  
    chromedriver = "chromedriver.exe"
    args = ["hide_console", ]
    browser = webdriver.Chrome(chromedriver, service_args = args, options = 
options) 
    browser.get(url)
    browser.set_window_position(0, 0)
    browser.set_window_size(0, 0)
    search_box = browser.find_element_by_id("query")
    search_box.send_keys(search_term)
    search_box.submit()
    try:
        links = 
browser.find_elements_by_xpath("//ol[@class='web_regular_results']//h3//a")
    except:
        links = browser.find_elements_by_xpath("//h3//a")
    results = []
    for link in links[:num_results]:
        href = link.get_attribute("href")
        print(href)
        results.append(href)
        results.append(href)
        mlabel2 = Label(mGui, text = href).pack()
    browser.close()

    return results



def search_query():
    mtext = ment.get()
    user_search = get_results(mtext + " site:essex.ac.uk")

    return

response = get_results
mGui = Tk()
ment = StringVar()
mGui.geometry('640x640+0+0')
mGui.title('Essex University Search')
mlabel = Label(mGui, text = 'Essex University Search', font = ("arial", 40, 
"bold"), fg = "steelblue").pack()
mbutton = Button(mGui, text = 'Search', command = search_query, font = 
("arial", 10), fg = 'white', bg = 'steelblue').pack()
mEntry = Entry(mGui, textvariable = ment).pack()

最佳答案

如果您只想使整个标签看起来和工作起来像超链接,这非常简单。我就做个傻事webbrowser.open而不是与网络驱动程序对话,因此无需任何额外的库或配置即可运行。

from tkinter import *
import webbrowser

root = Tk()
link = Label(root, text="http://stackoverflow.com", fg="blue", cursor="hand2")
link.pack()
link.bind("<Button-1>", lambda event: webbrowser.open(link.cget("text")))
root.mainloop()

但是如果您想在标签内的文本中间嵌入超链接,那就很难了。没有简单的方法可以使标签的一部分与其他部分不同。当你得到<Button-1>时,你必须手动找出它击中字符串的位置。我不知道有任何库可以将其包装起来并使之变得更容易。

如果您愿意使用Text而不是Label另一方面,支撑已经存在,把它包起来并不难。借用 Hyperlink Manager 摘自 tkinter 书中:

from functools import partial
from tkinter import *
import webbrowser
from tkHyperlinkManager import HyperlinkManager

root = Tk()
text = Text()
text.pack()
hyperlink = HyperlinkManager(text)
text.insert(INSERT, "Hello, ")
text.insert(INSERT, "Stack Overflow",
            hyperlink.add(partial(webbrowser.open, "http://stackoverflow.com")))
text.insert(INSERT, "!\n\n")
text.insert(INSERT, "And here's ")
text.insert(INSERT, "a search engine",
            hyperlink.add(partial(webbrowser.open, "http://duckduckgo.com")))
text.insert(INSERT, ".")

root.mainloop()

当然,您可以结束 partial(webbrowser.open, url)在一个方法中,这样你就可以调用 hyperlink.add('http://stackoverflow.com') ,甚至包裹 text.insert在那里你可以调用 hyperlink.insert(INSERT, 'Stack Overflow', 'http://stackoverflow.com') ,但是我留下了tkHyperlinkManager的简单界面单独使用,以便更容易理解它在做什么。

您可以从非常简短的tkHyperlinkManager开始代码,它所做的事情并不那么困难。您只需将每个超链接包装在一个标记中,然后插入它来代替原始文本,然后您就可以通过每个事件获取该标记,这样您就可以轻松查找要对该特定标记执行的操作。

关于python Tkinter 将文本显示为超链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49353034/

相关文章:

python - PyQt4 - QTableView - 如何循环 QTableView

python - 使用 Python 在 ESPN 的选秀前策略中重新排序球员

python - 使用 Selenium (Python) 提交 Web 表单后复制结果

python - 使用 filedialog 时 Tkinter 窗口和脚本卡住

python - 从 TkInter 条目小部件获取字符串

python - 使用子进程获取 print() 实时输出

python - 创建奇数索引python的总和

python - PyCaffe 构建失败,未找到 lboost_python

angularjs - 是否需要 `webdriver-manager start`?

python - tkinter 中的命名颜色