Jumat, 10 April 2026

Python Animation Wheel rotation with 30 spoke moving forward

 



import tkinter as tk

import math


# Configuration

WIDTH, HEIGHT = 800, 300

RADIUS = 40

SPOKES = 30

SPEED = 5

ANGLE_STEP = 0.1  # Rotation speed


class Wheel:

    def __init__(self, canvas, x, y, radius, spokes):

        self.canvas = canvas

        self.x, self.y = x, y

        self.radius = radius

        self.spokes = spokes

        self.angle = 0

        

        # Create rim

        self.rim = canvas.create_oval(x-radius, y-radius, x+radius, y+radius, width=2)

        

        # Create spokes (initially empty, updated in draw_spokes)

        self.spoke_lines = []

        for _ in range(spokes):

            self.spoke_lines.append(canvas.create_line(0,0,0,0))

            

        self.draw_spokes()


    def draw_spokes(self):

        # Remove old spokes

        for line in self.spoke_lines:

            self.canvas.delete(line)

        self.spoke_lines = []


        # Draw new spokes

        for i in range(self.spokes):

            ang = self.angle + (i * 2 * math.pi / self.spokes)

            x1 = self.x + self.radius * math.cos(ang)

            y1 = self.y + self.radius * math.sin(ang)

            self.spoke_lines.append(self.canvas.create_line(self.x, self.y, x1, y1, width=1))


    def move(self):

        self.x += SPEED

        self.angle += ANGLE_STEP

        

        # Reset if off screen

        if self.x > WIDTH + self.radius:

            self.x = -self.radius

            

        # Update rim position

        self.canvas.coords(self.rim, self.x-self.radius, self.y-self.radius, 

                           self.x+self.radius, self.y+self.radius)

        self.draw_spokes()


def animate():

    wheel.move()

    root.after(20, animate)


# Setup Tkinter

root = tk.Tk()

root.title("Rolling Wheel")

canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="white")

canvas.pack()


# Initialize Wheel

wheel = Wheel(canvas, 50, HEIGHT - 100, RADIUS, SPOKES)


# Start Animation

animate()

root.mainloop()

Tidak ada komentar: