import tkinter as tk
import math
# --- Configuration ---
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 400
WHEEL_RADIUS = 30
SPOKES = 4
SPEED = 3 # pixels per frame
ROTATION_SPEED = 5 # degrees per frame
class MovingCar:
def __init__(self, canvas):
self.canvas = canvas
self.angle = 0
self.x = 50
self.y = 250
# Create wheels
self.left_wheel = self.canvas.create_oval(
self.x, self.y,
self.x + WHEEL_RADIUS * 2, self.y + WHEEL_RADIUS * 2,
outline="black", width=2
)
self.right_wheel = self.canvas.create_oval(
self.x + 120, self.y,
self.x + 120 + WHEEL_RADIUS * 2, self.y + WHEEL_RADIUS * 2,
outline="black", width=2
)
# Create spokes for each wheel
self.left_spokes = []
self.right_spokes = []
for _ in range(SPOKES):
self.left_spokes.append(self.canvas.create_line(0, 0, 0, 0, fill="black", width=2))
self.right_spokes.append(self.canvas.create_line(0, 0, 0, 0, fill="black", width=2))
# Create rectangle body
self.body = self.canvas.create_rectangle(
self.x - 10, self.y - 50,
self.x + 160, self.y,
fill="brown"
)
# Create text
self.text = self.canvas.create_text(
self.x + 75, self.y - 25,
text="hello", fill="white", font=("Arial", 14, "bold")
)
def update_spokes(self, wheel_center_x, wheel_center_y, spokes_list):
"""Update spoke positions based on current rotation angle."""
for i, spoke in enumerate(spokes_list):
angle_deg = self.angle + (360 / SPOKES) * i
rad = math.radians(angle_deg)
x_end = wheel_center_x + WHEEL_RADIUS * math.cos(rad)
y_end = wheel_center_y + WHEEL_RADIUS * math.sin(rad)
self.canvas.coords(spoke, wheel_center_x, wheel_center_y, x_end, y_end)
def move(self):
# Move all parts to the right
self.canvas.move(self.left_wheel, SPEED, 0)
self.canvas.move(self.right_wheel, SPEED, 0)
self.canvas.move(self.body, SPEED, 0)
self.canvas.move(self.text, SPEED, 0)
for spoke in self.left_spokes + self.right_spokes:
self.canvas.move(spoke, SPEED, 0)
# Update rotation
self.angle = (self.angle + ROTATION_SPEED) % 360
# Get wheel centers
lx1, ly1, lx2, ly2 = self.canvas.coords(self.left_wheel)
rx1, ry1, rx2, ry2 = self.canvas.coords(self.right_wheel)
left_center = ((lx1 + lx2) / 2, (ly1 + ly2) / 2)
right_center = ((rx1 + rx2) / 2, (ry1 + ry2) / 2)
# Update spokes
self.update_spokes(*left_center, self.left_spokes)
self.update_spokes(*right_center, self.right_spokes)
# Loop animation
if lx1 < WINDOW_WIDTH:
self.canvas.after(30, self.move)
# --- Main Program ---
root = tk.Tk()
root.title("Rotating Wheels Animation")
canvas = tk.Canvas(root, width=WINDOW_WIDTH, height=WINDOW_HEIGHT, bg="skyblue")
canvas.pack()
car = MovingCar(canvas)
car.move()
root.mainloop()

Tidak ada komentar:
Posting Komentar