python实现抖音上比较火的罗盘时钟

    xiaoxiao2022-07-02  132

    抖音上比较有趣的罗盘时钟,今天用turtle来画一下,基本功能实现了,拿来练习一下turtle,感觉还可以吧

     

    turtle的安装

    sudo apt-get install python3-tk

    罗盘时钟

    思路就是,绘制三个圆,在圆周填充字符,充当仪表,以当前时间为起点,然后定时重新绘制图形

    所以本例实现看着有点卡顿的感觉。

    代码实现:

    import turtle from datetime import * # 抬起画笔,向前运动一段距离放下 def Skip(step): turtle.penup() turtle.forward(step) turtle.pendown() def drawCircle(content,content_len,init_data,init_data_type,circle_radius,circle_radius_step,color,font_size): ''' content:传入的数组,代表要画的圆上面写的内容,比如1-12月 content_len:数组长度,用这个元素来做循环,便于调整每次的偏置角度 init_data: x轴正方向显示当前时间,这个数据就是当前时间 init_data_type:代表这个是什么类型的,时,分,秒之类的 circle_radius:圆的半径 circle_radius_step: 圆环上的数据根据半径和这个长度结合写上内容 color: 画笔颜色 ''' #turtle.pos() turtle.home() #turtle.mode("logo") turtle.pensize(3) turtle.pencolor(color) turtle.fillcolor('#33BB00') #turtle.right(90) # turtle.right(-360/content_len) # Skip(circle_radius+circle_radius_step+10*3) # turtle.write(' ', align="center", font=("Courier", font_size,'bold')) # Skip(-circle_radius-circle_radius_step-10*3) # #turtle.right(360/content_len) Skip(circle_radius+circle_radius_step+10*3) turtle.write(init_data_type, align="center", font=("Courier", font_size,'bold')) Skip(-circle_radius-circle_radius_step-10*3) #turtle.right(-90) initdata_index=content.index(init_data) for i in range(initdata_index,content_len): Skip(circle_radius) fantilen=len(content[i]) if i == initdata_index: turtle.forward(75) turtle.forward(-90) turtle.forward(15) for name in range(fantilen): turtle.write(content[i][name], align="center", font=("Courier", font_size)) Skip(15) Skip(-15*fantilen) Skip(-circle_radius) turtle.left(360/content_len) for i in range(initdata_index): Skip(circle_radius) fantilen=len(content[i]) for name in range(fantilen): turtle.write(content[i][name], align="center", font=("Courier", font_size)) Skip(15) Skip(-15*fantilen) Skip(-circle_radius) turtle.left(360/content_len) def Week(t): week = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] return week[t.weekday()] def Date(t): y = t.year m = t.month d = t.day return "%s-%d-%d" % (y, m, d) def runclock(): turtle.reset() t = datetime.today() print(t) second = t.second #+ t.microsecond * 0.000001 minute = t.minute #+ second / 60.0 hour = t.hour# + minute / 60.0 Traditional_Chinese= [' ','壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾', '拾壹', '拾贰', '拾叁', '拾肆', '拾伍', '拾陆', '拾柒', '拾捌', '拾玖', '贰拾', '贰拾壹', '贰拾贰', '贰拾叁', '贰拾肆', '贰拾伍', '贰拾陆', '贰拾柒', '贰拾捌', '贰拾玖', '叁拾', '叁拾壹', '叁拾贰', '叁拾叁', '叁拾肆', '叁拾伍', '叁拾陆', '叁拾柒', '叁拾捌', '叁拾玖', '肆拾', '肆拾壹', '肆拾贰', '肆拾叁', '肆拾肆', '肆拾伍', '肆拾陆', '肆拾柒', '肆拾捌', '肆拾玖', '伍拾', '伍拾壹', '伍拾贰', '伍拾叁', '伍拾肆', '伍拾伍', '伍拾陆', '伍拾柒', '伍拾捌', '伍拾玖'] Simplified_Chinese=[' ','一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十','二十一', '二十二', '二十三', '二十四', '二十五', '二十六', '二十七', '二十八', '二十九', '三十','三十一', '三十二', '三十三', '三十四', '三十五', '三十六', '三十七', '三十八', '三十九', '四十','四十一', '四十二', '四十三', '四十四', '四十五', '四十六', '四十七', '四十八', '四十九', '五十', '五十一', '五十二', '五十三', '五十四', '五十五', '五十六', '五十七', '五十八', '五十九' ] hours= ['壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖','拾', '拾壹','拾贰', '拾叁', '拾肆', '拾伍', '拾陆', '拾柒', '拾捌', '拾玖', '贰拾', '贰拾壹', '贰拾贰', '贰拾叁', '贰拾肆'] Simplified_hours=['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十' ,'二十一', '二十二', '二十三', '二十四'] drawCircle(Simplified_Chinese,len(Simplified_Chinese),Simplified_Chinese[second],'秒',250,25,'blue',10) drawCircle(Simplified_Chinese,len(Simplified_Chinese),Simplified_Chinese[minute],'分',170,20,'green',10) drawCircle(Simplified_hours,len(Simplified_hours),Simplified_hours[hour-1],'时',80,15,'red',10) printer = turtle.Turtle() # 隐藏画笔的turtle形状 printer.hideturtle() printer.color('#11CCFF') printer.right(-90) printer.penup() printer.forward(40) printer.write(Week(t), align="center",font=("Courier", 10, "bold")) printer.back(80) printer.write(Date(t), align="center",font=("Courier", 14, "bold")) print(Week(t),Date(t)) printer.right(90) turtle.ontimer(runclock, 1000) def main(): # 打开/关闭龟动画,并为更新图纸设置延迟。 turtle.tracer(False) ts = turtle.getscreen() ts.bgcolor("black") runclock() turtle.mainloop() if __name__ == "__main__": main()

     

    常用方法

    下面是turtle常用的一些用法

    1.forward() | fd():向前移动指定的距离。参数:一个数字(integer or float))。

    turtle.forward(25)

    2.backward() | bk() | back():向后移动指定的距离。参数:一个数字(integer or float))。

    turtle.backward(30)

    3..right() | rt():以角度单位向右转动。参数:一个数字(integer or float))。单位默认为度数,可以通过degrees()和radians()进行设置。

    turtle.right(45)

    4.left() | lt():以角度单位向左转动。参数:一个数字(integer or float))。单位默认为度数,可以通过degrees()和radians()进行设置。

    turtle.left(45)  

    5.goto() | steps() | setposition():移动到绝对位置,如果笔落下,画线,不改变方向。参数:x-一个数字或一对数字。y-一个数字或None。

        turtle.setpos(60,30)     #60.00,30.00)

    6.setx():设置第一个坐标的值即X方向。参数:一个数字(integer or float))。

        turtle.setx(10)     #(10.00,0.00)

    7.sety():设置第二个坐标的值即Y方向。参数:一个数字(integer or float))。

        turtle.sety(10)     #(0.00,10.00)

    8.setheading() | seth(): 将方向设置为to_angle.就是东西南北方向。具体如下:

    标准模式:0 - 东  90 - 北 180 - 西 270 - 南  标志模式 0- 北   90- 东    180- 南    270 - 西

    turtle.setheading(90)

    9.home() : 移动到原点 - 坐标(0,0):并将其标题设置为其起始方向(取决于模式)。

        turtle.home()     # (0.00,0.00)

    10.circle():绘制一个给定半径的圆。参数:radius-一个数字(半径,如果值为正则逆时针,负数为顺时针),extent-一个数字()steps- 执行的步数。

    turtle.circle(120,180,5)

    11.dot() :用颜色画出一个直径大小的圆点。参数:size-一个大于1的整数,可None。默认用的是pensize+4和2*pensize的最大值,color-颜色值

    turtle.dot(20, "blue")

    12.stamp():将当前位置上的形状复制到画布上返回stamp_id.可以调用,可以删除。

    turtle.stamp()

    13.clearstamp():删除stamp()返回来的值。参数:stampid。

    14.clearstamps():删除全部stamp()的值。参数:stampid。

    15.undo():撤销最后的动作。

    16.speed():将速度设置为0..10范围内整数。如果没有参数,则返回当前速度。如果大于10或者小于0.5,则速度设置为0 。

     

        “最快”:0 :直接成图,没有动画效果     “快”:10:大概一秒     “正常”:6:     “慢”:3     “最慢”:1

    17:position() | pos(): 返回当前的位置。

        turtle.pos()     # (0.00,0.00)

    18.towards(): 返回当前位置同指定位置之间的角度。参数:x-一个数字或一对数字或一个实例的向量,y-如果x是数字,则为数字,否则为None。

        turtle.goto(10,10)     tw = turtle.towards(0,0)     print(tw)     # 225

    19.xcor():返回x坐标。

         ycor():返回y坐标。

    20.heading(): 返回当前的方向值。

    21.distance():返回x,y两个点的直线距离

    22.degrees():设置一整圈的度数。默认是360度。

    23.radians():将角度测量单位设置为弧度。相当于 degrees(2*math.pi)

    24.pendown() | pd() | down():放下笔,移动的时候绘图。

    25.penup() | pu() | up():将提起笔,移动时无图。

    26.pensize():设置线条的粗细。参数:width-一个正数

    27.pen():使用键值对设置笔的属性:

        “shown”: True/False     “pendown”: True/False     “pencolor”: 颜色字符串或者颜色值     “fillcolor”: 颜色字符串或者颜色值     “pensize”: 正数     “speed”: 速度范围为0..10的数字     “resizemode”: “auto” or “user” or “noresize”     “stretchfactor”: (positive number, positive number)     “outline”: 正数     “tilt”: 正数

    28.isdown():如果笔停止返回True,反之False

    29.pencolor():设置笔的颜色。

    30.fillcolor():笔的填充色。

    31.color():同时设置pencolor和fillcolor

    32.filling():返回fillstate状态,如果填充则返回True,反之False。

    33.begin_fill():在绘制要填充的形状前调用。当然在调用完还需要end_fill()。

    34.reset():重置,将屏幕中的图纸删除,重新居中并将所有变量设置为默认值。

    35.clear():删除图纸。对属性不做操作。

    36.write():写文本。参数:arg-要写入的对象。move-是否移动。align-对齐方式:left,right,center。font-字体。fontname,fontsize,fonttype。

    37.hideturtle() | ht() :删隐藏乌龟的形状,在做复杂绘图的时候隐藏的时候有利于提高绘图速度。

    38.showturtle() | st():显示乌龟的形状。

    39.isvisible():乌龟是否可见。如果可见返回True,反之则False。

    40.shape():设置乌龟的图形形状,取值:“arrow”, “turtle”, “circle”, “square”, “triangle”, “classic”

    41.isvisible():乌龟是否可见。如果可见返回True,反之则False。

    42.resizemode():参数:rmode取值:"auto","user","noresize".

    43.shapesize() | turtlesize() : 返回笔的属性。

    44.shearfactor(): 设置或者返回但钱的剪切因子。

    45.tilt():旋转由turtle shape角度从当前的倾斜角度。

    46.settiltangle():无论当前的倾斜角度如何,旋转乌龟指向 angle 指定的方向。参数:angle -数字。已弃用

    47.tiltangle():设置或者返回当前的倾斜角度。参数:angle - 数字

    48.shapetransform():设置或返回乌龟的形状的当前转换矩阵。

    49.get_shapepoly():返回当前形状的坐标。

    50.onclick():鼠标点击事件。参数:fun-一个带有两个参数的函数,这些参数将与画布上单击点的坐标一个调用。num-鼠标按钮的数量,默认为1(左键)。add- True的时候将添加新的绑定。否则替换以前的绑定。

    51.onrelease():鼠标释放事件。参数同点击事件。

    52.ondrag():鼠标移动事件。参数同点击事件。

    53.begin_poly(): 开始记录多边形的顶点。

    54.end_poly():停止记录多边形的顶点。

    55.get_poly():返回最后记录的多边形。

    56.clone():创建并返回具有相同位置等等属性的乌龟克隆。

    57.getturtle() | getpen() :获取trutle对象本身。

    58.getscreen():返回正在绘制的对象。

    59.setundobuffer(): 设置或禁用中断器。参数: size-整数。如果大小是None,则禁用缓冲区。

    60.undobufferentries():返回undobuffer中的条目数。

    61.bgcolor():设置或者返回当前的TurtleScreen的背景颜色。

    62.bgpic():设置背景图片。参数: picname-文件名。

    62.delay(): 设置或返回以毫秒为单位的绘制延迟,延迟越大,绘图越慢。

    63.ontimer():定时器。

    64.mainloop() | done() :开始循环 。

    65.textinput() | numinput():弹出一个输入字符串和数字的窗口。

    66.mode(): 三种方式:“standard”, “logo” or “world”

    正常时钟

    # coding=utf-8 import turtle from datetime import * # 抬起画笔,向前运动一段距离放下 def Skip(step): turtle.penup() turtle.forward(step) turtle.pendown() def mkHand(name, length): # 注册Turtle形状,建立表针Turtle turtle.reset() Skip(-length * 0.1) # 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。 turtle.begin_poly() turtle.forward(length * 1.1) # 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。 turtle.end_poly() # 返回最后记录的多边形。 handForm = turtle.get_poly() turtle.color('black') turtle.register_shape(name, handForm) def Init(): global secHand, minHand, hurHand, printer # 重置Turtle指向北 turtle.mode("logo") # 建立三个表针Turtle并初始化 mkHand("secHand", 135) mkHand("minHand", 125) mkHand("hurHand", 90) secHand = turtle.Turtle() secHand.shape("secHand") minHand = turtle.Turtle() minHand.shape("minHand") hurHand = turtle.Turtle() hurHand.shape("hurHand") for hand in secHand, minHand, hurHand: hand.shapesize(1, 1, 3)#返回笔的属性 hand.speed(0) # 建立输出文字Turtle printer = turtle.Turtle() # 隐藏画笔的turtle形状 printer.hideturtle() printer.penup() def SetupClock(radius): # 建立表的外框 turtle.reset() turtle.pensize(7) turtle.pencolor("#ff5500") turtle.fillcolor("green") for i in range(60): Skip(radius) if i % 5 == 0: turtle.forward(20) Skip(-radius - 20) Skip(radius + 20) if i == 0: turtle.write(int(12), align="center", font=("Courier", 14, "bold")) elif i == 30: Skip(25) turtle.write(int(i / 5), align="center", font=("Courier", 14, "bold")) Skip(-25) elif (i == 25 or i == 35): Skip(20) turtle.write(int(i / 5), align="center", font=("Courier", 14, "bold")) Skip(-20) else: turtle.write(int(i / 5), align="center", font=("Courier", 14, "bold")) Skip(-radius - 20) else: turtle.dot(5) Skip(-radius) turtle.right(6) def Week(t): week = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] return week[t.weekday()] def Date(t): y = t.year m = t.month d = t.day return "%s-%d-%d" % (y, m, d) def Tick(): # 绘制表针的动态显示 t = datetime.today() second = t.second + t.microsecond * 0.000001 minute = t.minute + second / 60.0 hour = t.hour + minute / 60.0 secHand.setheading(6 * second) minHand.setheading(6 * minute) hurHand.setheading(30 * hour) turtle.tracer(False) printer.forward(65) printer.write(Week(t), align="center", font=("Courier", 14, "bold")) printer.back(65) printer.write('Fengqi', align="center", font=("Courier", 14, "bold")) printer.back(65) printer.write(Date(t), align="center", font=("Courier", 14, "bold")) printer.home() turtle.tracer(True) # 100ms后继续调用tick turtle.ontimer(Tick, 100) def main(): # 打开/关闭龟动画,并为更新图纸设置延迟。 turtle.tracer(False) ts = turtle.getscreen() ts.bgcolor("#BBBBBB") Init() SetupClock(160) turtle.tracer(True) Tick() turtle.mainloop() if __name__ == "__main__": main()

     

     

    最新回复(0)