Как исправить объект NoneType, не вызываемый ошибкой? - PullRequest
0 голосов
/ 17 мая 2019

Я использую Tkinter, чтобы перемещать круг на холсте определенное количество каждую секунду, и я столкнулся с ошибкой TypeError: 'NoneType' object is not callable в Python. Я считаю, что ошибка в этом блоке кода:

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

Редактировать: я решил ошибку NoneType, выполнив return obj, а затем получил объект int, который нельзя вызвать, что я решил, выполнив то, что предложил ShadowRanger, поэтому мой код работает сейчас.

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Давайте предположим, что ваша ошибка является повторяемой ошибкой, как вы утверждаете в верхней части своего поста.Тогда ваш код отличается от того, что вы опубликовали.

Timer() принимает итеративные аргументы (кортежи, списки и т. Д.) Или аргументы ключевых слов в качестве третьего аргумента.

move(x0, y0, x1, y1)

равно None, поскольку функция без оператора return неявно возвращает None.Как гласит ошибка, None не повторяется.

Чтобы исправить ваш код, передайте итерируемое.

Теперь давайте предположим, что ваш код такой, как вы опубликовали, и ошибка в том, что None не вызывается.В этом случае вы должны передать функциональный объект (удалить паратезы), а затем поместить аргументы move() в качестве итерируемого после (* в этом случае Timer(1.0, move, [x0, y0, x1, y1])

Помните, что Timer() принимает этиАргументы:

Timer(time, function, iterable, kwargs)

Редактировать: вы пояснили, что ваша ошибка не повторяется.Обратитесь ко второму примеру

0 голосов
/ 17 мая 2019

threading.Timer ожидает, что функция будет передана в качестве второго аргумента.

Один простой способ исправить это:

t = threading.Timer(1.0, lambda: move(x0, y0, x1, y1)) 
...