【问题标题】:Tkinter and hyperlinksTkinter 和超链接
【发布时间】:2015-03-01 20:54:29
【问题描述】:

我正在 Tkinter 中编写一个 GUI,它所要做的就是有一个搜索框,然后将结果作为超链接输出。我有很多麻烦。最好的方法是什么?

一旦找到搜索词,我就可以打开很多网页。但我希望能够显示超链接并让用户选择打开哪个。任何帮助表示赞赏。谢谢!

这是我目前的代码:

from Tkinter import *
import json 
import webbrowser

with open('data.json', 'r') as f:
   database = json.loads(f.read())

def goto(event,href):
   webbrowser.open_new(href)

def evaluate(event):
   res.delete(1.0, END)
   search_param = str(entry.get())
   for patient_id in database:
      if search_param in str(database[patient_id]).lower():
         href = "https://website.com/" + str(patient_id)
         res.insert(INSERT, href, "link")
         res.bind("<Button-1>", goto(event, href))

w = Tk()
Label(w, text="Search:").pack()
entry = Entry(w)
entry.bind("<Return>", evaluate)
entry.pack()
res = Text(w)
res.pack()
w.mainloop()

【问题讨论】:

    标签: python text hyperlink tkinter widget


    【解决方案1】:

    这是一种方法。它将每个 href 放在文本小部件中的单独行上,并用唯一的标记名称标记该行,每个标记名称都绑定到一个单独的、动态创建的 callback()event 处理函数,该函数间接调用真实的事件处理程序。它的目的是为它提供一些通常不会由 Tkinter 传递的额外参数。这些“shim”事件处理程序可以通过在打开将其作为目标 url 的 Web 浏览器之前暂时将其背景变为红色来提供有关选择哪个链接的视觉反馈。

    这个 default-keyword-argument-value 技巧是向 Tkinter 事件处理程序传递额外数据的常用技术。在这种情况下,它被用来将所需的hrefandtag_namearguments 传递给它。

    from Tkinter import *
    import json
    import time
    import webbrowser
    
    with open('data.json', 'r') as f:
        database = json.loads(f.read())
    
    def goto(event, href, tag_name):
        res = event.widget
        res.tag_config(tag_name, background='red')  # change tag text style
        res.update_idletasks()  # make sure change is visible
        time.sleep(.5)  # optional delay to show changed text
        print 'opening:', href      # comment out
        #webbrowser.open_new(href)  # uncomment out
        res.tag_config(tag_name, background='white')  # restore tag text style
        res.update_idletasks()
    
    def evaluate(event):
        res.delete('1.0', END)
        search_param = str(entry.get())
        link_count = 0
        for patient_id in database:
            if search_param in str(database[patient_id]).lower():
                href = "https://website.com/" + str(patient_id)
                tag_name = "link" + str(link_count)  # create unique name for tag
                link_count += 1
                # shim to call real event handler with extra args
                callback = (lambda event, href=href, tag_name=tag_name:
                                goto(event, href, tag_name))
                res.tag_bind(tag_name, "<Button-1>", callback) # just pass function
                                                               # (don't call it)
                res.insert(INSERT, href+'\n', (tag_name,))  # insert tagged text
    
    w = Tk()
    Label(w, text="Search:").pack()
    entry = Entry(w)
    entry.bind("<Return>", evaluate)
    entry.pack()
    res = Text(w)
    res.pack()
    w.mainloop()
    

    【讨论】:

    • 这很好用。这不是表示链接的最漂亮方式,但效果很好。我仍然不确定你是如何让这段代码工作的。 GUI 制作对我来说不是很直观。
    • 是的,GUI 编程需要时间来适应,看看它对大多数人来说是多么不直观。我通过伪造您的 json 数据库并在单击它们时打印 url 来实现这一点。您可以通过最初以蓝色和下划线显示链接文本来使演示文稿更像 html/webbrowser。重要的是要意识到,就像真正的 html 超链接一样,为单击而显示的项目不必是目标 url,它几乎可以是任何东西,包括特殊样式的替代文本字符串、Tkinter 按钮小部件,甚至是图标或图像。
    猜你喜欢
    • 1970-01-01
    • 2022-11-23
    • 2012-05-20
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多