【问题标题】:python Tkinter have displayed text as hyperlink [duplicate]python Tkinter已将文本显示为超链接[重复]
【发布时间】:2018-08-27 10:14:41
【问题描述】:

我正在使用 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()

【问题讨论】:

  • 您是想让单个标签或文本像超链接一样工作,还是要将超链接嵌入到更大的标签或文本中?
  • 我希望将超链接嵌入到标签内的 URL 中。我已将生成的最大 URL 数设置为 10
  • 所以你想要一个看起来像这些 cmets 之一的标签 - 其中大部分文本是纯文本,但你的名字和你自己的评论后面的 edit 看起来像链接并触发一些代码点击?这比让整个标签看起来像超链接要困难得多。
  • 使用文本而不是标签,这仍然很困难,但有些工具可以为您完成大部分繁重的工作。
  • 如果每个 url 被拆分成自己的文本框而不是标签会更容易吗?我已经实现将每个 url 放入自己的文本框中,但只是选择了一个标签,因为它看起来更整洁。但是,如果可以使每个文本框看起来和行为都像超链接,那么我会这样做。我很抱歉让它变得混乱,我对 Tkinter 和 GUI 的经验不是很丰富,哈哈

标签: python selenium tkinter hyperlink


【解决方案1】:

如果您只是想让整个 Label 看起来像超链接一样工作,这很容易。我只会做一个愚蠢的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()

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

另一方面,如果您愿意使用Text 而不是Label,则支持已经存在,并且将其包装起来并不难。借用 tkinter 书中的Hyperlink Manager

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 代码中看到的那样,它所做的事情并不是那么困难。您只需将每个超链接包装在一个标签中并将其插入原始文本的位置,然后您就可以随每个事件返回该标签,这样您就可以轻松地查找您想要为该特定标签执行的操作。

【讨论】:

  • 本打算在Label中的超链接下划线,结果发现是not hard, but not as trivial as I remember,所以我省略了。
  • 谢谢你的帮助,我想我会采取文本框的方式:)
  • “从 tkinter 书中借用超链接管理器:”该书的链接已失效,使第二个答案无用!
猜你喜欢
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 2011-05-09
  • 2019-11-21
相关资源
最近更新 更多