Contents
python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),turtle库是python的内部库,使用导入即可 import turtle
先说明一下turtle绘图的基础知识:
1. 画布(canvas)
画布就是turtle为我们展开用于绘图区域, 我们可以设置它的大小和初始位置
1.1 设置画布大小
turtle.screensize(canvwidth=None, canvheight=None, bg=None)
参数分别为画布的宽(单位像素), 高, 背景颜色
如:
1 2 3 |
turtle.screensize(800, 600, "green") turtle.screensize() #返回默认大小(400, 300) |
turtle.setup(width=0.5, height=0.75, startx=None, starty=None)
参数:
width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例
(startx, starty): 这一坐标表示 矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心
如:
1 2 3 |
turtle.setup(width=0.6, height=0.6) turtle.setup(width=800, height=800, startx=100, starty=100) |
2. 画笔
2.1 画笔的状态
在画布上,默认有一个坐标原点为画布中心的坐标轴, 坐标原点上有一只面朝x轴正方向小乌龟. 这里我们描述小乌龟时使用了两个词语:坐标原点
(位置),面朝x轴正方向
(方向), turtle绘图中, 就是使用位置方向描述小乌龟(画笔)的状态
2.2 画笔的属性
画笔(画笔的属性,颜色、画线的宽度)
1) turtle.pensize():设置画笔的宽度;
2) turtle.pencolor(); 没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red",也可以是RGB 3元组,
1 2 3 4 5 6 |
>>> pencolor('brown') >>> tup = (0.2, 0.8, 0.55) >>> pencolor(tup) >>> pencolor() '#33cc8c' |
3) turtle.speed(speed): 设置画笔移动速度,画笔绘制的速度范围[0,10]整数, 数字越大越快
2.3 绘图命令
操纵海龟绘图有着许多的命令,这些命令可以划分为3种:一种为运动命令,一种为画笔控制命令,还有一种是全局控制命令
(1)画笔运动命令:
命令 | 说明 |
---|---|
turtle.forward(distance) | 向当前画笔方向移动distance像素长 |
turtle.backward(distance) | 向当前画笔相反方向移动distance像素长度 |
turtle.right(degree) | 顺时针移动degree° |
turtle.left(degree) | 逆时针移动degree° |
turtle.pendown() | 移动时绘制图形,缺省时也为绘制 |
turtle.goto(x,y) | 将画笔移动到坐标为x,y的位置 |
turtle.penup() | 移动时不绘制图形,提起笔,用于另起一个地方绘制时用 |
turtle.speed(speed) | 画笔绘制的速度范围[0,10]整数 |
turtle.circle() | 画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆 |
(2)画笔控制命令:
命令 | 说明 |
---|---|
turtle.pensize(width) | 绘制图形时的宽度 |
turtle.pencolor() | 画笔颜色 |
turtle.fillcolor(colorstring) | 绘制图形的填充颜色 |
turtle.color(color1, color2) | 同时设置pencolor=color1, fillcolor=color2 |
turtle.filling() | 返回当前是否在填充状态 |
turtle.begin_fill() | 准备开始填充图形 |
turtle.end_fill() | 填充完成; |
turtle.hideturtle() | 隐藏箭头显示; |
turtle.showturtle() | 与hideturtle()函数对应 |
(3) 全局控制命令
命令 | 说明 |
---|---|
turtle.clear() | 清空turtle窗口,但是turtle的位置和状态不会改变 |
turtle.reset() | 清空窗口,重置turtle状态为起始状态 |
turtle.undo() | 撤销上一个turtle动作 |
turtle.isvisible() | 返回当前turtle是否可见 |
stamp() | 复制当前图形 |
turtle.write(s[,font=("font-name",font_size,"font_type")]) | 写文本,s为文本内容,font是字体的参数,里面分别为字体名称,大小和类型;font为可选项, font的参数也是可选项 |
3. 命令详解
3.1 turtle.circle(radius, extent=None, steps=None)
描述: 以给定半径画圆
参数:
radius(半径); 半径为正(负),表示圆心在画笔的左边(右边)画圆
extent(弧度) (optional);
steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps)
举例:
circle(50) # 整圆;
circle(50,steps=3) # 三角形;
circle(120, 180) # 半圆
4. 绘图举例
4.1 太阳花

1 2 3 4 5 6 7 8 9 10 11 |
import turtle as t import time t.color("red", "yellow") t.speed(10) t.begin_fill() for _ in range(50): t.forward(200) t.left(170) end_fill() time.sleep(1) |
4.2 绘制小蟒蛇

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import turtle def drawSnake(rad, angle, len, neckrad): for _ in range(len): turtle.circle(rad, angle) turtle.circle(-rad, angle) turtle.circle(rad, angle/2) turtle.forward(rad/2) # 直线前进 turtle.circle(neckrad, 180) turtle.forward(rad/4) if __name__ == "__main__": turtle.setup(1500, 1400, 0, 0) turtle.pensize(30) # 画笔尺寸 turtle.pencolor("green") turtle.seth(-40) # 前进的方向 drawSnake(70, 80, 2, 15) |
4.3 绘制五角星

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import turtle import time turtle.pensize(5) turtle.pencolor("yellow") turtle.fillcolor("red") turtle.begin_fill() for _ in range(5): turtle.forward(200) turtle.right(144) turtle.end_fill() time.sleep(2) turtle.penup() turtle.goto(-150,-120) turtle.color("violet") turtle.write("Done", font=('Arial', 40, 'normal')) time.sleep(1) |
有了基础知识以后我们看下怎么画出多啦A梦
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 |
# !/usr/bin/env python3 from turtle import * # 无轨迹跳跃 def my_goto(x, y): penup() goto(x, y) pendown() # 眼睛 def eyes(): fillcolor("#ffffff") begin_fill() tracer(False) a = 2.5 for i in range(120): if 0 <= i < 30 or 60 <= i < 90: a -= 0.05 lt(3) fd(a) else: a += 0.05 lt(3) fd(a) tracer(True) end_fill() # 胡须 def beard(): my_goto(-32, 135) seth(165) fd(60) my_goto(-32, 125) seth(180) fd(60) my_goto(-32, 115) seth(193) fd(60) my_goto(37, 135) seth(15) fd(60) my_goto(37, 125) seth(0) fd(60) my_goto(37, 115) seth(-13) fd(60) # 嘴巴 def mouth(): my_goto(5, 148) seth(270) fd(100) seth(0) circle(120, 50) seth(230) circle(-120, 100) # 围巾 def scarf(): fillcolor('#e70010') begin_fill() seth(0) fd(200) circle(-5, 90) fd(10) circle(-5, 90) fd(207) circle(-5, 90) fd(10) circle(-5, 90) end_fill() # 鼻子 def nose(): my_goto(-10, 158) seth(315) fillcolor('#e70010') begin_fill() circle(20) end_fill() # 黑眼睛 def black_eyes(): seth(0) my_goto(-20, 195) fillcolor('#000000') begin_fill() circle(13) end_fill() pensize(6) my_goto(20, 205) seth(75) circle(-10, 150) pensize(3) my_goto(-17, 200) seth(0) fillcolor('#ffffff') begin_fill() circle(5) end_fill() my_goto(0, 0) # 脸 def face(): fd(183) lt(45) fillcolor('#ffffff') begin_fill() circle(120, 100) seth(180) # print(pos()) fd(121) pendown() seth(215) circle(120, 100) end_fill() my_goto(63.56, 218.24) seth(90) eyes() seth(180) penup() fd(60) pendown() seth(90) eyes() penup() seth(180) fd(64) # 头型 def head(): penup() circle(150, 40) pendown() fillcolor('#00a0de') begin_fill() circle(150, 280) end_fill() # 画哆啦A梦 def Doraemon(): # 头部 head() # 围脖 scarf() # 脸 face() # 红鼻子 nose() # 嘴巴 mouth() # 胡须 beard() # 身体 my_goto(0, 0) seth(0) penup() circle(150, 50) pendown() seth(30) fd(40) seth(70) circle(-30, 270) fillcolor('#00a0de') begin_fill() seth(230) fd(80) seth(90) circle(1000, 1) seth(-89) circle(-1000, 10) # print(pos()) seth(180) fd(70) seth(90) circle(30, 180) seth(180) fd(70) # print(pos()) seth(100) circle(-1000, 9) seth(-86) circle(1000, 2) seth(230) fd(40) # print(pos()) circle(-30, 230) seth(45) fd(81) seth(0) fd(203) circle(5, 90) fd(10) circle(5, 90) fd(7) seth(40) circle(150, 10) seth(30) fd(40) end_fill() # 左手 seth(70) fillcolor('#ffffff') begin_fill() circle(-30) end_fill() # 脚 my_goto(103.74, -182.59) seth(0) fillcolor('#ffffff') begin_fill() fd(15) circle(-15, 180) fd(90) circle(-15, 180) fd(10) end_fill() my_goto(-96.26, -182.59) seth(180) fillcolor('#ffffff') begin_fill() fd(15) circle(15, 180) fd(90) circle(15, 180) fd(10) end_fill() # 右手 my_goto(-133.97, -91.81) seth(50) fillcolor('#ffffff') begin_fill() circle(30) end_fill() # 口袋 my_goto(-103.42, 15.09) seth(0) fd(38) seth(230) begin_fill() circle(90, 260) end_fill() my_goto(5, -40) seth(0) fd(70) seth(-90) circle(-70, 180) seth(0) fd(70) # 铃铛 my_goto(-103.42, 15.09) fd(90) seth(70) fillcolor('#ffd200') # print(pos()) begin_fill() circle(-20) end_fill() seth(170) fillcolor('#ffd200') begin_fill() circle(-2, 180) seth(10) circle(-100, 22) circle(-2, 180) seth(180 - 10) circle(100, 22) end_fill() goto(-13.42, 15.09) seth(250) circle(20, 110) seth(90) fd(15) dot(10) my_goto(0, -150) # 画眼睛 black_eyes() if __name__ == '__main__': screensize(800, 600, "#f0f0f0") pensize(3) # 画笔宽度 speed(9) # 画笔速度 Doraemon() my_goto(100, -300) mainloop() |
看下效果

看看 小猪佩奇的实现方式:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 |
# -*- coding: utf-8 -*- """ @Time: 2018/9/5 @Author: songhao @微信公众号: zeropython @File: peiqi.py """ from turtle import * def nose(x, y): # 鼻子 pu() goto(x, y) pd() seth(-30) begin_fill() a = 0.4 for i in range(120): if 0 <= i < 30 or 60 <= i < 90: a = a + 0.08 lt(3) # 向左转3度 fd(a) # 向前走a的步长 else: a = a - 0.08 lt(3) fd(a) end_fill() pu() seth(90) fd(25) seth(0) fd(10) pd() pencolor(255, 155, 192) seth(10) begin_fill() circle(5) color(160, 82, 45) end_fill() pu() seth(0) fd(20) pd() pencolor(255, 155, 192) seth(10) begin_fill() circle(5) color(160, 82, 45) end_fill() def head(x, y): # 头 color((255, 155, 192), "pink") pu() goto(x, y) seth(0) pd() begin_fill() seth(180) circle(300, -30) circle(100, -60) circle(80, -100) circle(150, -20) circle(60, -95) seth(161) circle(-300, 15) pu() goto(-100, 100) pd() seth(-30) a = 0.4 for i in range(60): if 0 <= i < 30 or 60 <= i < 90: a = a + 0.08 lt(3) # 向左转3度 fd(a) # 向前走a的步长 else: a = a - 0.08 lt(3) fd(a) end_fill() def ears(x, y): # 耳朵 color((255, 155, 192), "pink") pu() goto(x, y) pd() begin_fill() seth(100) circle(-50, 50) circle(-10, 120) circle(-50, 54) end_fill() pu() seth(90) fd(-12) seth(0) fd(30) pd() begin_fill() seth(100) circle(-50, 50) circle(-10, 120) circle(-50, 56) end_fill() def eyes(x, y): # 眼睛 color((255, 155, 192), "white") pu() seth(90) fd(-20) seth(0) fd(-95) pd() begin_fill() circle(15) end_fill() color("black") pu() seth(90) fd(12) seth(0) fd(-3) pd() begin_fill() circle(3) end_fill() color((255, 155, 192), "white") pu() seth(90) fd(-25) seth(0) fd(40) pd() begin_fill() circle(15) end_fill() color("black") pu() seth(90) fd(12) seth(0) fd(-3) pd() begin_fill() circle(3) end_fill() def cheek(x, y): # 腮 color((255, 155, 192)) pu() goto(x, y) pd() seth(0) begin_fill() circle(30) end_fill() def mouth(x, y): # 嘴 color(239, 69, 19) pu() goto(x, y) pd() seth(-80) circle(30, 40) circle(40, 80) def body(x, y): # 身体 color("red", (255, 99, 71)) pu() goto(x, y) pd() begin_fill() seth(-130) circle(100, 10) circle(300, 30) seth(0) fd(230) seth(90) circle(300, 30) circle(100, 3) color((255, 155, 192), (255, 100, 100)) seth(-135) circle(-80, 63) circle(-150, 24) end_fill() def hands(x, y): # 手 color((255, 155, 192)) pu() goto(x, y) pd() seth(-160) circle(300, 15) pu() seth(90) fd(15) seth(0) fd(0) pd() seth(-10) circle(-20, 90) pu() seth(90) fd(30) seth(0) fd(237) pd() seth(-20) circle(-300, 15) pu() seth(90) fd(20) seth(0) fd(0) pd() seth(-170) circle(20, 90) def foot(x, y): # 脚 pensize(10) color((240, 128, 128)) pu() goto(x, y) pd() seth(-90) fd(40) seth(-180) color("black") pensize(15) fd(20) pensize(10) color((240, 128, 128)) pu() seth(90) fd(40) seth(0) fd(90) pd() seth(-90) fd(40) seth(-180) color("black") pensize(15) fd(20) def tail(x, y): # 尾巴 pensize(4) color((255, 155, 192)) pu() goto(x, y) pd() seth(0) circle(70, 20) circle(10, 330) circle(70, 30) def setting(): # 参数设置 pensize(4) hideturtle() colormode(255) color((255, 155, 192), "pink") setup(840, 500) speed(10) def main(): setting() # 画布、画笔设置 nose(-100, 100) # 鼻子 head(-69, 167) # 头 ears(0, 160) # 耳朵 eyes(0, 140) # 眼睛 cheek(80, 10) # 腮 mouth(-20, 30) # 嘴 body(-32, -8) # 身体 hands(-56, -45) # 手 foot(2, -177) # 脚 tail(148, -155) # 尾巴 done() # 结束 main() |
其实画图主要还是坐标和尺寸,比较繁琐,技术含量不是太高
本文参考 简书 伪君子_
10分钟轻松学会 Python turtle 绘图

