为什么只有一些Tkinter回调函数需要有一个参数,而有些则不需要

时间:2013-04-08 20:58:35

标签: python callback tkinter

我使用Python 2.7,如果重要的话。

这是我为了好玩而编写的代码:

def p():
    root = Tk()

    def cmd(event):
        print int(slider.get())

    slider = Scale(root, orient = "horizontal", from_ = 0, to = 100, command = cmd, state = "disabled")

    def enable():
        slider.config(state = "active")

    b = Button(root, text = "Enable slider", command = enable)

    b.grid()
    slider.grid(row = 1)

    root.mainloop()

对于这段代码,我想知道为什么Scale的命令需要一个事件,但是Button的命令不需要。似乎对于Tkinter中的一些小部件,他们的命令需要有" event"作为一个论点,和其他人不一样。为什么?如何区分它们?

感谢。

2 个答案:

答案 0 :(得分:4)

Scale 参加活动。它需要当前值。试试这个:

def cmd(value):
    print int(value)

如果您阅读Tk tutorial,则说明了这一点:

  

有一个"command"配置选项,可让您指定在更改比例时要调用的脚本。每次调用此脚本时,Tk都会自动将比例的当前值作为参数附加(我们看到类似的事情,其中​​额外的参数被添加到滚动条回调以及它们滚动的小部件上)。

或者,如果您阅读实际的manpage

  

指定通过widget命令更改比例值时要调用的Tcl命令的前缀。实际命令包含此选项,后跟空格和表示比例新值的实数。

换句话说,区分它们的方法是阅读文档。不幸的是,Tkinter docs并不是那么完整 - 他们假设您已经知道Tcl / Tk如何工作,或者如何自己查找。这就是为什么文档从一系列链接到Tk文档源的链接开始。

如果您希望通过反复试验来解决问题,那么看到传递的内容并不难:

def cmd(*args):
    print('Scale command says {}'.format(args))

def enable(*args):
    print('Button command says {}'.format(args))

但这并不总能告诉你需要知道的一切;还有其他回调,其参数不够明显,无需更多工作,或者可配置(例如,验证回调)。

答案 1 :(得分:2)

当您设置绑定(使用bind)命令时,回调始终会被赋予一个事件对象。

当您使用窗口小部件的command属性时,不同的窗口小部件会向命令发送不同的信息。在这种情况下,他们从不发送事件,但他们将发送其他类型的数据。这仅仅是因为不同的命令做了不同的事情。

缩放小部件也不例外 - 您声称回调接受了一个事件,但这是错误的。它传递的是scale小部件的当前值而不是事件对象。