Первая часть вашей проблемы - захватить KeyPress
и KeyRelease
события вместо ключевых событий.
Но тогда все становится сложнее.Вы хотите, чтобы танк двигался каждые, скажем, 120 мс, не так быстро, как это возможно, верно?Таким образом, единственное, что вы можете сделать, это настроить обратный вызов after
, чтобы вы могли запускать некоторый код каждые 120 мс, а ключевые события просто устанавливали некоторый флаг, который говорит вам, как перемещать танк (или не перемещать его) на основена то, что было нажато.
Это выполнимо, но следующая проблема еще больше: Tkinter фиксирует ключевые события на высоком уровне - после любого переназначения вашей ОС (так что вы получаете E
вместо shift
и e
), что включает в себя автоповтор.Чтобы обойти это, вы должны написать некоторый код для «разбора» вручную.
Это все еще выполнимо, но это не легко.И это не идеально - быстрое нажатие клавиш может обмануть любой алгоритм разбора, который вы придумали, а быстрое нажатие клавиш - это то, что вы часто хотите разрешить в игре.
Лучшее решение, вероятно, начинать ссовершенно другая библиотека, например PyGame Zero вместо Tkinter.Библиотека, предназначенная для игр, будет иметь рамочный цикл, поэтому вам не нужно будет использовать after
и проверять несколько флагов, она будет записывать «сырые» события клавиатуры, чтобы вы могли немедленно реагировать на них и т. Д.Кроме того, и вы хотите, например, использовать спрайты для своих танков, вам не придется изобретать эти колеса, как это было бы с Tkinter.