Мне нужна помощь для задания, я задал вопрос, связанный с этим вечером, но я признаю, что это было очень плохо сказано и написано. На этот раз я постараюсь быть немного более конкретным.
У меня есть следующий фрагмент кода: внутри класса 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()
, но я действительно не знаю другого способа перемещения объекта на неопределенный промежуток времени.
Двадцать миллисекунд кажется коротким временем расписания, которое может изменить некоторую зависимость от платформы, о которой я не знаю. Из фрагмента кода также не ясно, какие значения 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 будет держать вашу программу без пауз.