4

如果这很重要,我正在使用 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 中的某些小部件,它们的命令需要将“事件”作为参数,而其他的则不需要。为什么?如何区分它们?

谢谢。

4

2 回答 2

4

Scale 参加活动。它采用当前值。试试这个:

def cmd(value):
    print int(value)

如果您阅读Tk 教程,它会解释这一点:

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

或者,如果您阅读了实际的手册页

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

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

如果您更喜欢通过反复试验来解决问题,则不难看出通过了什么:

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

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

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

于 2013-04-08T21:12:19.180 回答
2

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

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

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

于 2013-04-08T21:14:49.683 回答