Tkinter:使用其他参数继承Button

时间:2017-10-07 21:23:30

标签: python tkinter constructor subclass

我想将Button子类化为OPButtun。 OPButton是一个常规按钮,具有在鼠标悬停时编写帮助消息的功能。 OPButton必须接受常规Button构造函数可以接受的任何可能的参数列表,加上我自己的两个:消息和Stringvar在哪里写入它。

这是我的代码(据说可以运行)

from tkinter import *
from tkinter import ttk

class OPButton(Button):
    """ """
    def ___init___(self, parent, string, message, *args, **kwargs):
        ttk.Button.__init__(self, parent, *args, **kwargs)
        self.bind("<Enter>", command=lambda e: string.set(message))
        self.bind("<Leave>", command=lambda e: string.set(""))

if __name__ == '__main__':
    root = Tk()
    root.str= StringVar()
    OPButton(root, root.str, "hovering the button", text="click here").pack()
    ttk.Label(root, textvariable=root.str).pack()
    root.mainloop()

和错误消息:

Traceback (most recent call last):
  File "C:\Users\planchoo\oPButton.py", line 19, in <module>
    OPButton(root, "Hello World", "Bouton", text="Hello").pack()
TypeError: __init__() takes from 1 to 3 positional arguments but 4 were given

修改:以下是Bryan回复后的更正代码。完美工作(谢谢)。

from tkinter import *
from tkinter import ttk

class OPButton(Button):
    """ """
    def __init__(self, parent, string, message, *args, **kwargs):
        ttk.Button.__init__(self, parent, *args, **kwargs)
        self.bind("<Enter>", lambda e: string.set(message))
        self.bind("<Leave>", lambda e: string.set(""))

if __name__ == '__main__':
    root = Tk()
    root.chaine = StringVar()
    OPButton(root, root.chaine, "Bouton", text="Hello").pack()
    ttk.Label(root, textvariable=root.chaine).pack()
    root.mainloop()

1 个答案:

答案 0 :(得分:1)

我很确定您定义的__init__()函数拼写为___init___()