如何在python上绘制时钟?(没有时针或分针的时钟,只有一个图表)
我试图用Python3 turtle创建一个时钟面的图片,但是数字没有正确对齐。帮点忙?谢谢这就是我到目前为止所做的:如何在python上绘制时钟?(没有时针或分针的时钟,只有一个图表),python,turtle-graphics,python-turtle,Python,Turtle Graphics,Python Turtle,我试图用Python3 turtle创建一个时钟面的图片,但是数字没有正确对齐。帮点忙?谢谢这就是我到目前为止所做的: import turtle screen=turtle.Screen() screen.bgcolor(135, 205, 250) clock = turtle.Turtle() clock.shape("square") clock.speed(0) hours = 6 minutes = 30 angle = 12 for i in ra
import turtle
screen=turtle.Screen()
screen.bgcolor(135, 205, 250)
clock = turtle.Turtle()
clock.shape("square")
clock.speed(0)
hours = 6
minutes = 30
angle = 12
for i in range(angle):
# draw the leg
clock.forward(65)
clock.right(30)
clock.write(i)
# go back to the middle and turn back around
clock.right(180)
clock.forward(65)
clock.right(180)
clock.write(i+1)
clock.shape("circle")
clock.forward(65)
screen.exitonclick()
您可以使用
align=“center”
控制write()
语句中文本的水平对齐。要垂直对齐字体,您必须使用.sety()
调整位置,考虑字体的垂直尺寸,如的答案所示。您使用bgcolor(135、205、250)
时没有先调用colormode(255)
使我怀疑您使用的是非标准字体(Repl)或Python turtle的旧版本。如果是这样的话,您应该说明这些问题,以避免在提供的答案中出现不兼容
下面是我如何解决这个问题。关键是要了解字体高度,以便进行更正:
from turtle import Screen, Turtle
FONT_SIZE = 12
FONT = ('Arial', FONT_SIZE, 'normal')
RADIUS = 65
screen = Screen()
clock = Turtle()
clock.shape('circle')
clock.speed('fastest')
for hour, angle in enumerate(range(60, -300, -30), start=1):
clock.setheading(angle)
position = clock.position()
clock.forward(RADIUS)
clock.penup()
clock.forward(FONT_SIZE)
clock.sety(clock.ycor() - 2 * FONT_SIZE/3)
clock.write(hour, align='center', font=FONT)
clock.setposition(position)
clock.pendown()
screen.mainloop()
但是,使用指定的字体大小是一个粗略的猜测,在某些系统上可能会很糟糕。如果您是这样,那么您可以使用此答案中的基础tkinter函数调用获得字体高度的准确值,我假设您在发布自己的问题之前已在搜索SO时查看了此函数。@cdlane回答正确-但这里还有一个带日期的时钟
from turtle import *
from datetime import datetime
def jump(distanz, winkel=0):
penup()
right(winkel)
forward(distanz)
left(winkel)
pendown()
def hand(laenge, spitze):
fd(laenge*1.15)
rt(90)
fd(spitze/2.0)
lt(120)
fd(spitze)
lt(120)
fd(spitze)
lt(120)
fd(spitze/2.0)
def make_hand_shape(name, laenge, spitze):
reset()
jump(-laenge*0.15)
begin_poly()
hand(laenge, spitze)
end_poly()
hand_form = get_poly()
register_shape(name, hand_form)
def clockface(radius):
reset()
pensize(7)
for i in range(60):
jump(radius)
if i % 5 == 0:
fd(25)
jump(-radius-25)
else:
dot(3)
jump(-radius)
rt(6)
def setup():
global second_hand, minute_hand, hour_hand, writer
mode("logo")
make_hand_shape("second_hand", 125, 25)
make_hand_shape("minute_hand", 130, 25)
make_hand_shape("hour_hand", 90, 25)
clockface(160)
second_hand = Turtle()
second_hand.shape("second_hand")
second_hand.color("gray20", "gray80")
minute_hand = Turtle()
minute_hand.shape("minute_hand")
minute_hand.color("blue1", "red1")
hour_hand = Turtle()
hour_hand.shape("hour_hand")
hour_hand.color("blue3", "red3")
for hand in second_hand, minute_hand, hour_hand:
hand.resizemode("user")
hand.shapesize(1, 1, 3)
hand.speed(0)
ht()
writer = Turtle()
#writer.mode("logo")
writer.ht()
writer.pu()
writer.bk(85)
def wochentag(t):
wochentag = ["Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"]
return wochentag[t.weekday()]
def datum(z):
monat = ["Jan.", "Feb.", "Mar.", "Apr.", "May", "June",
"July", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."]
j = z.year
m = monat[z.month - 1]
t = z.day
return "%s %d %d" % (m, t, j)
def tick():
t = datetime.today()
sekunde = t.second + t.microsecond*0.000001
minute = t.minute + sekunde/60.0
stunde = t.hour + minute/60.0
try:
tracer(False) # Terminator can occur here
writer.clear()
writer.home()
writer.forward(65)
writer.write(wochentag(t),
align="center", font=("Courier", 14, "bold"))
writer.back(150)
writer.write(datum(t),
align="center", font=("Courier", 14, "bold"))
writer.forward(85)
tracer(True)
second_hand.setheading(6*sekunde) # or here
minute_hand.setheading(6*minute)
hour_hand.setheading(30*stunde)
tracer(True)
ontimer(tick, 100)
except Terminator:
pass
def main():
tracer(False)
setup()
tracer(True)
tick()
return "EVENTLOOP"
if __name__ == "__main__":
mode("logo")
msg = main()
print(msg)
mainloop()