我是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'
我做错了什么?
谢谢!
答案 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
变量作为参数传递给函数。