当前位置:   article > 正文

Python——turtle(海龟绘图)小猪佩奇^(* ̄(oo) ̄)^,哆啦A梦o(=•ェ•=)m <小北安装的Anaconda3,使用的是Jupyter Notebook>_海龟画图

海龟画图

基本功能介绍

在海龟作图中,我们可以编写指令让一个虚拟的(想象中的)海龟在屏幕上来回移动。这个海龟带着一只钢笔,我们可以让海龟无论移动到哪都使用这只钢笔来绘制线条。通过编写代码,以各种很酷的模式移动海龟,我们可以绘制出令人惊奇的图片。使用海龟作图,我们不仅能够只用几行代码就创建出令人印象深刻的视觉效果,而且还可以跟随海龟看看每行代码如何影响到它的移动。这能够帮助我们理解代码的逻辑。所以海龟作图也常被用作新手学习 Python 的一种方式。

1 基础介绍
1.1 海龟绘图

“小海龟”turtle是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。
海龟绘图(Turtle Graphics)是python2.6版本中后引入的一个简单的绘图工具,出现在1966年的Logo计算机语言。
海龟绘图(turtle库)是python的内部模块,使用前导入即可 import turtle
海龟有3个关键属性:方向、位置和画笔(笔的属性有色彩、宽度和开/关状态)

1.2 Pycharm 安装和配置

小北安装的Anaconda3,使用的是Jupyter Notebook,建议友友们安装社区版,完全免费。

1.3 基本元素介绍
1.3.1 画布(canvas)

画布就是turtle为我们展开用于绘图区域, 我们可以设置它的大小和初始位置(None,自己设置数值)

  • 设置画布的大小:
turtle.screensize(canvwidth=None,canvheight=None,bg=None)
  • 参数分别代表画布的宽、高(单位像素)和背景颜色:
    1. turtle.screensize(800,600,"green")
    2. turtle.screensize() #默认返回(400,300,"white"

  • 另一种设置画布大小的方式:
turtle.setup(width=0.5,height=0.75,startx=None,starty=None)

参数:
width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例
(startx, starty): 这一坐标表示 矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心
eg:

  1. turtle.setup(width=800,height=0.8)
  2. turtle.setup(width=800,height=600,startx=100,starty=200)

效果是一样的

1.3.2 画笔(Pen)

使用 turtle.Pen() 来创建画笔对象

  1. import turtle
  2. turtle.Pen()
  3. turtle.mainloop()#画面保持

代码执行后就建立了画布,同时屏幕中间可以看见箭头(arrow),即所谓的海龟
在海龟绘图中,海龟的起点即画布中央为 (0,0),移动单位是像素 (pixel)
描述海龟时使用了两个词语:坐标原点(位置),面朝x轴正方向(方向), turtle绘图中, 就是使用位置方向描述海龟(画笔)的状态。

1.3.3 绘图命令

绘图命令主要分为三种:

  • 画笔运动命令
  • 画笔控制命令
  • 全局控制命令

操纵海龟绘图有着许多的命令,这些命令可以划分为3种:一种为运动命令,一种为画笔控制命令,还有一种是全局控制命令。

(1)画笔运动命令:

(2)画笔控制命令:

(3) 全局控制命令:

部分命令解释和补充:

  1. turtle.circle(radius,extent=None,steps=None)#radius=半径,正负有别,extent代表弧度,steps内切正多边形的边数
  2. turtle.setheading(angle)#转变方向,angle指绝对角度,只改变方向不行进
  3. turtle.done() #停止画笔绘制,但是不关闭窗口

2 绘图举例

在实践中学习!(“时间是检验真理的唯一标准”)

2.1 绘制正方形

  1. import turtle
  2. turtle.setup(800, 400) #调整画板大小
  3. turtle.up() #提起笔
  4. turtle.goto(-50, 50) #调整画板起始点
  5. turtle.down() #放下笔
  6. turtle.color("red") #画笔颜色
  7. turtle.speed(1) #控制绘画速度
  8. # 画图过程
  9. turtle.forward(100)
  10. turtle.right(90)
  11. turtle.forward(100)
  12. turtle.right(90)
  13. turtle.forward(100)
  14. turtle.right(90)
  15. turtle.forward(100)
  16. # 保持画面
  17. turtle.mainloop()

2.2 绘制太阳花

  1. import turtle as t
  2. import time
  3. t.color("red", "yellow")
  4. t.speed(10)
  5. t.begin_fill()
  6. for _ in range(25):
  7. t.forward(200)
  8. t.left(165)
  9. t.end_fill()
  10. time.sleep(5)

2.3 递归绘制树

  1. import turtle
  2. from turtle import *
  3. # 相比于 import turtle as * 这样的区别
  4. # 绘制过程使用递归算法,后续解释
  5. def tree(branchLen, t):
  6. if branchLen > 5:
  7. t.forward(branchLen)
  8. t.right(20)
  9. tree(branchLen - 15, t)
  10. t.left(40)
  11. tree(branchLen - 10, t)
  12. t.right(20)
  13. t.backward(branchLen)
  14. t = Turtle()
  15. myWin = t.getscreen() # 获取屏幕
  16. t.speed(0)
  17. t.hideturtle() # 隐藏箭头
  18. t.left(90) # 掉转绘制方向朝上
  19. t.up() # 画笔离开
  20. t.backward(300) # 将画笔移动到屏幕下方
  21. t.down() # 画笔落下
  22. t.color("green") #调整画笔颜色
  23. tree(110, t) #调用绘制函数
  24. myWin.exitonclick() # 点击关闭屏幕

这种递归方法总体难度还是比较大,大家可以通过Debug的方法来初步进行,了解递归的运行方式。

2.4 绘制旋转多边形

  1. import turtle
  2. import turtle as t
  3. a = 200
  4. t.speed(0)
  5. t.color("green")
  6. for x in range(1, 37):
  7. t.forward(a)
  8. t.left(90)
  9. t.forward(a)
  10. t.left(90)
  11. t.forward(a)
  12. t.left(90)
  13. t.forward(a)
  14. t.left(100)
  15. t.mainloop()

2.5 绘制彩色多边形

  1. import turtle
  2. t = turtle.Pen()
  3. t.pensize(5)
  4. colorValue = 1
  5. colorStep = colorValue / 36
  6. t.speed(0)
  7. for x in range(1, 37):
  8. colorValue -= colorStep
  9. t.color(0.5, 1, colorValue)
  10. t.forward(200)
  11. t.left(90)
  12. t.forward(200)
  13. t.left(90)
  14. t.forward(200)
  15. t.left(90)
  16. t.forward(200)
  17. t.left(100)
  18. turtle.mainloop()

2.6 绘制一个五角星

  1. import turtle
  2. t=turtle.Pen()
  3. t.hideturtle()
  4. t.pensize(5) #画笔粗细
  5. t.up()
  6. t.goto(-100,50)#画笔移动到画布较为中心的位置
  7. t.down()
  8. for i in range(1,6):
  9. t.forward(200)
  10. t.right(144)
  11. turtle.done() #类似Mainloop,一个循环函数,保证画布持续存在

2.7 迭代绘制五角星

  1. import turtle
  2. from turtle import *
  3. pen()
  4. pencolor("red")
  5. speed(0)
  6. for i in range(20):
  7. forward(i*20)
  8. right(144)
  9. done()

2.8 绘制彩色五角星+说明字符

  1. import turtle
  2. from turtle import *
  3. pensize(5)
  4. color("yellow", "red")
  5. begin_fill() # 准备填充
  6. for i in range(5):
  7. forward(200)
  8. right(144)
  9. end_fill() # 填充完毕
  10. up()
  11. goto(-200, -100) # 将海龟移动到此位置
  12. pencolor("violet") # 颜色选用紫罗兰
  13. write("WQ", False, "left", font=('Arial', 40, 'normal')) # 在当前位置输入字符“WQ”,光标回到左下角,font中三项分别指定字型、字号和形式
  14. done()

2.9 绘制小蛇

命令详解
turtle.circle(radius, extent=None, steps=None)
描述: 以给定半径画圆
参数:
radius(半径); 半径为正(负),表示圆心在画笔的左边(右边)画圆
extent(弧度) (optional);
steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps)
举例:
circle(50) # 整圆;
circle(50,steps=3) # 三角形;
circle(120, 180) # 半圆

  1. #PythonDraw.py
  2. import turtle #海龟库是turtle绘图的pyhon实现
  3. turtle.setup(650,350,200,200)#turtle.setup(with,height,startx,starty) 设置窗体的大小及位置
  4. turtle.penup()
  5. turtle.fd(-250)
  6. turtle.pendown()
  7. turtle.pensize(25)
  8. turtle.pencolor("purple")
  9. turtle.seth(-40)
  10. for i in range(4):
  11. turtle.circle(40,80)
  12. turtle.circle(-40,80)
  13. turtle.circle(40,80/2)
  14. turtle.fd(40)
  15. turtle.circle(16,180)
  16. turtle.fd(40*2/3)
  17. turtle.done()
  18. '''
  19. turtle.goto(x,y) 海龟从摸个位置去到达(x,y)的坐标位置
  20. turtle.fd(d) 向海龟的正前方向运行
  21. turtle.bk(d) 向海龟的反方向运行
  22. turtle.circle(r,angle) 以海龟的当前位置,左侧的某一个点为圆心,进行曲线运行
  23. turtle.seth(angle) 改变海龟的行径角度,只是改变行径的方向(绝对角度)
  24. turtle.left(angle) 当前的海龟向左或者向右改变运行的方向
  25. turtle.right(angle)
  26. turtle.colormode(mode) 颜色模块
  27. -1.0: RGB小数值模块
  28. -255:RGB整数值模块
  29. import <库名>
  30. <库名>.<函数>(<函数参数>)
  31. from <库名> import <函数名>
  32. from <库名> import*
  33. <函数名>(<函数参数>)
  34. import <库名> as <库别名>
  35. <库别名>.<函数> (<函数参数>)
  36. turtle.penup() 抬起画笔,海龟在飞行 别名 turtle.pu()
  37. turtle.pendown() 画笔落下,海龟爬行 turtle.pd()
  38. turtle.pensize(width) 画笔宽度,海龟的腰围 turtle.width(width)
  39. turtle.pencolot(colot) color为颜色字符串或r,g,b值
  40. for <变量> in range (<函数名>)
  41. <被循环执行的语句>
  42. -<变量>表示每次循环的计数,0到<次数>1
  43. range()函数
  44. -range(N)
  45. 产生0到N-1的整数序列,共N个
  46. -range(M,N)
  47. 产生M到N-1的整数序列,共N-M个
  48. '''

2.10 绘制科赫曲线和科赫雪花

  • 科赫曲线
    1. import turtle
    2. def koch(size, n):
    3. if n == 0:
    4. turtle.fd(size)
    5. else:
    6. for angle in [0, 60, -120, 60]:
    7. turtle.left(angle)
    8. koch(size / 3, n - 1)
    9. def main():
    10. turtle.setup(800, 400)
    11. turtle.up()
    12. turtle.goto(-300, -50)
    13. turtle.down()
    14. turtle.pensize(2)
    15. koch(600, 3)
    16. turtle.hideturtle()
    17. turtle.done()
    18. main()

  • 科赫雪花

科赫雪花相当于画了三次科赫曲线

  1. #绘制科赫雪花
  2. import turtle
  3. def koch(size,n):
  4. if n == 0:
  5. turtle.fd(size)
  6. else:
  7. for angle in [0,60,-120,60]:
  8. turtle.left(angle)
  9. koch(size/3,n-1)
  10. def main():
  11. turtle.setup(600,600)
  12. turtle.penup()
  13. turtle.goto(-200,100)
  14. turtle.pendown()
  15. turtle.pensize(2)
  16. level = 3 #3阶科赫雪花,阶数
  17. koch(400,level)
  18. turtle.right(120)
  19. koch(400,level)
  20. turtle.right(120)
  21. koch(400,level)
  22. turtle.hideturtle()
  23. turtle.done()
  24. main()

综上:

在本篇博客中,小北尝试使用海龟绘图模块(类)绘制一些基础图形,学习了一些Python编程的基础知识,当然还有很多都没涉及到,友友们可以自行学习,蟹蟹~

最后:(文章大标题的两个实例)

一、绘制小猪佩奇

  1. import turtle as t
  2. # 绘制小猪佩奇
  3. # =======================================
  4. t.pensize(4)
  5. t.hideturtle()
  6. t.colormode(255)
  7. t.color((255, 155, 192), "pink")
  8. t.setup(840, 500)
  9. t.speed(10)
  10. # 鼻子
  11. t.pu()
  12. t.goto(-100,100)
  13. t.pd()
  14. t.seth(-30)
  15. t.begin_fill()
  16. a = 0.4
  17. for i in range(120):
  18. if 0 <= i < 30 or 60 <= i < 90:
  19. a = a+0.08
  20. t.lt(3) # 向左转3
  21. t.fd(a) # 向前走a的步长
  22. else:
  23. a = a-0.08
  24. t.lt(3)
  25. t.fd(a)
  26. t.end_fill()
  27. t.pu()
  28. t.seth(90)
  29. t.fd(25)
  30. t.seth(0)
  31. t.fd(10)
  32. t.pd()
  33. t.pencolor(255, 155, 192)
  34. t.seth(10)
  35. t.begin_fill()
  36. t.circle(5)
  37. t.color(160, 82, 45)
  38. t.end_fill()
  39. t.pu()
  40. t.seth(0)
  41. t.fd(20)
  42. t.pd()
  43. t.pencolor(255, 155, 192)
  44. t.seth(10)
  45. t.begin_fill()
  46. t.circle(5)
  47. t.color(160, 82, 45)
  48. t.end_fill()
  49. # 头
  50. t.color((255, 155, 192), "pink")
  51. t.pu()
  52. t.seth(90)
  53. t.fd(41)
  54. t.seth(0)
  55. t.fd(0)
  56. t.pd()
  57. t.begin_fill()
  58. t.seth(180)
  59. t.circle(300, -30)
  60. t.circle(100, -60)
  61. t.circle(80, -100)
  62. t.circle(150, -20)
  63. t.circle(60, -95)
  64. t.seth(161)
  65. t.circle(-300, 15)
  66. t.pu()
  67. t.goto(-100, 100)
  68. t.pd()
  69. t.seth(-30)
  70. a = 0.4
  71. for i in range(60):
  72. if 0 <= i < 30 or 60 <= i <90:
  73. a = a+0.08
  74. t.lt(3) # 向左转3
  75. t.fd(a) # 向前走a的步长
  76. else:
  77. a = a-0.08
  78. t.lt(3)
  79. t.fd(a)
  80. t.end_fill()
  81. # 耳朵
  82. t.color((255, 155, 192), "pink")
  83. t.pu()
  84. t.seth(90)
  85. t.fd(-7)
  86. t.seth(0)
  87. t.fd(70)
  88. t.pd()
  89. t.begin_fill()
  90. t.seth(100)
  91. t.circle(-50, 50)
  92. t.circle(-10, 120)
  93. t.circle(-50, 54)
  94. t.end_fill()
  95. t.pu()
  96. t.seth(90)
  97. t.fd(-12)
  98. t.seth(0)
  99. t.fd(30)
  100. t.pd()
  101. t.begin_fill()
  102. t.seth(100)
  103. t.circle(-50, 50)
  104. t.circle(-10, 120)
  105. t.circle(-50, 56)
  106. t.end_fill()
  107. #眼睛
  108. t.color((255, 155, 192), "white")
  109. t.pu()
  110. t.seth(90)
  111. t.fd(-20)
  112. t.seth(0)
  113. t.fd(-95)
  114. t.pd()
  115. t.begin_fill()
  116. t.circle(15)
  117. t.end_fill()
  118. t.color("black")
  119. t.pu()
  120. t.seth(90)
  121. t.fd(12)
  122. t.seth(0)
  123. t.fd(-3)
  124. t.pd()
  125. t.begin_fill()
  126. t.circle(3)
  127. t.end_fill()
  128. t.color((255, 155, 192), "white")
  129. t.pu()
  130. t.seth(90)
  131. t.fd(-25)
  132. t.seth(0)
  133. t.fd(40)
  134. t.pd()
  135. t.begin_fill()
  136. t.circle(15)
  137. t.end_fill()
  138. t.color("black")
  139. t.pu()
  140. t.seth(90)
  141. t.fd(12)
  142. t.seth(0)
  143. t.fd(-3)
  144. t.pd()
  145. t.begin_fill()
  146. t.circle(3)
  147. t.end_fill()
  148. # 腮
  149. t.color((255, 155, 192))
  150. t.pu()
  151. t.seth(90)
  152. t.fd(-95)
  153. t.seth(0)
  154. t.fd(65)
  155. t.pd()
  156. t.begin_fill()
  157. t.circle(30)
  158. t.end_fill()
  159. # 嘴
  160. t.color(239, 69, 19)
  161. t.pu()
  162. t.seth(90)
  163. t.fd(15)
  164. t.seth(0)
  165. t.fd(-100)
  166. t.pd()
  167. t.seth(-80)
  168. t.circle(30, 40)
  169. t.circle(40, 80)
  170. # 身体
  171. t.color("red", (255, 99, 71))
  172. t.pu()
  173. t.seth(90)
  174. t.fd(-20)
  175. t.seth(0)
  176. t.fd(-78)
  177. t.pd()
  178. t.begin_fill()
  179. t.seth(-130)
  180. t.circle(100,10)
  181. t.circle(300,30)
  182. t.seth(0)
  183. t.fd(230)
  184. t.seth(90)
  185. t.circle(300,30)
  186. t.circle(100,3)
  187. t.color((255,155,192),(255,100,100))
  188. t.seth(-135)
  189. t.circle(-80,63)
  190. t.circle(-150,24)
  191. t.end_fill()
  192. # 手
  193. t.color((255,155,192))
  194. t.pu()
  195. t.seth(90)
  196. t.fd(-40)
  197. t.seth(0)
  198. t.fd(-27)
  199. t.pd()
  200. t.seth(-160)
  201. t.circle(300,15)
  202. t.pu()
  203. t.seth(90)
  204. t.fd(15)
  205. t.seth(0)
  206. t.fd(0)
  207. t.pd()
  208. t.seth(-10)
  209. t.circle(-20,90)
  210. t.pu()
  211. t.seth(90)
  212. t.fd(30)
  213. t.seth(0)
  214. t.fd(237)
  215. t.pd()
  216. t.seth(-20)
  217. t.circle(-300,15)
  218. t.pu()
  219. t.seth(90)
  220. t.fd(20)
  221. t.seth(0)
  222. t.fd(0)
  223. t.pd()
  224. t.seth(-170)
  225. t.circle(20,90)
  226. # 脚
  227. t.pensize(10)
  228. t.color((240,128,128))
  229. t.pu()
  230. t.seth(90)
  231. t.fd(-75)
  232. t.seth(0)
  233. t.fd(-180)
  234. t.pd()
  235. t.seth(-90)
  236. t.fd(40)
  237. t.seth(-180)
  238. t.color("black")
  239. t.pensize(15)
  240. t.fd(20)
  241. t.pensize(10)
  242. t.color((240, 128, 128))
  243. t.pu()
  244. t.seth(90)
  245. t.fd(40)
  246. t.seth(0)
  247. t.fd(90)
  248. t.pd()
  249. t.seth(-90)
  250. t.fd(40)
  251. t.seth(-180)
  252. t.color("black")
  253. t.pensize(15)
  254. t.fd(20)
  255. # 尾巴
  256. t.pensize(4)
  257. t.color((255, 155, 192))
  258. t.pu()
  259. t.seth(90)
  260. t.fd(70)
  261. t.seth(0)
  262. t.fd(95)
  263. t.pd()
  264. t.seth(0)
  265. t.circle(70, 20)
  266. t.circle(10, 330)
  267. t.circle(70, 30)
  268. t.done()
图片展示:
视频展示:

Python——turtle(海龟绘图)小猪佩奇

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/845733
推荐阅读
相关标签