【问题标题】:"SyntaxError: non-keyword arg after keyword arg" when trying to bind a function to a button in tkinter尝试将函数绑定到 tkinter 中的按钮时出现“语法错误:关键字 arg 后的非关键字 arg”
【发布时间】:2017-04-24 00:40:45
【问题描述】:

当我运行以下代码行时,我试图将按钮按下绑定到 Tkinter 中的函数

get = Button(root, lambda: ChangeColour(boxes[1][2], boxes[5][2], 
             main)).pack(fill = BOTH)

我收到以下错误

SyntaxError: 关键字 arg 后的非关键字 arg

我是否遗漏了什么,我应该以不同的方式绑定函数吗?

编辑: 下面的堆栈跟踪

File "C:/Users/07725172499/Documents/a.py", line 151
  relief=RIDGE, lambda: ChangeColour(boxes[1][2], boxes[5][2], main)).pack(fill = BOTH)
                                  ^
SyntaxError: non-keyword arg after keyword arg

进程以退出代码 1 结束

【问题讨论】:

  • 我没有发现问题。您可以发布完整的堆栈跟踪吗?
  • 什么是完整的堆栈跟踪以及如何获取它
  • 当你得到SyntaxError: non-keyword arg after keyword arg 时,它是否在一堆显示正在评估哪些行的文本中?这就是我们需要的。
  • 这可能有助于捕获异常...stackoverflow.com/questions/32189391/…。或者只是将一件事包装在 try/except 中并执行 `traceback.print_exc()1.
  • 试试command=lambda:

标签: python lambda tkinter


【解决方案1】:

错误SyntaxError: non-keyword arg after keyword arg 发生在您违反 Python 要求时,即参数可以以位置顺序和关键字=值对的混合形式给出,但是一旦提供了关键字,您就不能随后在该函数调用中使用位置顺序。例如,如果函数定义以

开头
def foo(first, second, third):

然后调用函数

foo(1, 2, 3)

没问题,

foo(1, 2, third=3) 

没问题,但是

foo(1, second=2, 3)

不行。

从您的回溯来看,您似乎通过关键字为relief 参数提供了一个值,因此您需要提供通过关键字绑定的函数。使用command=lamda: 作为参数。但是,我怀疑您对ChangeColor 的调用返回的值不是函数,因此与Button 的命令参数的预期类型不匹配。

要弄清楚为什么您的代码会违反此语法要求,我建议您拆分代码行,以便您可以确定是对 ChangeColorpackButton 的调用导致了问题.为了使您的代码更易于调试,请将每个函数调用放在单独的行中:

bound_function = ChangeColour(boxes[1][2], boxes[5][2], main)
my_button = Button(root, bound_function)
get = my_button.pack(fill=BOTH)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多