我正在使用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()
答案 0 :(得分:1)
如果你只是想让整个Label外观像超链接一样工作,这很容易。我只是做一个愚蠢的webbrowser.open
而不是与webdriver交谈,所以这可以在没有任何额外库或配置的情况下运行。
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()
但是如果你想在Label中的文本中间嵌入超链接,那很难。没有简单的方法来标记与其他标签不同的标签的一部分。当你得到<Button-1>
时,你必须手动找出它所在的字符串中的位置。我并不知道有任何库可以将其包装起来并使其更容易。
另一方面,如果您愿意使用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
代码中获得的那样,它所做的并不是那么困难。您只需将每个超链接包装在标签中并插入代替原始文本,然后将每个事件的标签返回,这样您就可以轻松查找要为该特定标签执行的操作。