我使用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"作为一个论点,和其他人不一样。为什么?如何区分它们?
感谢。
答案 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小部件的当前值而不是事件对象。