import tkinter, math
def move():
global x
global y
global vy
global t
canvas.delete('ball')
canvas.create_oval(x-MARGIN, (HEIGHT-y)-MARGIN, x+MARGIN, (HEIGHT-y)+MARGIN, fill='red', tags='ball')
for i in range(1, 60):
canvas.create_line(0, i * 10, 800, i * 10,
fill = '#000000' if i == 30 else '#d2d2d2')
for i in range(1, 80):
canvas.create_line(i * 10, 0, i * 10, 600,
fill = '#000000' if i == 1 else '#d2d2d2')
if i > 1 and (i - 1) % 5 == 0:
canvas.create_text(i * 10, 310, text = f'{(i - 1) * 10}')
if 0 <= x and x <= WIDTH and 0 <= y and y <= HEIGHT:
x = x + vx0 * dt
v1 = vy
v2 = vy - g * dt
y = y + (v1+ v2) / 2.0 * dt
vy = v2
t = t + dt
else:
x = x0
y = y0
vy = vy0
t = t0
window.after(50, move)
#WIDTH, HEIGHT = 1000, 500
WIDTH, HEIGHT = 800, 600
MARGIN = 10
t0 = 0.0
dt = 0.1
g = 9.8
v0 = float(input('初速度を入力してください'))
degrees = float(input('角度を入力してください'))
theta = degrees * math.pi / 180
vx0 = v0 * math.cos(theta)
vy0 = v0 * math.sin(theta)
x0 = 0
y0 = 3 * HEIGHT / 4
x = x0
y = y0
vy = vy0
t = t0
geo_str = str(WIDTH+MARGIN*2) + 'x' + str(HEIGHT+MARGIN*2)
window = tkinter.Tk()
window.geometry(geo_str)
window.title('moving')
canvas = tkinter.Canvas(window, width=WIDTH, height=HEIGHT, bg='white')
canvas.place(x=MARGIN, y=MARGIN)
# move 内に定義してるんでここは重複してる。
##canvas.create_oval(x-MARGIN, (HEIGHT-y)-MARGIN, x+MARGIN, (HEIGHT-y)+MARGIN, fill='red', tags='ball')
move()
window.mainloop()
aW1wb3J0IHRraW50ZXIsIG1hdGgKCmRlZiBtb3ZlKCk6CiAgICBnbG9iYWwgeAogICAgZ2xvYmFsIHkKICAgIGdsb2JhbCB2eQogICAgZ2xvYmFsIHQKCiAgICBjYW52YXMuZGVsZXRlKCdiYWxsJykKICAgIGNhbnZhcy5jcmVhdGVfb3ZhbCh4LU1BUkdJTiwgKEhFSUdIVC15KS1NQVJHSU4sIHgrTUFSR0lOLCAoSEVJR0hULXkpK01BUkdJTiwgZmlsbD0ncmVkJywgdGFncz0nYmFsbCcpCgogICAgZm9yIGkgaW4gcmFuZ2UoMSwgNjApOgogICAgICAgIGNhbnZhcy5jcmVhdGVfbGluZSgwLCBpICogMTAsIDgwMCwgaSAqIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gJyMwMDAwMDAnIGlmIGkgPT0gMzAgZWxzZSAnI2QyZDJkMicpCiAgICBmb3IgaSBpbiByYW5nZSgxLCA4MCk6CiAgICAgICAgY2FudmFzLmNyZWF0ZV9saW5lKGkgKiAxMCwgMCwgaSAqIDEwLCA2MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAnIzAwMDAwMCcgaWYgaSA9PSAxIGVsc2UgJyNkMmQyZDInKQogICAgICAgIGlmIGkgPiAxIGFuZCAoaSAtIDEpICUgNSA9PSAwOgogICAgICAgICAgICBjYW52YXMuY3JlYXRlX3RleHQoaSAqIDEwLCAzMTAsIHRleHQgPSBmJ3soaSAtIDEpICogMTB9JykKICAgICAgICAgICAgCgogICAgaWYgMCA8PSB4IGFuZCB4IDw9IFdJRFRIIGFuZCAwIDw9IHkgYW5kIHkgPD0gSEVJR0hUOgogICAgICAgIHggPSB4ICsgdngwICogZHQKICAgICAgICB2MSA9IHZ5CiAgICAgICAgdjIgPSB2eSAtIGcgKiBkdAogICAgICAgIHkgPSB5ICsgKHYxKyB2MikgLyAyLjAgKiBkdAogICAgICAgIHZ5ID0gdjIKICAgICAgICB0ID0gdCArIGR0CiAgICBlbHNlOgogICAgICAgIHggPSB4MAogICAgICAgIHkgPSB5MAogICAgICAgIHZ5ID0gdnkwCiAgICAgICAgdCA9IHQwCgogICAgd2luZG93LmFmdGVyKDUwLCBtb3ZlKQoKCiNXSURUSCwgSEVJR0hUID0gMTAwMCwgNTAwCldJRFRILCBIRUlHSFQgPSA4MDAsIDYwMApNQVJHSU4gPSAxMAoKdDAgPSAwLjAKZHQgPSAwLjEKZyA9IDkuOAoKdjAgPSBmbG9hdChpbnB1dCgn5Yid6YCf5bqm44KS5YWl5Yqb44GX44Gm44GP44Gg44GV44GEJykpCmRlZ3JlZXMgPSBmbG9hdChpbnB1dCgn6KeS5bqm44KS5YWl5Yqb44GX44Gm44GP44Gg44GV44GEJykpCgp0aGV0YSA9IGRlZ3JlZXMgKiBtYXRoLnBpIC8gMTgwCnZ4MCA9IHYwICogbWF0aC5jb3ModGhldGEpCnZ5MCA9IHYwICogbWF0aC5zaW4odGhldGEpCngwID0gMAp5MCA9IDMgKiBIRUlHSFQgLyA0CnggPSB4MAp5ID0geTAKdnkgPSB2eTAKdCA9IHQwCgpnZW9fc3RyID0gc3RyKFdJRFRIK01BUkdJTioyKSArICd4JyArIHN0cihIRUlHSFQrTUFSR0lOKjIpCndpbmRvdyA9IHRraW50ZXIuVGsoKQp3aW5kb3cuZ2VvbWV0cnkoZ2VvX3N0cikKd2luZG93LnRpdGxlKCdtb3ZpbmcnKQoKY2FudmFzID0gdGtpbnRlci5DYW52YXMod2luZG93LCB3aWR0aD1XSURUSCwgaGVpZ2h0PUhFSUdIVCwgYmc9J3doaXRlJykKY2FudmFzLnBsYWNlKHg9TUFSR0lOLCB5PU1BUkdJTikKIyBtb3ZlIOWGheOBq+Wumue+qeOBl+OBpuOCi+OCk+OBp+OBk+OBk+OBr+mHjeikh+OBl+OBpuOCi+OAggojI2NhbnZhcy5jcmVhdGVfb3ZhbCh4LU1BUkdJTiwgKEhFSUdIVC15KS1NQVJHSU4sIHgrTUFSR0lOLCAoSEVJR0hULXkpK01BUkdJTiwgZmlsbD0ncmVkJywgdGFncz0nYmFsbCcpCgptb3ZlKCkKd2luZG93Lm1haW5sb29wKCkK