子类在tkinter中的标签

时间:2017-02-26 15:28:25

标签: python tkinter

我需要子类化Label窗口小部件,以便浏览器可以在鼠标单击它时打开链接。

这是我到目前为止所做的代码片段。

from tkinter import *
import webbrowser

class HyperLinkLabel(Label):

    def __init__(self, link, *args, **kwargs):
        Label.__init__(self, *args, **kwargs)
        self.link = link
        self.bind("<Button-1>", self.click_callback)

    def click_callback(self):

        webbrowser.open_new(self.link)

if __name__ == '__main__':
    master = Tk()
    root = Frame(master)
    label1 = HyperLinkLabel(root, link='https://www.google.com')
    label1.config(text='hello')
    label1.pack()
    root.master.minsize(100, 50)
    root.mainloop()

1 个答案:

答案 0 :(得分:2)

  • 您应该声明master(或父)参数并将其传递给Label构造函数。 (来自呼叫者的root
  • 事件句柄应该有event参数,即使您没有使用它。否则抛出TypeError异常。
  • 打包框架,以便其中的窗口小部件可见。
from tkinter import *
import webbrowser

class HyperLinkLabel(Label):
    def __init__(self, master, link, *args, **kwargs):  # <-- pass master parameter
        Label.__init__(self, master, *args, **kwargs)   # <-- pass master parameter
        self.link = link
        self.bind("<Button-1>", self.click_callback)

    def click_callback(self, event):  # <--- missed event parameter
        webbrowser.open_new(self.link)

if __name__ == '__main__':
    master = Tk()
    root = Frame(master)
    label1 = HyperLinkLabel(root, link='https://www.google.com')
    label1.config(text='hello')
    label1.pack()
    root.pack()   # <-- should pack frame; otherwise link widget is not visible
    root.master.minsize(100, 50)
    root.mainloop()