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

逻辑沙漏
• 阅读 1369

“你告诉爷爷你需要什么东西呀,爷爷给你准备,佩奇,什么是佩奇呀?”...

这是一个发生在大山里的故事,但故事的情节所有人都不会陌生。快过年了,在农村爷爷给城里的孙子打电话,孙子说想要“佩奇”,为了满足孩子的心愿,爷爷开始满村子找佩奇…

当除夕夜家人团聚,爷爷开始展示爱心礼物,“硬核佩奇”的出现,惊呆众人高能反转,别出心裁的爱跨越了隔代距离,成功博得孙子欢心。

啥是佩奇?已不重要。佩奇是他用搜集的所有信息,一点一滴的用心创造、编织爱的过程。佩奇是对孙子的关爱、佩奇是对团圆的企盼。

看着爷爷满村子找佩奇,鼻子有点酸,作为程序猿我想用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")
13
14 for hand in secHand, minHand, hurHand:
15 hand.shapesize(1, 1, 3)
16 hand.speed(10)
17
18
19 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.month
10 d = t.day
11 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)
10
11 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)
20
21 # 100ms后继续调用tick
22 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)
9
10 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)

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Aidan075 Aidan075
4年前
Python爬取 201865 条《隐秘的角落》弹幕,发现看剧不如爬山?
本文不涉及剧透!请放心食用最近又火了一部国产剧:《隐秘的角落》如果你没看过,那可能会对朋友圈里大家说的“一起去爬山”、“小白船”、“还有机会吗”感到莫名其妙。暑期推荐旅游小五在这个端午假期也赶紧刷完了本剧,必须要写篇文章了。由于《隐秘的角落》是在爱奇艺独播,所以数据从爱奇艺下手最直接。如果没爬过爱奇艺,可以考虑使用豆瓣、微博、知乎(电视剧数据分析·万
Stella981 Stella981
3年前
Spark的分区机制的应用及PageRank算法的实现
佩奇排名(PageRank),又称网页排名、谷歌左侧排名,是一种由搜索引擎根据网页之间相互的超链接计算的技术,而作为网页排名的要素之一,以Google公司创办人拉里·佩奇(LarryPage)之姓来命名。Google用它来体现网页的相关性和重要性,在搜索引擎优化操作中是经常被用来评估网页优化的成效因素之一。概念Sp
Stella981 Stella981
3年前
Apache Dubbo的爱奇艺之旅
ApacheDubbo 简单介绍ApacheDubbo是一款开源的RPC(RemoteProcedureCall,远程过程调用)框架,其提供了简单易用、高性能的RPC能力、灵活可控的扩展、强大的服务治理、完善的开源生态支持,目前已有Java、Go、JS、Python等多个语言支持。ApacheDubbo更
Easter79 Easter79
3年前
Three.js 地理坐标和三维空间坐标的转换
奇技指南本文作者高峰,360奇舞团前端工程师,W3C性能工作组/WOT工作组成员本文转载自奇舞周刊引言在实现3D地球时,球面是通过地理贴图渲染的。所以我们所说的地理坐标和三维空间坐标的转换,是指将地理贴图上的坐标,转换为球面坐标(https://en.wikipedia.org/wiki/Spherical\_coor
Stella981 Stella981
3年前
Authing 亮相奇绩创坛路演,获众多投资人青睐
2020年11月21、22日,由奇绩创坛主办的2020首届路演活动DemoDay在北京圆满举办,现场氛围热烈,超过一千多家机构和投资人来到现场。Authing作为入选第二期创业营的30家公司之一,亮相本次DemoDay活动。奇绩创坛前身是YC中国,由陆奇博士(前百度总裁兼COO、微软执行副总裁、雅虎执行副总裁)于2
Stella981 Stella981
3年前
Python 奇思妙想
问题:男孩/女孩名字配对(找出首字母相同的名字):分析:以女孩名字的首字母和名字建立字典,通过男孩名字的首字母查找。girls \'alice','bernice','clarice'\boys \'chris','arnold','bob'\letterGirls{}forgirlingirls:
Easter79 Easter79
3年前
TiDB 在爱奇艺的应用及实践
爱奇艺,中国高品质视频娱乐服务提供者,2010年4月22日正式上线,推崇品质、青春、时尚的品牌内涵如今已深入人心,网罗了全球广大的年轻用户群体,积极推动产品、技术、内容、营销等全方位创新。企业愿景为做一家以科技创新为驱动的伟大娱乐公司。我们在前沿技术领域也保持一定的关注度。随着公司业务的快速发展,原来普遍使用的MySQL集群遇到了很多瓶颈,
Wesley13 Wesley13
3年前
MySQL 笔记整理(11)
笔记记录自林晓斌(丁奇)老师的《MySQL实战45讲》(本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除)11)怎么给字符串字段加索引?  日常工作中的登录系统,你很可能会使用emai这个字段。因此也很容易遇到类似这样的语句:mysqlselectfromuserwhereemail'xxx';  
流浪剑客 流浪剑客
1年前
星露谷物语Stardew Valley for Mac 中文原生版
是一款由ConcernedApe单人开发,并与《星界边境》的制作者Chucklefish一同参与发行的开放式乡村模拟经营类游戏。在游戏中,玩家扮演继承了爷爷农场的“StardewValley”主角开阔和经营整座小牧场。游戏的背景设定在一个名为Pelican
逻辑沙漏
逻辑沙漏
Lv1
即使没有月亮,心中也是一片皎洁。
文章
5
粉丝
0
获赞
0