Rozdział 7 · Głębokie zanurzenie w Turtle

Mini-projekt – ponadczasowe zegary

Rozpoznawalna tarcza zegara — po prostu geometria: podział przez równe kąty, liczby, dwie wskazówki w ustalonych kierunkach.

Co zbudujemy

Timeless Watch to statyczna tarcza zegarka analogowego. Moduł datetime jeszcze nie potrzebujemy — strzałki zostaną naprawione kąt, po prostu po to, by pokazać, jak rozpoznawalny obiekt jest złożony z geometrii.

chasy_polnye.py
import turtle

screen = turtle.Screen()
screen.setup(width=420, height=420)
artist = turtle.Turtle()
artist.speed(0)
artist.pencolor("#0D0230")
artist.pensize(3)

#circle(150) wyśrodkowuje okrąg 150 px LEWO od obecnego kursu —
# więc zacznij 150 niżej (0, -150), tak aby środek tarczy spadał do (0, 0)
artist.penup()
artist.goto(0, -150)
artist.pendown()
artist.circle(150)

for hour in range(12):
    artist.penup()
    artist.goto(0, 0)
    artist.setheading(90 - hour * 30)
    artist.forward(135)
    artist.pendown()
    artist.forward(15)
    artist.penup()

for hour, label in [(0, "12"), (3, "3"), (6, "6"), (9, "9")]:
    artist.goto(0, 0)
    artist.setheading(90 - hour * 30)
    artist.forward(110)
    artist.write(label, align="center", font=("Arial", 16, "bold"))

artist.pensize(5)
artist.pencolor("#5B24F9")
artist.goto(0, 0)
artist.setheading(90 - 12 * 30)
artist.pendown()
artist.forward(80)
artist.penup()

artist.pensize(3)
artist.pencolor("#DB2777")
artist.goto(0, 0)
artist.setheading(90 - 2 * 30)
artist.pendown()
artist.forward(120)

screen.exitonclick()
Rezultat
Analogowy tarcza zegarka z 12-godzinnymi podziałami, z liczbami 12, 3, 6, 9 i dwoma wskazówkami wskazującymi stały czas
Gotowy wynik: tarcza zegara z podziałkami, liczbami 12/3/6/9 i dwiema wskazówkami

Plan geometryczny

12 podziałów pokrętła jest ułożonych w okręgu w regularnych odstępach – znana formuła 360 / 12 = 30 stopni między sąsiednimi godzinami. Ale w przeciwieństwie do zwykłego wielokąta, tutaj wygodniej ustawiać kąt każdego podziału ABSOLUTNIE, przez setheading(), a nie kumulować się na przemian:

ugol_deleniya.py
# godzina 0 (12 godzin) – w górę, 90°
# godzina 3            — kierunek w prawo, 0°
# godzina 6            — kierunek w dół, -90°
# godzina 9            — kierunek w lewo, 180°
# ogólnie: ugol = 90 - hour * 30

Krok 1: Koło i znaczniki

chasy_delenia.py
import turtle

screen = turtle.Screen()
screen.setup(width=420, height=420)
artist = turtle.Turtle()
artist.speed(0)
artist.pencolor("#0D0230")
artist.pensize(3)

#circle(150) wyśrodkowuje okrąg 150 px LEWO od obecnego kursu —
# więc zacznij 150 niżej (0, -150), tak aby środek tarczy spadał do (0, 0)
artist.penup()
artist.goto(0, -150)
artist.pendown()
artist.circle(150)

for hour in range(12):
    artist.penup()
    artist.goto(0, 0)
    artist.setheading(90 - hour * 30)
    artist.forward(135)
    artist.pendown()
    artist.forward(15)
    artist.penup()

screen.exitonclick()
Rezultat
Okrągła tarcza z dwunastoma krótkimi kreskami wokół okręgu, bez cyfr i wskazówek
Krok 1 – Okrąg i 12 haków, bez liczb i strzałek
chasy_delenia_kod.py
artist.circle(150)

for hour in range(12):
    artist.penup()
    artist.goto(0, 0)
    artist.setheading(90 - hour * 30)
    artist.forward(135)
    artist.pendown()
    artist.forward(15)
    artist.penup()
Dlaczego goto(0, 0) przed każdą podziałem
Każda dywizja zaczyna się od środka, w przeciwnym razie żółw rysowałby podziały jedna po drugiej w okręgu, a nie jako niezależne promienie od środka. penup()/pendown() wokół każdego kroku zapewnia, że nie ma linii między podziałami.

Krok 2: Liczby i strzałki

chasy_chisla_strelki_kod.py
for hour, label in [(0, "12"), (3, "3"), (6, "6"), (9, "9")]:
    artist.goto(0, 0)
    artist.setheading(90 - hour * 30)
    artist.forward(110)
    artist.write(label, align="center", font=("Arial", 16, "bold"))

# wskazówka godzinowa — krótsza, grubsza, ustawiona na 12
artist.pensize(5)
artist.pencolor("#5B24F9")
artist.goto(0, 0)
artist.setheading(90 - 12 * 30)
artist.pendown()
artist.forward(80)
artist.penup()

# wskazówka minutowa — dłuższa, cieńsza, przymocowana do 2
artist.pensize(3)
artist.pencolor("#DB2777")
artist.goto(0, 0)
artist.setheading(90 - 2 * 30)
artist.pendown()
artist.forward(120)

Końcowy efekt

chasy_polnye.py
import turtle

screen = turtle.Screen()
screen.setup(width=420, height=420)
artist = turtle.Turtle()
artist.speed(0)
artist.pencolor("#0D0230")
artist.pensize(3)

#circle(150) wyśrodkowuje okrąg 150 px LEWO od obecnego kursu —
# więc zacznij 150 niżej (0, -150), tak aby środek tarczy spadał do (0, 0)
artist.penup()
artist.goto(0, -150)
artist.pendown()
artist.circle(150)

for hour in range(12):
    artist.penup()
    artist.goto(0, 0)
    artist.setheading(90 - hour * 30)
    artist.forward(135)
    artist.pendown()
    artist.forward(15)
    artist.penup()

for hour, label in [(0, "12"), (3, "3"), (6, "6"), (9, "9")]:
    artist.goto(0, 0)
    artist.setheading(90 - hour * 30)
    artist.forward(110)
    artist.write(label, align="center", font=("Arial", 16, "bold"))

artist.pensize(5)
artist.pencolor("#5B24F9")
artist.goto(0, 0)
artist.setheading(90 - 12 * 30)
artist.pendown()
artist.forward(80)
artist.penup()

artist.pensize(3)
artist.pencolor("#DB2777")
artist.goto(0, 0)
artist.setheading(90 - 2 * 30)
artist.pendown()
artist.forward(120)

screen.exitonclick()
Rezultat
Analogowy tarcza zegarka z 12-godzinnymi podziałami, z liczbami 12, 3, 6, 9 i dwoma wskazówkami wskazującymi stały czas
Gotowy wynik: tarcza zegara z podziałkami, liczbami 12/3/6/9 i dwiema wskazówkami
Podstawowa praktyka
Wszystkie 12 liczb

Dodaj pozostałe 8 liczb (1, 2, 4, 5, 7, 8, 10, 11) według tej samej zasady.

★★ Zadanie samodzielne
Seconds

Dodaj trzecią, najcieńszą rękę – drugą wskazówkę – do dowolnego ustalonego kąta.

Challenge
Inne razy

Zmień kąty wskazówek godzinowych i minutowych, aby zegarek pokazywał inny (również stały) czas.

Praktyka: Zegar Ponadczasowy
Moduł turtle otwiera natywne okno Python – uruchamiane lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →