乐趣区

除了画佩奇我们还要玩点更高级的

“你告诉爷爷你需要什么东西呀,爷爷给你准备,佩奇,什么是佩奇呀?”…
这是一个发生在大山里的故事,但故事的情节所有人都不会陌生。快过年了,在农村爷爷给城里的孙子打电话,孙子说想要“佩奇”,为了满足孩子的心愿,爷爷开始满村子找佩奇…
当除夕夜家人团聚,爷爷开始展示爱心礼物,“硬核佩奇”的出现,惊呆众人高能反转,别出心裁的爱跨越了隔代距离,成功博得孙子欢心。
啥是佩奇?已不重要。佩奇是他用搜集的所有信息,一点一滴的用心创造、编织爱的过程。佩奇是对孙子的关爱、佩奇是对团圆的企盼。
看着爷爷满村子找佩奇,鼻子有点酸,作为程序猿我想用 Python 来告诉爷爷,啥是佩奇?用 python 做一个社会人,这是很久之前的一篇文章,Turtle 是自己接触 python 之后用到的第一个库,Trutle 这个库很有意思,很容易得到满足感,学习完以后自己随手画了一个佩奇,佩奇当时没火没想到今天火了。画佩奇的代码已经上传到后台,公众号后台回复【社会人】即可获取。今天的文章再次给大家介绍一下 Turtle,用它来画高级一点的东西,话不多说我们开始吧。程序介绍
在 Python 中有很多编写图形程序的方法,一个简单的启动图形化程序设计的方法是使用 Python 内嵌的 Turtle 模块。Turtle 是 Python 内嵌的绘制线、圆以及其他形状(包括文本)的图形模块。它很容易学习并且使用简单。
一个 Turtle 实际上是一个对象,在导入 Turtle 模块时,就创建了对象,然后,可以调用 Turtle 对象的各种方法完成不同的操作。
当创建一个 Turtle 对象时,它的位置被设定在(0,0)处——窗口的中心,而且它的方向被设置为向右。Turtle 模块用笔来绘制图形。默认情况下,笔是向下的(就像真实的笔尖触碰着一张纸)。如果笔是向下的,那么当移动 Turtle 的时候,它就会绘制出一条从当前位置到新位置的线。
今天我们要画的是一个可以获取当前时间的钟表。具体实现
因为钟表轮廓中是有几个小黑点的,那么我们首先需要设置画笔的动作,抬起画笔向前一段距离以后再放下
1def Skip(step):2 turtle.penup()3 turtle.forward(step)4 turtle.pendown()
注册 Turtle 的形状,建立一个表针 Turtle,同时记录多边形起点和终点。(当前的乌龟位置是多边形的第一个顶点,多边形的最后一个顶点将与第一个顶点相连)返回最后记录的多边形。
1def mkHand(name, length):2 turtle.reset()3 Skip(-length * 0.1)4 turtle.begin_poly()5 turtle.forward(length * 1.1)6 turtle.end_poly()7 handForm = turtle.get_poly()8 turtle.register_shape(name, handForm)
因为钟表有三个指针,现在需要建立三个表针 Turtle 并初始化,同时还需要建立一个输出文字的 Turtle
1def Init(): 2 global secHand, minHand, hurHand, printer 3 turtle.mode(“logo”) 4 mkHand(“secHand”, 135) 5 mkHand(“minHand”, 125) 6 mkHand(“hurHand”, 90) 7 secHand = turtle.Turtle() 8 secHand.shape(“secHand”) 9 minHand = turtle.Turtle()10 minHand.shape(“minHand”)11 hurHand = turtle.Turtle()12 hurHand.shape(“hurHand”)1314 for hand in secHand, minHand, hurHand:15 hand.shapesize(1, 1, 3)16 hand.speed(10)171819 printer = turtle.Turtle()20 printer.hideturtle()21 printer.penup()
现在需要定义时间格式
1def Week(t): 2 week = [“ 星期一 ”, “ 星期二 ”, “ 星期三 ”, 3 “ 星期四 ”, “ 星期五 ”, “ 星期六 ”, “ 星期日 ”] 4 return week[t.weekday()] 5 6 7def Date(t): 8 y = t.year 9 m = t.month10 d = t.day11 return “%s %d%d” % (y, m, d)
绘制指针的动态显示
1def Tick(): 2 3 t = datetime.today() 4 second = t.second + t.microsecond * 0.000001 5 minute = t.minute + second / 60.0 6 hour = t.hour + minute / 60.0 7 secHand.setheading(6 * second) 8 minHand.setheading(6 * minute) 9 hurHand.setheading(30 * hour)1011 turtle.tracer(False)12 printer.forward(65)13 printer.write(Week(t), align=”center”,14 font=(“Courier”, 14, “bold”))15 printer.back(130)16 printer.write(Date(t), align=”center”,17 font=(“Courier”, 14, “bold”))18 printer.home()19 turtle.tracer(True)2021 # 100ms 后继续调用 tick22 turtle.ontimer(Tick, 100)
现在是重头戏了,绘制钟表的轮廓,这的主要逻辑就是一个循环,不难于理解。
1def SetupClock(radius): 2 turtle.reset() 3 turtle.pensize(7) 4 for i in range(60): 5 Skip(radius) 6 if i % 5 == 0: 7 turtle.forward(20) 8 Skip(-radius – 20) 910 Skip(radius + 20)11 if i == 0:12 turtle.write(int(12), align=”center”, font=(“Courier”, 14, “bold”))13 elif i == 30:14 Skip(25)15 turtle.write(int(i / 5), align=”center”, font=(“Courier”, 14, “bold”))16 Skip(-25)17 elif (i == 25 or i == 35):18 Skip(20)19 turtle.write(int(i / 5), align=”center”, font=(“Courier”, 14, “bold”))20 Skip(-20)21 else:22 turtle.write(int(i / 5), align=”center”, font=(“Courier”, 14, “bold”))23 Skip(-radius – 20)24 else:25 turtle.dot(5)26 Skip(-radius)27 turtle.right(6)
写在最后
学习就是举一反三,希望你可以用 turtle 画出更有意思的东西来。钟表的完整代码需要后台回复【钟表】获取
【推荐阅读】
致青春 –Python 实现俄罗斯方块
【Python 爬虫】Urllib 的使用(2)
【LeetCode】贪心算法 – 划分字母区间(763)
机器学习实战 – 住房月租金预测(3)

退出移动版