前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >除了画佩奇我们还要玩点更高级的

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

作者头像
小小詹同学
发布2019-11-12 16:54:27
3500
发布2019-11-12 16:54:27
举报
文章被收录于专栏:小詹同学小詹同学

投稿自公众号:Ahab杂货铺

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

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

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

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

看着爷爷满村子找佩奇,鼻子有点酸,作为程序猿我想用Python来告诉爷爷,啥是佩奇?用python做一个社会人,这是很久之前的一篇文章,Turtle是自己接触python之后用到的第一个库,Trutle这个库很有意思,很容易得到满足感,学习完以后自己随手画了一个佩奇,佩奇当时没火没想到今天火了。画佩奇的代码已经上传到后台,公众号后台回复【社会人】即可获取。今天的文章再次给大家介绍一下Turtle,用它来画高级一点的东西,话不多说我们开始吧。

程序介绍

在Python中有很多编写图形程序的方法,一个简单的启动图形化程序设计的方法是使用Python内嵌的Turtle模块。Turtle是Python内嵌的绘制线、圆以及其他形状(包括文本)的图形模块。它很容易学习并且使用简单。

一个Turtle实际上是一个对象,在导入Turtle模块时,就创建了对象,然后,可以调用Turtle对象的各种方法完成不同的操作。

当创建一个Turtle对象时,它的位置被设定在(0,0)处——窗口的中心,而且它的方向被设置为向右。Turtle模块用笔来绘制图形。默认情况下,笔是向下的(就像真实的笔尖触碰着一张纸)。如果笔是向下的,那么当移动Turtle的时候,它就会绘制出一条从当前位置到新位置的线。

今天我们要画的是一个可以获取当前时间的钟表

具体实现

因为钟表轮廓中是有几个小黑点的,那么我们首先需要设置画笔的动作,抬起画笔向前一段距离以后再放下

代码语言:javascript
复制
1    def Skip(step):
2    turtle.penup()
3    turtle.forward(step)
4    turtle.pendown()

注册Turtle的形状,建立一个表针Turtle,同时记录多边形起点和终点。(当前的乌龟位置是多边形的第一个顶点,多边形的最后一个顶点将与第一个顶点相连)返回最后记录的多边形。

代码语言:javascript
复制
1    def 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

代码语言:javascript
复制
 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()

现在需要定义时间格式

代码语言:javascript
复制
 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)

绘制指针的动态显示

代码语言:javascript
复制
 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)

现在是重头戏了,绘制钟表的轮廓,这的主要逻辑就是一个循环,不难于理解。

代码语言:javascript
复制
 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)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小詹学Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 程序介绍
  • 具体实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档