到目前为止我们通过turtle库了解了Python的基本语法,包括顺序与循环、函数的调用与方法的定义、列表与简单的数学运算等;也学习了用turtle库绘图的基本用法,包括坐标与角度、落笔抬笔、颜色与填充等。

但是我们所绘的所有内容仅限于直线,对于曲线的绘制,一直没有涉及。从现在开始,我们就来了角一下用turtle库怎么画曲线,首先我们来画一个圆,看代码:

import turtle as t

t.circle(100) # 画一个半径为100的圆

t.mainloop() # 等效于t.done()

运行这个例子,我们可以看到,turtle从坐标原点开始,按逆时针方向画出了一个圆。非常简单,一条语句就实现了。

第一个问题是,如果有希望turtle按顺时针方向画,应该怎样实现?嗯,将t.circle(100)中的参数100改为-100即可,也就是t.circle(-100)。也就是说明这个参数除了表示圆的半径面,其正负性还定义了画圆的方向。修改一下上面的代码:

import turtle as t

t.circle(100) # 从原点开始按逆时针方向画圆,直径为100

t.circle(-100) # 从鼠标所在点开始按顺时针方向画圆,直径为100

t.mainloop()

运行这段代码,可以看到turtle在界面上画出一个8字形,先逆时针方向画圆,再顺时针方向画圆。可以看到turtle画这两个圆中的第一个时,相当于从圆的下底开始画(也即圆的-90度位置);画第二个圆相当于从上顶位置开始画(也即90度的位置)。

那么,第二个问题来了,如果我希望从圆的0度位置开始画,或者180度位置开始画,应该怎么操作?修改一下上面的实例代码:

import turtle as t

t.setheading(90) # 设置turtle的方向为正北(向上)方向

t.circle(100) # 逆时针画

t.circle(-100) # 顺时针画

t.mainloop()

运行一下例子,可以看到,第一个圆是从0度位置开始画的,而第二个圆是从180度位置开始画的。通过这个小改动,我们可以看到,turtle画圆时,没有明确的“圆心”概念,而是以“初始方向+半径”来决定一个圆的位置和大小。其核心原理等同于割圆术。

接下来,我们来看一下怎样画一段弧线,而不是完整的圆。t.circle()的第一个参数是半径,第二个参数就是圆弧的角度,默认是360度。修改一下上面的例子:

import turtle as t

t.setheading(90)

t.circle(100, 120) # 画一段120度的弧线

t.penup() # 抬起笔来

t.goto(0, 0) # 回到圆点位置

t.setheading(90) # 向上画

t.pendown() # 落笔,开始画

t.circle(-100, 120) # 画一段120度的弧线

t.mainloop()

运行这例子,可以看到turtle在界面上向左和向右各画了两段弧,即120度长度的弧线。中间增加的抬笔、回圆点、设置初始方向、落笔,主要是为了重新初始化绘图的前提条件,以便于跟前面的例子做对比。

由此可见,turtle画曲线的方法还是比较简陋的,需要配合其它的方向、坐标、位移等来一起实现。接下来,我们来画一个稍微复杂一点,但是非常有趣的小蛇,看代码:

import turtle as t

t.penup()

t.goto(-150, 0) # 到起始点

t.pensize(25) # 设置画笔粗细

t.pencolor('green') # 设置画笔颜色

t.setheading(45) # 向45度方向画

t.pendown()

t.circle(-50, 90) # 顺时针方向画90度的弧线

t.circle(50, 90) # 继续按逆时针方向画弧

t.circle(-50, 90)

t.circle(50, 45)

t.setheading(0) # 继续向0度方向画

t.forward(50)

t.circle(10, 160) # 继续画一个160度的小弧

t.setheading(160) # 面向小弧的最后角度

t.forward(8) # 再向前伸一点

t.mainloop()

运行这个小例子,可以看到,turtle在界面上画出了一条弯弯曲曲的小绿蛇。通过编程,可以清晰的展现出用turtle库画弧线,就是要配合方向、坐标、位移等来一起实现。接下来,我们再配合上初级篇中的函数定义,来画一只小筛子,来模拟我们“师高编程”的LOGO,上代码:

import turtle as t

def hair(): # 画头发

t.penup()

t.goto(-50, 150)

t.pendown()

t.fillcolor('#a2774d')

t.begin_fill()

for j in range(10): # 重复执行10次

t.setheading(60 - (j * 36)) # 每次调整初始角度

t.circle(-50, 120) # 画120度的弧

t.end_fill()

def face(): # 画脸

t.penup()

t.goto(0, 100)

t.pendown()

t.fillcolor('#f2ae20')

t.begin_fill()

t.setheading(180)

t.circle(85)

t.end_fill()

#下巴

t.circle(85, 120)

t.fillcolor('white')

t.begin_fill()

t.circle(85, 120)

t.setheading(135)

t.circle(100, 95)

t.end_fill()

def ears(dir): # 画眼睛,dir用来设置方向,左右眼对称

t.penup()

t.goto((0-dir)*30, 90)

t.setheading(90)

t.pendown()

t.fillcolor('#f2ae20')

t.begin_fill()

t.circle(dir*30)

t.end_fill()

t.penup()

t.goto((0-dir)*40, 85)

t.setheading(90)

t.pendown()

t.fillcolor('white')

t.begin_fill()

t.circle(dir*17)

t.end_fill()

def nose(): # 画鼻子

t.penup()

t.goto(20, 0)

t.setheading(90)

t.pendown()

t.fillcolor('#a2774d')

t.begin_fill()

t.circle(20)

t.end_fill()

def eye(dir): # 画耳朵,dir用来设置方向,左右耳对称

t.penup()

t.goto((0-dir)*30, 20)

t.setheading(0)

t.pendown()

t.fillcolor('black')

t.begin_fill()

t.circle(10)

t.end_fill()

def mouth(): # 画嘴巴

t.penup()

t.goto(0, 0)

t.setheading(-90)

t.pendown()

t.forward(50)

t.setheading(0)

t.circle(80, 30)

t.penup()

t.goto(0, -50)

t.setheading(180)

t.pendown()

t.circle(-80, 30)

hair()

ears(1)

ears(-1)

face()

eye(1)

eye(-1)

mouth()

nose()

t.done()

运行这段代码,可以看到turtle在界面上画出一个小狮子的头像。综合运用方向、坐标、位移,加上一点耐心和对坐标位置的调试,用turtle的确可以画出任何你想像的图形。

入门篇中有个小彩蛋,也就是可以修改Python的turtle指针外形。默认的指针就是一个小箭头,我们可以通过t.shape('turtle'),将这个小箭头改成一只真正的小乌龟,增加编程的趣味性。

但是,我们还可以进一步,来设定自己的指针外形,将指针改成我们希望的任何样式,这一过程主要通过以下几个方法的组合来实现:

t.begin_poly() # 开始绘制

# 绘制指针过程省略

t.end_poly() # 结束绘制

poly = t.get_poly() # 获取绘制

t.register_shape('name', ploy) # 注册一个名为'name'的shape

newPoint = t.Pen() # 初始化一只新turtle

newPoint.shape('name') # 让这只turtle使用名为'name'的shape

可见,重点是turtle库中提供了一个t.register_shape()方法,以供我们注册自己的shape,有了这个方法,在特定的条件下,就可以极大的方便我们的程序设计。通过初始化出多只新turtle,可以同时在一个界面上以不同的shape绘图。下面给出一段绘制实时时钟的代码,重点部分我已给出注释。

#-*- coding:utf-8 –*-

#用turtlr画时钟

#以自定义shape的方式实现

#当然,使用多只turtle来完全重绘的方法实现,也没有问题。

#如果需要重绘方法的代码,请加公众号:see_goal 留言“turtle时钟”

import turtle as t

import datetime as d

def skip(step): # 抬笔,跳到一个地方

t.penup()

t.forward(step)

t.pendown()

def drawClock(radius): # 画表盘

t.speed(0)

t.mode("logo") # 以Logo坐标、角度方式

t.hideturtle()

t.pensize(7)

t.home() # 回到圆点

for j in range(60):

skip(radius)

if (j % 5 == 0):

t.forward(20)

skip(-radius-20)

else:

t.dot(5)

skip(-radius)

t.right(6)

def makePoint(pointName, len): # 钟的指针,时针、分针、秒针

t.penup()

t.home()

t.begin_poly()

t.back(0.1*len)

t.forward(len*1.1)

t.end_poly()

poly = t.get_poly()

t.register_shape(pointName, poly) # 注册为一个shape

def drawPoint(): # 画指针

global hourPoint, minPoint, secPoint, fontWriter

makePoint("hourPoint", 100)

makePoint("minPoint", 120)

makePoint("secPoint", 140)

hourPoint = t.Pen() # 每个指针是一只新turtle

hourPoint.shape("hourPoint")

hourPoint.shapesize(1, 1, 6)

minPoint = t.Pen()

minPoint.shape("minPoint")

minPoint.shapesize(1, 1, 4)

secPoint = t.Pen()

secPoint.shape("secPoint")

secPoint.pencolor('red')

fontWriter = t.Pen()

fontWriter.pencolor('gray')

fontWriter.hideturtle()

def getWeekName(weekday):

weekName = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']

return weekName[weekday]

def getDate(year, month, day):

return "%s-%s-%s" % (year, month, day)

def realTime():

curr = d.datetime.now()

curr_year = curr.year

curr_month = curr.month

curr_day = curr.day

curr_hour = curr.hour

curr_minute = curr.minute

curr_second = curr.second

curr_weekday = curr.weekday()

t.tracer(False)

secPoint.setheading(360/60*curr_second)

minPoint.setheading(360/60*curr_minute)

hourPoint.setheading(360/12*curr_hour + 30/60*curr_minute)

fontWriter.clear()

fontWriter.home()

fontWriter.penup()

fontWriter.forward(80)

# 用turtle写文字

fontWriter.write(getWeekName(curr_weekday), align="center", font=("Courier", 14, "bold"))

fontWriter.forward(-160)

fontWriter.write(getDate(curr_year, curr_month, curr_day), align="center", font=("Courier", 14, "bold"))

t.tracer(True)

print(curr_second)

t.ontimer(realTime, 100) # 每隔100毫秒调用一次realTime()

def main():

t.tracer(False)

drawClock(160)

drawPoint()

realTime()

t.tracer(True)

t.mainloop()

if __name__ == '__main__':

main()

运行这个例子,可以看到turtle在界面上实时展示出一个时钟。我们重新编写过的这段代码还是比较简洁,之前没有介绍到的就是用turtle怎么输出文字,详细可以看例子中的write()方法。

用python画耳朵_Python易学就会(四)turtle绘图入门--高级篇相关推荐

  1. python画误差棒_Python数据处理从零开始----第四章(可视化)(3)散点图和误差棒...

    目录 Python数据处理从零开始----第四章(可视化)③散点图和误差棒 Python数据处理从零开始----第四章(可视化)④误差图 =============================== ...

  2. 用python画动态樱花_利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白...

    利用python画一棵漂亮的樱花树,turtle画图代码大全,此处感谢知乎大佬小白 此处感谢知乎大佬 小白练手 练习一下比较流行的turtle(海龟库) 画一棵漂亮的樱花树,效果如下: ps: 是动态 ...

  3. [Python从零到壹] 六十四.图像识别及经典案例篇之图像傅里叶变换和傅里叶逆变换详解

    祝大家新年快乐,阖家幸福,健康快乐! 欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所 ...

  4. 用python画耳朵_如何用python画一只兔子

    python的用处真的是太广泛了,今天在网上学习查找资料时,看到有网友用python来画画.用python画出一只兔子,为大家分享一下:如何用python画一只兔子? 画了一只大耳朵小兔子,灵感来源是 ...

  5. 用python画猪_python实现画图画猪

    前言:文章来自我的CSDN博客,有兴趣的朋友可以自己去博客看,因为知乎始终是一个回答问题的地方,写文章的很少.也可以关注一下我的博客.谢谢大家.如果文章有什么问题可以直接提出来我修改. 本文链接:ht ...

  6. 用python画耳朵_如何用python画猪头

    用python画猪头的方法:首先设置画布和画笔,代码为[a.screensize(400,300)a.setup(width=400,height=300)]:然后画脸型,代码为[.goto(-100 ...

  7. python画蝴蝶_python画蝴蝶曲线图的实例

    蝴蝶曲线是由Temple H·Fay发现的可用极坐标函数表示的蝴蝶曲线. 由于此曲线优美, 因此就想把它作为博客favicon.ico,这里我使用pytho matplotlib.pyplot包来绘制 ...

  8. 用python画树_Python+Turtle动态绘制一棵树实例分享

    本文实例主要是对turtle的使用,实现Python+turtle动态绘制一棵树的实例,具体代码: # drawtree.py from turtle import Turtle, mainloop ...

  9. python 画蝴蝶_python画蝴蝶曲线图的实例

    蝴蝶曲线是由Temple H·Fay发现的可用极坐标函数表示的蝴蝶曲线. 由于此曲线优美, 因此就想把它作为博客favicon.ico,这里我使用pytho matplotlib.pyplot包来绘制 ...

最新文章

  1. Oracle数据库以及Oracle SQL Developer初体验
  2. 一篇文章让你轻松搞定SpringBoot和SpringCloud之间的版本选择!!!
  3. 【深度学习】基础知识--CNN:图像分类(上)
  4. anaconda的简单使用教程(虚拟环境安装)
  5. 安装MySql卡在Start Service的问题
  6. oracle redo 200mb,Oracle的redo log在各场景下的恢复
  7. linux shell read line,【Linux shell】while read line
  8. centos7赋予全部权限_终结CentOS 7+Snort2.9+BASE 安装
  9. 毕设题目:Matlab优化分配
  10. Java开发工程师项目经验以及个人介绍实例
  11. MVC自定义路由的配置,必须把自己的路由写在前面
  12. Windbg是一款非常好用的经典windows系统蓝屏分析修复工具
  13. LoadRunner视频教程地址
  14. 南京信息工程大学计算机类专业排名,2019年南京信息工程大学优势专业排名及分数线...
  15. 新西兰梅西大学有计算机专业吗,新西兰梅西大学世界排名|怎么样|入学条件_海外院校库-柳橙网...
  16. CVE-2022-28512 Fantastic Blog CMS 存在SQL注入漏洞
  17. Hadoop集群中HDFS的API测试案例以及MapReduce的多种提交Job方式案例
  18. java推算日期后天_分别用C++和Java写的计算后天的日期code
  19. 从零开始之uboot、移植uboot2017.01(八、命令解析与实现)
  20. Python发送邮件的类

热门文章

  1. 机房建设主要标准规范的介绍
  2. 交巡警求全市距离MATLAB程序,数学建模论文 交巡警服务平台的设置与调度
  3. Field ‘id‘ doesn‘t have a default value问题解决方法
  4. 百兆以太网FPGA实现,ARP+UDP功能,一个采集卡上的程序
  5. 揭开关于Kindle Fire的一些重要信息
  6. msde能连mysql吗_随心MSDE 2017(数据库服务器搭建)V2.1 官方最新版
  7. 周浩正:写给编辑人的信 繁盛的秘诀之三
  8. Mac各种好用软件下载
  9. Boson NetSim11 路由器模拟子网环境实现连接实验
  10. ldap服务器签名要求修改,2020 针对 Windows 的 LDAP 通道绑定和 LDAP 签名要求