Мини-проект — часы без времени
Узнаваемый циферблат — просто геометрия: деления через равные углы, числа, две стрелки на фиксированных направлениях.
Что мы построим
«Часы без времени» — статичный циферблат аналоговых часов. Модуль
datetime нам пока не нужен — стрелки встанут на фиксированный
угол, просто чтобы показать, как из геометрии собирается узнаваемый объект.
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) центрирует круг в 150 px СЛЕВА от текущего курса —
# поэтому стартуем на 150 ниже (0, -150), чтобы центр циферблата попал в (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()
Геометрический план
12 делений циферблата расположены по кругу через равные промежутки — знакомая формула
360 / 12 = 30 градусов между соседними часами. Но в отличие от
обычного многоугольника, здесь удобнее задавать угол каждого деления АБСОЛЮТНО, через
setheading(), а не накапливать поворотами:
# час 0 (12 часов) — направление вверх, 90°
# час 3 — направление вправо, 0°
# час 6 — направление вниз, -90°
# час 9 — направление влево, 180°
# в общем виде: ugol = 90 - hour * 30
Шаг 1: окружность и деления
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) центрирует круг в 150 px СЛЕВА от текущего курса —
# поэтому стартуем на 150 ниже (0, -150), чтобы центр циферблата попал в (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()
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()
Шаг 2: числа и стрелки
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"))
# часовая стрелка — короче, толще, фиксирована на 12
artist.pensize(5)
artist.pencolor("#5B24F9")
artist.goto(0, 0)
artist.setheading(90 - 12 * 30)
artist.pendown()
artist.forward(80)
artist.penup()
# минутная стрелка — длиннее, тоньше, фиксирована на 2
artist.pensize(3)
artist.pencolor("#DB2777")
artist.goto(0, 0)
artist.setheading(90 - 2 * 30)
artist.pendown()
artist.forward(120)
Готовый результат
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) центрирует круг в 150 px СЛЕВА от текущего курса —
# поэтому стартуем на 150 ниже (0, -150), чтобы центр циферблата попал в (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()
Добавьте оставшиеся 8 чисел (1, 2, 4, 5, 7, 8, 10, 11) по тому же принципу.
Добавьте третью, самую тонкую стрелку — секундную — на любой фиксированный угол.
Измените углы часовой и минутной стрелки, чтобы часы показывали другое (тоже фиксированное) время.