TypeError:printName1()获取0个位置参数,但给出1

时间:2015-10-30 00:57:44

标签: python tkinter typeerror

所以我写了这个非常简单的事情,它让我试图找出它为什么不能工作。只需单击即可打印一条语句。

因此,对于第一个示例,我有一个按钮并直接为其分配了函数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(事件)等等。我想让我们知道什么对我有用,万一有人偶然发现了这一点。

2 个答案:

答案 0 :(得分:4)

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

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

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

那么你想要达到的目标应该有效。

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

答案 1 :(得分:2)

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

def printName1(event=None):
    ...