我的时钟python中的文本未正确对齐
我的乌龟模块中的文本未正确对齐,但在左上方对齐。我希望它准确对准乌龟的位置。有人可以帮忙吗?我尝试将乌龟的xcor和ycor向上和向左设置5个单位,但这没有用。任何帮助将不胜感激。
码:
import time
from datetime import datetime,date
import turtle
t = turtle.Pen()
while True:
turtle.tracer(0, 0)
hour_hand = float(datetime.today().hour)
minute_hand = float(datetime.today().minute)
second_hand = float(datetime.today().second)
# Draw circle
t.hideturtle()
t.circle(150)
t.left(90)
t.up()
t.forward(150)
t.down()
# Draw hands
t.right(float(float(minute_hand) * 6))
t.forward(100)
t.backward(100)
t.left(float(float(minute_hand) * 6))
t.right(int(float(hour_hand) * 30 + float(minute_hand) / 60 * 30))
t.forward(50)
t.backward(50)
t.left(int(float(hour_hand) * 30 + float(minute_hand) / 60 * 30))
t.right(second_hand * 6)
t.forward(125)
t.backward(125)
t.left(second_hand * 6)
# Draw ticks
for x in range(0, 12):
t.up()
t.forward(130)
t.down()
t.forward(20)
t.backward(20)
t.up()
t.backward(130)
t.down()
t.right(30)
for y in range(0, 60):
t.up()
t.forward(140)
t.down()
t.forward(10)
t.backward(10)
t.up()
t.backward(140)
t.down()
t.right(6)
t.up()
# Draw numbers
t.right(32.5)
for z in range(1, 12):
t.forward(130)
t.sety(t.ycor() - 5)
t.setx(t.xcor() - 5)
t.write(z, align = 'center', font = ('Times New Roman', 16))
t.sety(t.ycor() + 5)
t.setx(t.xcor() + 5)
t.backward(130)
t.right(30)
t.forward(130)
t.write(12, align = 'center', font = ('Times New Roman', 16))
turtle.update()
t.hideturtle()
time.sleep(0.85)
t.reset()
我真的不想使用tkinter,它太复杂了。
-
一种完全但不完全准确的方法,尽管可能不太准确:
FONT_SIZE = 16 FONT = ('Times New Roman', FONT_SIZE) t.color('red') t.dot(2) # show target of where we want to center text, for debugging t.color('black') t.sety(t.ycor() - FONT_SIZE/2) t.write(12, align='center', font=FONT)
现在,让我们整体上解决您的程序。我看到的主要问题是它闪烁并且比必要的更为复杂。首先要做的是将乌龟切换到 徽标
模式,该模式将顺时针旋转成正角,顶部旋转0度(与时钟不同!)。然后, 一旦 将表盘放在自己的乌龟上进行擦除并一遍又一遍地绘制, 就将 表盘图分割到自己的乌龟上进行绘制。我们都将
while True:
and抛弃sleep()
在事件驱动的世界(如turtle)中没有位置,而是使用turtle timer事件:from datetime import datetime from turtle import Screen, Turtle OUTER_RADIUS = 150 LARGE_TICK = 20 SMALL_TICK = 10 FONT_SIZE = 16 FONT = ('Times New Roman', FONT_SIZE) def draw_dial(): dial = Turtle() dial.hideturtle() dial.dot() dial.up() dial.forward(OUTER_RADIUS) dial.right(90) dial.down() dial.circle(-OUTER_RADIUS) dial.up() dial.left(90) dial.backward(OUTER_RADIUS) for mark in range(60): distance = LARGE_TICK if mark % 5 == 0 else SMALL_TICK dial.forward(OUTER_RADIUS) dial.down() dial.backward(distance) dial.up() dial.backward(OUTER_RADIUS - distance) dial.right(6) dial.sety(-FONT_SIZE/2) dial.setheading(30) # starting at 1 o'clock for z in range(1, 13): dial.forward(OUTER_RADIUS - (LARGE_TICK + FONT_SIZE/2)) dial.write(z, align='center', font=FONT) dial.backward(OUTER_RADIUS - (LARGE_TICK + FONT_SIZE/2)) dial.right(30) def tick(): hour_hand = datetime.today().hour minute_hand = datetime.today().minute second_hand = datetime.today().second hands.reset() hands.hideturtle() # redo as undone by reset() hands.right(hour_hand * 30 + minute_hand / 60 * 30) hands.forward(1/3 * OUTER_RADIUS) hands.backward(1/3 * OUTER_RADIUS) hands.left(hour_hand * 30 + minute_hand / 60 * 30) hands.right(minute_hand * 6) hands.forward(2/3 * OUTER_RADIUS) hands.backward(2/3 * OUTER_RADIUS) hands.left(minute_hand * 6) hands.right(second_hand * 6) hands.forward(OUTER_RADIUS - (LARGE_TICK + FONT_SIZE)) hands.backward(OUTER_RADIUS - (LARGE_TICK + FONT_SIZE)) hands.left(second_hand * 6) screen.update() screen.ontimer(tick, 1000) screen = Screen() screen.mode('logo') # make 0 degrees straight up, positive angles clockwise (like a clock!) screen.tracer(False) draw_dial() hands = Turtle() tick() screen.mainloop()