Ниже приведена очень упрощенная переделка вашего примера кода, которая позволяет пришельцу и пуле двигаться одновременно. Решение состоит не в том, чтобы написать цикл для выполнения всего движения, а в функции, которая выполняет небольшой шаг, а затем вызывает себя через after()
:
from tkinter import *
WIDTH, HEIGHT = 900, 600
def enemy_move():
s.move(enemy, 3, 0)
SpaInv.after(10, enemy_move)
def shoot(event=None):
s.itemconfig(bullet, state=NORMAL)
s.move(bullet, 0, -3)
SpaInv.after(10, shoot)
SpaInv = Tk()
s = Canvas(SpaInv, height=HEIGHT, width=WIDTH, bg='black')
s.pack()
ship = s.create_polygon(590, 485, 630, 485, 610, 430, fill='red')
bullet = s.create_oval(600, 425, 620, 400, fill='yellow', state=HIDDEN)
enemy = s.create_rectangle(4, 4, 34, 34, fill='green')
s.bind_all('<space>', shoot)
enemy_move()
SpaInv.mainloop()