如何解决NoneType对象不可调用错误?

时间:2019-05-16 21:39:43

标签: python python-3.x tkinter tkinter-canvas nonetype

我正在使用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的建议解决的,所以我的代码现在可以工作了。

2 个答案:

答案 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))