Turtle海龟库

易三一世2020-10-22 23:50:17

1 说明

======================

1.1 环境:python3.8,集成(内置)turtle库;华为笔记本电脑+deepin-linux操作系统。

1.2 turtle库入门级介绍:基本了解turtle库,python基础知识复习,讲解清楚,注释仔细,小白秒懂,逐步深入,适合仔细品读。

1.3 代码来自turtle demo和网络(自己整理和加工),仅供学习,如有侵权,请联系,定删。

Turtle海龟库:python3内置简单却很强大的绘图库

2 海龟画图初级

===========

2.1 基本窗口设置和图片显示

2.2 显示图片

Turtle海龟库:python3内置简单却很强大的绘图库

2.3 代码:

#自定义窗口大小,背景颜色
#窗口标题名,位置
import turtle as t

#方法一
#其实是通过设置画布大小来改变窗口大小
#t.screensize(800, 600, "green")
#screensize() #返回默认大小(400, 300)
#用screensize设置的是画布大小及背景色,窗体和画布不是一个概念
#会出现滚动条

#方法二
#屏幕的宽和高的百分百,默认位置屏幕的居中
#t.setup(width=0.6, height=0.6)
#指定窗口大小和位置,注意左上角坐标为0,0
t.setup(width=800, height=800, startx=100, starty=100)

#载入背景图片,是原图大小显示与窗口大小不是自适应
#t.bgpic('/home/xgj/Desktop/turtle/1.jpeg')   #bug,可以识别png图片,但是jpeg不行
#用截图工具,截图生产png,可以。
#网上说只能显示gif图片,其实还可以显示png图片
t.bgpic('/home/xgj/Desktop/turtle/2.png')   #请注意,还可以显示gif图片,但是gif图片是不动的

#窗口的标题名
#默认为Python Turtle Graphics
#t.title('good') #可自定义

#需要手动关闭
t.done()

3 太阳花

======

3.1 效果图

Turtle海龟库:python3内置简单却很强大的绘图库

3.2 代码:

#太阳花
import turtle as t

#turtle.color(color1, color2)
#同时设置pencolor=color1, fillcolor=color2
#默认第一画笔颜色,第二为填充颜色
t.color("red", "yellow")

#画笔速度
#画笔绘制的速度范围[0,10]整数,数字越大越快
t.speed(10)

#注意颜色填充fill需要begin和end之间
#类似一对括号
t.begin_fill()

#下划线表示 临时变量, 仅用一次,后面无需再用到
for _ in range(50):
  #向前走长度=distance
  t.forward(200)
  #向左转,逆时针转动角度=degree
  t.left(170)

t.end_fill()

t.done()


#补充:
#t.backward() #向后走长度
#t.right()   #向右转,顺时针转动角度

4 画圆和多边形

============

4.1 效果图

Turtle海龟库:python3内置简单却很强大的绘图库

4.2 代码

from turtle import * 

#turtle.circle(radius, extent=None, steps=None)
#extent为度数,默认360°,也就是一圈
#steps数值越大,圆的弧线越平滑,一般推荐50,不设置就是默认
#circle(100) #默认360°为一圈
circle(200,360,50) #圆

circle(200,360,3) #为三角形
circle(200,360,9) #为9边形

done()

4.3 同心圆代码

from turtle import *

#初始圆(最内部的圆)的半径
r=50
#同心圆间的距离
linew=30

circle(r)
# 修改画笔宽度
#pensize(5)
# for循环,用于绘制同心圆
for i in range(1,9):
  # 画笔抬起(不会在窗体上留下痕迹)
  penup()
  # 移动画笔到坐标(0,-10*i)
  #去某个坐标点
  goto(0,-linew*i)
  # 画笔落下(开始在窗体上留下痕迹)
  pendown()
  # 在循环中不断绘制半径不同的圆
  circle(r+i*linew)

done()

4.4 同心圆效果图

Turtle海龟库:python3内置简单却很强大的绘图库

4.5 移动的圆

==========

4.5.1 效果图

Turtle海龟库:python3内置简单却很强大的绘图库

4.5.2 代码

#移动的圆
from turtle import *

bgcolor('black')
#该函数学习
# 自定义坐标系统,并切换到 world 模式
setworldcoordinates(-100,-100, 150, 100)
speed(0)
pendown()
pencolor('green')
#画圆
circle(30,360,50)
for s in range(400):
  setworldcoordinates(-100,-100, 10+s*0.5, 100)

done()

5 高级一点

========

5.1 效果图

Turtle海龟库:python3内置简单却很强大的绘图库

5.2 代码

import turtle as t 

t.bgcolor("black")

sides=6 #6边

colors=["red","yellow","green","blue","orange","purple"]

#120为圈数,层数
for x in range(120):
  t.pencolor(colors[x%sides])
  t.forward(x*3/sides+x)
  t.left(360/sides+1)
  t.width(x*sides/200)

t.done()

5.3 输入文字的代码

import turtle as t 

#画布的背景颜色设置
t.bgcolor("black")

#textinput是调用tkinter的弹出框
#第一个字符串为弹出窗口的标题名
#第二个字符串为输入框上面的文字名
my_name=t.textinput("输入你的姓名","你的名字?")

colors=["red","yellow","purple","blue"]

#100为一百圈
for x in range(100):
  #画笔的颜色选择
  t.pencolor(colors[x%4])
  #提笔
  t.penup()
  #向前步长
  t.forward(x*4)
  #落笔
  t.pendown()
  #文字输出
  t.write(my_name,font=("Arial",int((x+4)/4),"bold"))
  #向左转动92°
  t.left(92)
   
#结束后手动关闭窗口
t.done()

5.4 效果图

Turtle海龟库:python3内置简单却很强大的绘图库

6 画树

====

6.1 图

Turtle海龟库:python3内置简单却很强大的绘图库

6.2 代码

#画树
#熟悉可能的缩写

from turtle import *
from random import *
from math import *

def tree(n, l):
  pd() # 下笔 pendown
  # 阴影效果
  t = cos(radians(heading() + 45)) / 8 + 0.25
  pencolor(t, t, t)
  pensize(n / 3)
  forward(l) # 画树枝,fd=forward


  if n > 0:
      b = random() * 15 + 10 # 右分支偏转角度
      c = random() * 15 + 10 # 左分支偏转角度
      d = l * (random() * 0.25 + 0.7) # 下一个分支的长度
      # 右转一定角度,画右分支
      right(b)
      tree(n - 1, d)
      # 左转一定角度,画左分支
      left(b + c)
      tree(n - 1, d)

      # 转回来
      right(c)
  else:
      # 画叶子
      right(90)
      n = cos(radians(heading() - 45)) / 4 + 0.5
      pencolor(n, n*0.8, n*0.8)
      circle(3)
      left(90)

      # 添加0.3倍的飘落叶子
      if(random() > 0.7):
          pu()
          # 飘落
          t = heading()
          an = -40 + random()*40
          setheading(an)
          dis = int(800*random()*0.5 + 400*random()*0.3 + 200*random()*0.2)
          forward(dis)
          setheading(t)


          # 画叶子
          pd() #pendown
          right(90)
          n = cos(radians(heading() - 45)) / 4 + 0.5
          pencolor(n*0.5+0.5, 0.4+n*0.4, 0.4+n*0.4)
          circle(2)
          left(90)
          pu() #penup

          #返回
          t = heading()
          setheading(an)
          backward(dis)
          setheading(t)

  pu() #penup=提笔
  backward(l)# 退回

#bgcolor(0.5, 0.5, 0.5) # 背景色
bgcolor('black')
ht() # 隐藏turtle=hideturtle
speed(0) # 速度,1-10渐进,0最快
tracer(0, 0)
pu() # 抬笔
backward(100)
left(90) # 左转90度
pu() # 抬笔
backward(300) # 后退300
tree(12, 100) # 递归7层
done()

7 高级互动性

==========

7.1 效果图

Turtle海龟库:python3内置简单却很强大的绘图库

7.2 代码

from turtle import Screen,Turtle,mainloop

class ColorTurtle(Turtle):  
  #类的初始化定义
  def __init__(self,x,y):        
      Turtle.__init__(self)        
      self.shape("turtle")        
      self.resizemode("usre")        
      self.shapesize(3,3,0)        
      self.pensize(10)    
      self._color=[0,0,0]        
      self.x=x        
      self._color[x]=y        
      self.color(self._color)        
      self.speed(0)        
      self.left(90)        
      self.up()        
      self.goto(x,0)        
      self.down()        
      self.sety(1)        
      self.up()        
      self.sety(y)        
      self.pencolor("black")        
      self.ondrag(self.shift)

  #类的函数定义
  def shift(self,x,y):
      self.sety(max(0,min(y,1)))
      self._color[self.x]=self.ycor()
      self.fillcolor(self._color)
      setbgcolor()

#独立的函数定义
def setbgcolor():
  screen.bgcolor(red.ycor(),green.ycor(),blue.ycor())
   
#主函数定义
def main():
  global screen,red,green,blue
  screen=Screen()
  screen.delay(0)
  screen.setworldcoordinates(-1,-0.3,3,1.3)
   
  red=ColorTurtle(0,.7)
  green=ColorTurtle(1,.3)
  blue=ColorTurtle(2,.6)
  setbgcolor()


if __name__=="__main__":
  main()
  mainloop()

cnliutz

计算机基础教师

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注