【问题标题】:Why only some Tkinter callback functions need to have an argument but others don't为什么只有一些 Tkinter 回调函数需要有参数,而其他的不需要
【发布时间】:2013-04-08 20:58:35
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: python callback tkinter


    【解决方案1】:

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

    def cmd(value):
        print int(value)
    

    如果您阅读Tk tutorial,它会解释:

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

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

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

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

    如果您更喜欢通过反复试验来解决问题,那么查看通过的内容并不难:

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-19
      • 2021-01-28
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多