我正在使用Tkinter每秒在画布中移动一个圆圈一定量,并且遇到了Python中的TypeError: 'NoneType' object is not callable
错误。我相信该代码块中有错误:
def move(new_x0, new_y0, new_x1, new_y1):
new_x0 = new_x0 + speed
new_y0 = new_y0 + speed
new_x1 = new_x1 + speed
new_y1 = new_y1 + speed
game.canvas.delete("all")
obj = game.canvas.create_oval(new_x0, new_y0, new_x1, new_y1, fill = color)
game.canvas.pack()
t = threading.Timer(1.0, move(x0, y0, x1, y1))
t.start()
我希望画布上的圆圈在1秒后移动一次位置,但它只会显示NoneType错误。
编辑:对不起,我忘了显示错误。在这里。
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\threading.py", line 917, in _bootstrap_inner
self.run()
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\threading.py", line 1158, in run
self.function(*self.args, **self.kwargs)
TypeError: 'NoneType' object is not callable
编辑:我通过执行return obj解决了NoneType错误,然后我得到了int对象不可调用的问题,这是我通过做ShadowRanger的建议解决的,所以我的代码现在可以工作了。
答案 0 :(得分:2)
让我们假设您的错误是迭代错误,就像您在帖子顶部所说的那样。然后您的代码与您发布的代码不同。
ipmitool shell
将可迭代的参数(元组,列表等)或关键字参数作为第三个参数。
Timer()
是move(x0, y0, x1, y1)
,因为没有返回语句的函数会隐式返回None
。如错误所示,None
是不可迭代的。
要修复代码,请传递可迭代的代码。
现在让我们假设您的代码与您发布的代码相同,并且错误是None
是不可调用的。在这种情况下,您必须传递一个函数对象(去掉括号),然后将None
的参数作为可迭代对象放在后面(在这种情况下,move()
)
请记住,Timer(1.0, move, [x0, y0, x1, y1]
接受以下参数:
Timer()
编辑:您已说明您的错误不是可重复的错误。请参阅第二个示例
答案 1 :(得分:0)
threading.Timer
希望将函数作为第二个参数传递。
一种简单的解决方法是:
t = threading.Timer(1.0, lambda: move(x0, y0, x1, y1))