tkinter TypeError:缺少1个必需的位置参数:

时间:2017-02-28 12:41:11

标签: python tkinter

我是python和练习的新手,我现在写了这段编码,但是我收到一个错误,我不知道如何解决,有人可以帮我吗?

这是我的代码:

from tkinter import *

root = Tk()

name = 'donut'

def printInput(event, name):
    print("Your name is %s, and you are years old." % (name))

button_1 = Button(root, text="Submit")
button_1.bind("<Button-1>", printInput)
button_1.pack()

root.mainloop()

当我点击提交时,我收到此错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\error\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 1699, in __call__
    return self.func(*args)
TypeError: printInput() missing 1 required positional argument: 'name'

我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

tkinter只用一个参数调用你的函数。你的函数需要2,所以它会中断。只需从函数

中引用全局值name即可
def printInput(event):
    print("Your name is %s, and you are years old." % (name))

对于一个小型的学习者程序,这可能没问题,但是你可能希望找到一种更好的方法来将这个值带入你的函数,而不是在创建更大的更复杂和/或可重用的脚本时使用全局。

一种方法是在使用库函数functools.partial将函数传递给tkinter小部件之前部分应用函数。

from functools import partial
# ...

button_1.bind("<Button-1>", partial(printInput, name=name))

你可以创建一个带有name关键字参数preloaded的新函数并将其传递给按钮,这个函数只需要一个参数,一切正常。这是一种名为currying的技术,它来自函数式编程。

答案 1 :(得分:1)

你有一个函数printInput,它接受​​两个参数,但是当它被调用时,tkinter只传递一个输入,即事件。

为了传递name参数,你需要一个lambda函数:

button_1.bind("<Button-1>", lambda event:printInput(event,name))

这会将全局name变量作为参数传递给函数。