Tkinter文本窗口中的超链接?

9

我正在重新设计我的软件项目的一部分,并想使用超链接而不是按钮。我真的不想使用文本小部件,但当我谷歌这个主题时,那是我能找到的唯一选择。无论如何,我找到了一个示例,但一直碰到这个错误:

TclError: bitmap "blue" not defined

当我添加这行代码(使用 IDLE)时,
hyperlink = tkHyperlinkManager.HyperlinkManager(text)

模块的代码位于这里,脚本的代码位于这里
有人有什么想法吗?
导致问题的部分说foreground="blue",这在Tkinter中被称为颜色,不是吗?

“giving problems”? 像回溯一样吗?这是什么问题? - msw
这是确切的错误信息 在这里它似乎认为“blue”是一个位图。 - Zac Brown
这可能与您使用的 Windows 系统略有不同。但是我在 Ubuntu Linux 上尝试过,Python 2.6 版本上运行良好,没有任何错误。也许这是由于您的安装或配置问题? - avacariu
尽管我在Mac上运行此代码,但我没有遇到与问题中链接的代码相关的“蓝色”错误。 - Bryan Oakley
2个回答

13
如果不想使用文本小部件,可以选择使用标签并将鼠标单击绑定到它上面。即使是标签,它仍然会响应事件。
例如:
import tkinter as tk

class App:
    def __init__(self, root):
        self.root = root
        for text in ("link1", "link2", "link3"):
            link = tk.Label(text=text, foreground="#0000ff")
            link.bind("<1>", lambda event, text=text: self.click_link(event, text))
            link.pack()

    def click_link(self, event, text):
        print("You clicked '%s'" % text)

root = tk.Tk()
app = App(root)
root.mainloop()

如果你想要的话,你可以变得更加高级,并添加额外的绑定来处理<Enter><Leave>事件,这样你可以在用户悬停时改变显示效果。当然,你还可以更改字体,使文本带有下划线,如果你愿意的话。

Tk是一个很棒的工具包,为你提供了构建几乎任何想要的东西的基础组件。你只需要把小部件看成一堆木材、砖块和灰泥,而不是一套预制的墙壁和门。


1

"blue" 应该是可以接受的(因为你在 Windows 上,Tkinter 应该使用其内置的颜色名称表——这可能是 X11 上的系统配置错误,但不是在 Windows 上);因此,这是一个令人困惑的问题(也许是 Tkinter 的配置问题...?)。例如,如果您使用 foreground="#00F" 会发生什么?这并不能解释问题,但至少可以让您继续工作...


@Zachary,你的意思是你已经给出了#00F,但它仍然抱怨一个不再存在的“blue”吗?或者这不是你所说的“完全相同的错误”吗? - Alex Martelli
可能是因为它根本不是在寻找颜色,而是像你首先所述的那样未定义位图“蓝色”。 - msw
是的,它仍在抱怨“blue”,但这个变量已经不存在了。 - Zac Brown
好的,但它在哪里寻找位图呢?我浏览了所有的代码,但找不到任何关于它是位图的说明。 - Zac Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接