【问题标题】:TypeError: printName1() takes 0 positional arguments but 1 was givenTypeError: printName1() 接受 0 个位置参数,但给出了 1 个
【发布时间】:2016-01-30 08:44:09
【问题描述】:

所以我写了这个非常简单的东西,它让我想弄清楚为什么它不起作用。当您单击时,它会打印一条语句。

所以对于第一个示例,我有一个按钮,并直接将函数 printName1 分配给它,效果非常好。

接下来就是使用.bind() 函数绑定它。所以在这种情况下,我们只有一个框架,可以根据您按下的按钮打印出某些内容。但不幸的是,每当我使用 bind 时,它都会抛出上面显示的错误。参考tkinter\__init__.py 的错误,所以它不是直接在我的代码中,但可能需要以不同的方式完成?谢谢大家。

from tkinter import *

root = Tk()

def printName1():
    print('Jack')

def printName2():
    print('John')

def printName3():
    print('Jill')

frame = Frame(root, width=300, height=250)
frame.bind("<Button-1>", printName1)
frame.bind("<Button-2>", printName2)
frame.bind("<Button-3>", printName3)
frame.pack()

root.mainloop()

编辑:该错误令人困惑,因为它看起来好像有一个额外的参数,而应该是 0。但实际上我需要向函数添加一个参数,这就是事件。所以它应该是 def printName1(event) 等等。只是想我会让你们知道什么对我有用,以防有人偶然发现。

【问题讨论】:

    标签: python tkinter typeerror


    【解决方案1】:

    事件,例如来自键盘/鼠标的事件,都被发送到应用程序,其中包含有关事件的信息:它是哪个键,单击时鼠标在哪里,诸如此类。这意味着绑定到此类事件的任何回调都需要接受参数。如果您还想将它绑定到不接受事件的 Tkinter Button,您也可以处理它。只需使用默认参数定义您的函数:

    def printName1(event=None):
        ...
    

    【讨论】:

    • 不仅仅是键盘和鼠标事件,而是所有事件。
    • 我没有想到其他输入设备,比如游戏杆。我想这是除了Button 激活之外的任何用户输入?
    • &lt;&lt;ListboxSelect&gt;&gt;等虚拟事件,也有&lt;Configure&gt;&lt;Visibility&gt;等低级事件。
    • 啊,是的,非常正确。任何此类回调都需要事件的参数。
    【解决方案2】:

    如果你参考documentation regarding tkinter events and bindings,你会看到当一个事件被触发时,关联的事件对象将作为第一个(也是唯一的)参数传递给有界函数(printName1和你的朋友案例)。

    所以你需要做的是修改那些printName* 函数以接受事件参数。

    def printName1(event):
        print('Jack')
    

    那么你想要达到的效果应该会起作用。

    当然,您可以按照@TigerhawkT3 的建议将event 参数设为可选。

    【讨论】:

      猜你喜欢
      • 2020-06-13
      • 2013-09-23
      • 2017-10-05
      • 2019-06-26
      • 2014-11-12
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      相关资源
      最近更新 更多