2020-07-26 Python学习笔记29 Python绘图

一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习。

声明:本人学习是在扇贝编程通过网络学习的,相关的知识、案例来源于扇贝编程。如果使用请说明来源。

学习笔记:

turtle(海龟绘图)

turtle 是 Python 中自带的绘图模块,turtle 的方法有很多,只介绍一些毕业项目里会用到的,大家有兴趣可以去官方文档了解更多。官方文档地址:

https://docs.python.org/zh-cn/3/library/turtle.html

可以把教学环境中运行结果区域想象成一个画板,使用 turtle 控制画笔在画板上画画。而这个画笔是有形状的,默认是一个小箭头,我们可以使用 turtle.shape('turtle') 将其设成一个小海龟。除了变成小海龟外,还支持传入 'arrow'(箭头),'circle'(圆),'square'(正方形),'triangle'(三角形)和 'classic'(经典)。

默认状态下,画笔是落在画板最中间的,并以此为原点形成了一个坐标系,单位是像素。并且我们根据“上北下南左西右东”的惯例标注四个方向。实际上这个坐标系是不显示的,但我们要知道小海龟实际上是在坐标系内移动的。

小海龟头的朝向是前方(默认朝东),我们可以调用 turtle.forward(3) 让小海龟前进 3 像素,也就是小海龟移动到了坐标系中 (3, 0) 的位置。因为我们的画笔默认是落下的,因此在移动的过程中会留下一道轨迹,即一条长 3 像素的直线。

除了前进之外,当然也有后退。调用 turtle.backward(3) 即可让小海龟向后倒退 3 像素,移动到坐标系中 (-3, 0) 的位置,同样也会留下一条长 3 像素的直线。

注意:后退后小海龟的朝向是不变的。之后我们会学习让小海龟转向,也就是调整小海龟前进的方向。

画笔的颜色默认是黑色的,我们可以使用 turtle.color('red') 改成红色的。当然,你也可以使用 turtle.color('yellow') 改成黄色,使用 turtle.color('pink') 改成粉色等等。

注意:颜色的英文单词是要用单引号引起来的

除了使用颜色的英文外,我们还能传入 16 进制的 RGB 色值。RGB 色值能表示出 1600 多万种颜色,比如 #000000 表示黑色,#FFFFFF 表示白色,#FF0000 表示红色等。

练习:划线

import turtle    #导入海龟绘图程序

turtle.shape('classic')  改变画笔的形状:arrow/circle/triangle/square/turtle/classic

turtle.color('red')    设置颜色,注意颜色一定要用单引号引起来

turtle.forward(100)  方向和距离设置

turtle.right(90)      转向和家督设置

turtle.color('yellow')

turtle.forward(100)

turtle.right(90)

turtle.color('pink')

turtle.forward(100)

turtle.right(90)

turtle.color('white')

turtle.forward(100)

初步了解了 turtle,并学会了使用 turtle 画一条任意颜色的直线了。前后移动我们学会了,接下来跟着我一起学习如何让小海龟转弯!

注意:如果你在本地环境使用 turtle 画图,图形绘制完毕后程序会自动退出。需要在代码最后加上 turtle.done() 来防止程序自动退出。

转弯其实很简单,分为左转和右转。左转是 turtle.left(),右转是 turtle.right()。它俩的参数是角度,比如 turtle.right(90) 表示右转 90 度。同理,turtle.left(90) 表示左转 90 度。

转向后,小海龟的朝向就变了。再调用 turtle.forward() 会朝着转向后小海龟头指着的方向前进。

import turtle

for i in range(4):

  turtle.forward(100)

  turtle.right(90)

turtle.left() 和 turtle.right() 每次转向都是根据当前朝向来转的,当多次转向后你可能就不知道现在朝向哪了。因此,我们还可以使用 turtle.setheading() 来直接设置朝向。turtle.setheading() 的参数也是角度,只是这个角度对应的朝向是固定的。

当然,0 到 360 度之间的角度都是可以的,调用 turtle.setheading(45) 可以让小海龟朝向东北方向。

之前显示小海龟是为了方便理解朝向,现在弄清楚了朝向我们就可以将小海龟隐藏了。隐藏小海龟可以加快绘图的速度,并且最后画出的图上也不会有个小海龟影响画风。

要隐藏小海龟非常的简单,只要调用 turtle.hideturtle() 即可。当你想再次显示小海龟时,调用 turtle.showturtle() 即可。

练习:画多边形

import turtle

turtle.color('red')

# n 要大于 2

def draw_polygon(n):

  #turtle.begin_fill()

  for i in range(n):

    turtle.forward(100)

    turtle.right(144)

  #turtle.end_fill()

draw_polygon(5)

修改:

import turtle

turtle.penup()

turtle.goto(-100, 100)

turtle.pendown()  改变初始绘画的位置,抬笔之后一定要落笔,不然只有动作没有图案

turtle.color('red')

# n 要大于 2

def draw_polygon(n):

  turtle.begin_fill()

  for i in range(n):

    turtle.forward(100)

    turtle.right(144)

  turtle.end_fill()    画完之后进行填充,所以在循环之外

draw_polygon(5)

画正多边形:

import turtle

turtle.color('red')

turtle.penup()

turtle.goto(-55, 130)

turtle.pendown()

# n 要大于 2

def draw_polygon(n):

  for i in range(n):

    turtle.forward(50)

    turtle.right(360/n)

draw_polygon(18)

这样,我们就得到了一个边长 为 100 像素的五角星了。但这还不够,我们还要给五角星上色。上色需要设置填充颜色,turtle.color() 会将画笔颜色和填充颜色都设置成一个。而调用 turtle.fillcolor() 能单独设置填充颜色,你也可以调用 turtle.pencolor() 单独设置画笔颜色。

设置好填充颜色之后,我们就可以开始正式给五角星上色了。上色需要调用两个方法,分别是 turtle.begin_fill() 和 turtle.end_fill()。从名字就可以知道,一个是开始填充一个是结束填充。

练习:画五角星并填充

import turtle

turtle.color('red')  # 画笔颜色和填充颜色都设为红色

turtle.fillcolor('yellow')  设置填充颜色,但是这样会有红色的线条,很不好看

turtle.hideturtle()

def draw_polygon(n):


  turtle.begin_fill()

  for i in range(n):

    turtle.forward(100)

    turtle.right(144)

  turtle.end_fill()

draw_polygon(5)

  这黄色五角星上有红色的线,很不好看,如何能做到全部是黄色的呢?

移动五角星

你可能已经发现了,这颗五角星有些“歪”,不在画板的正中间。

做不到直接移动五角星,但我们可以移动画笔的初始位置。只要将画笔的初始位置往左上方移动一点,这样我们的五角星就处于坐标系的最中间了。上图中画笔的初始位置在坐标系中大概是 (-50 ,20),我们可以调用 turtle.goto(-50, 20) 来移动画笔的位置。第一个参数是 x 轴的坐标,第二个参数是 y 轴的坐标。

但直接移动画笔位置是有问题的,因为我们的画笔一直处于落下的状态,移动的过程中也会画出一条直线。我们可以调用 turtle.penup() 将画笔抬起,这样移动的过程中就不会画线。等需要时再调用 turtle.pendown() 将画笔落下开始绘图。

移动位置画五角星:

import turtle

turtle.color('red')

turtle.hideturtle()

turtle.penup()

turtle.goto(-50, 20)

turtle.pendown()

turtle.begin_fill()

for i in range(5):

  turtle.forward(100)

  turtle.right(144)

turtle.end_fill()

练习:满天星

你应该注意到了 turtle.speed(0) 这行代码,这是控制绘图速度的。因为画 50 颗小星星耗时较久,所以要加快绘图速度。 turtle.speed(0) 的参数是 0-10 的整数,其中 1-10 数字越大,绘图速度越快。1 最慢,10 最快,默认是 6。而 0 表示没有动画效果,因此 0 比 10 的速度还要快。

满天星画完了,我们最后再署个名。调用 turtle.write() 可以在画板上写字,参数为要写的内容。我们还能设置字的字体、大小等,比如 turtle.write('By 黄帮主', font = ('SimHei', 12, 'bold'))。font 参数是个元组,其中第一个是字体,第二个是字体大小,最后一个是字重。

import turtle

from random import randint

def draw_star():

  turtle.color('white')

  turtle.hideturtle()

  turtle.begin_fill()

  for i in range(5):

    turtle.forward(10)

    turtle.right(144)

  turtle.end_fill()

for i in range(50):

  turtle.speed(0)

  turtle.penup()

  x = randint(-150, 150)

  y = randint(-100, 100)

  turtle.goto(x, y)    位置随机

  turtle.pendown()

  draw_star()

turtle.penup()

turtle.goto(0, -130)

turtle.pendown()    By黄帮主这个几个字的位置

turtle.write('By 黄帮主',  font = ('SimHei', 12, 'bold'))

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351