Эффективный способ перемещения объекта в Tkinter Canvas

1

Мне нужна помощь для задания, я задал вопрос, связанный с этим вечером, но я признаю, что это было очень плохо сказано и написано. На этот раз я постараюсь быть немного более конкретным.

У меня есть следующий фрагмент кода: внутри класса Game (который наследуется от класса Canvas):

def move_ball(self):
        if self.balldir==0:
                self.move(self.ball,0,-10)
        elif self.balldir==1:
                self.move(self.ball,0,10)
    root.after(20,self.move_ball)

Этот метод сутулят, чтобы переместить шар на холст, согласно self.balldir. Если он 0, он перемещается вверх, если он 1, он перемещается вниз.

Он работает отлично в течение нескольких секунд, но затем он просто замедляет работу и замедляет игру до тех пор, пока она полностью не остановится. Я тоже пробовал с time.sep, но это не работает с Tkinter (как вы, наверное, уже знаете).

Я думаю, что проблемы связаны с использованием root.after(), но я действительно не знаю другого способа перемещения объекта на неопределенный промежуток времени.

  • 0
    возможно дублирование кода таймера в графическом интерфейсе Python в TKinter
  • 0
    Я хочу отозвать свое закрытое голосование, но не могу. К сожалению.
Показать ещё 1 комментарий
Теги:
tkinter

1 ответ

0
Лучший ответ

Двадцать миллисекунд кажется коротким временем расписания, которое может изменить некоторую зависимость от платформы, о которой я не знаю. Из фрагмента кода также не ясно, какие значения balldir могут быть назначены. Если вы ожидаете, что balldir только когда-либо будет 0 или 1, вы можете найти это полезным:

def move_ball(self):
    assert 0 <= self.balldir <= 1
    self.move(self.ball, 0, 10 * (-1 * self.balldir))
    root.after(...

В вашем фрагменте кода, если бальдир не находится в [0, 1], шар перестанет двигаться и не даст вам никаких указаний о том, почему. Чтобы запрограммировать защиту, особенно при начале, никогда не оставляйте else- меньше, если:

if name == "dhcarmona":
    pass
elif name == "msw":
    pass
else
    raise ValueError, "name is not as expected"

Если значение ValueError будет держать вашу программу без пауз.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню