Tkinter和超链接

时间:2015-01-03 23:10:20

标签: python text hyperlink tkinter widget

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

1 个答案:

答案 0 :(得分:1)

这是一种方法。它将每个href放在文本小部件中的单独行上,并使用唯一标记名称标记该行,每个标记名称都绑定到一个单独的,动态创建的callback()事件处理函数,该函数间接调用实际事件处理程序。它的目的是为它提供一些通常不被Tkinter传递的额外参数。这些&#34; shim&#34;事件处理程序可以通过临时将其背景变为红色来提供一些关于选择链接的视觉反馈,然后再打开Web浏览器并将其作为目标URL。

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

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()