一、排雷避坑
1. no attribute ‘pensize’
① 文件命名避免使用库/模块的名字为名,会报错。
例如:当使用matplotlib库时,将文件名命名为matplotlib.py,会报错
ModuleNotFoundError: No module named ‘matplotlib.pyplot’; ‘matplotlib’ is not a package
使用turtle库时,文件名命名为turtle.py,会报错
AttributeError: module ‘turtle’ has no attribute ‘pensize’
因为文件的名字命名为turtle了,导入turtle的时候 其实导入的是自己。
2. Cannot find reference
② File → Settings → Editor → Inspections → python → 取消勾选 ☐Unresolved references → OK (不操作也不影响运行结果,只是不太好看🤭🤭)
Cannot find reference ‘forward’ in ‘turtle.py’ less… (Ctrl+F1)
Inspection info: This inspection detects names that should resolve but don’t. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-level and class-level items are supported better than instance items.
3. no attribute ‘screen’
③ AttributeError: module ‘turtle’ has no attribute ‘screen’
错误的代码:
import time
import turtle as t
t.screen.title('test')
t.screen.bgcolor('yellow')
t.done()
AttributeError: module ‘turtle’ has no attribute ‘screen’
正常运行的代码:
import time
import turtle
t = turtle.Pen() # 创建一个 Pen 对象
t.screen.title('test') # 通过 Pen 对象访问 screen 属性
t.screen.bgcolor('yellow') # 通过 Pen 对象访问 screen 属性
turtle.done()
原因分析:
第一段代码中将整个 turtle 模块重命名为 t。但是,turtle 模块并没有直接公开 screen 属性,因此试图直接使用 t.screen 会导致错误。
在第二段代码中,首先导入了 turtle 模块,然后创建了一个 Pen 对象 t。Pen 对象有一个 screen 属性,这样就可以通过 t.screen 来访问 screen。
解决方法:
想使用 t 作为别名,并且想要访问 screen,可以使用 t.Screen() 来创建一个屏幕对象,然后就可以直接使用这个对象来设置标题和背景颜色。这样就避免了直接通过 t 模块访问 screen 的问题:
import time
import turtle as t
screen = t.Screen() # 创建一个屏幕对象
screen.title('test')
screen.bgcolor('yellow')
t.done()
二、基本语法
属性 { 方向 位置 画笔 属性\begin{cases} 方向\\ 位置\\ 画笔\\ \end{cases} 属性⎩ ⎨ ⎧方向位置画笔
三、简单绘图
1. 方形
方法一:线段×4
import turtle as t
# 绘制线段 重复×4
t.forward(100) # 前移100, 左到右
t.left(90) # 左转90°(逆时针), 下到上
t.forward(100)
t.left(90)
t.forward(100)
t.left(90)
t.forward(100)
t.left(90)
t.done() #加了这句,画完之后窗口就不会关闭了
方法二:circle(r,360,steps=4)
import turtle as t
t.rt(45) # 右转45°(顺时针)
t.circle(100,360,steps=4) # 绘制边长为100的四边形
t.done() #加了这句,画完之后窗口就不会关闭了
import turtle
t=turtle.Pen() # 另一种写法
t.rt(45) # 右转45°(顺时针)
t.circle(100,360,steps=4) # 绘制边长为100的四边形
turtle.done() # t=turtle.Pen() - turtle.done()
2. 星形
五角星/五芒星 内角和为180°,五个角,所以一个角180°/5=36°,等价于绘制时一条线段到另一条线段交界处要旋转角度180°-36°=144°
import turtle as t
# 画一个五角星 180-144=36 36*5=180
for x in range(1,6):
t.forward(100)
t.left(144)
t.done()
类似地,绘制turtle star
n角星(n为奇数且n≥3,n=3 三角形) 内角和180° | 每个角=180°/n | 画笔旋转角度180°-180°/n
import turtle as t
# 画一个turtle star n角星
n = 17 # n为奇数 (偶数不适用, 若偶数可能需重新起笔)
for x in range(1,1+n):
t.forward(100)
t.left(180-180/n)
t.done()
画笔旋转角度angle:
a
n
g
l
e
=
180
−
内角
=
180
−
内角和
n
=
{
180
×
(
n
−
1
)
n
(
n
为奇数
)
180
×
(
n
−
2
)
n
(
n
为偶数
)
angle=180-内角=180-\frac{内角和}{n}=\begin{cases} \frac{180×(n-1)}{n} (n为奇数)\\ \frac{180×(n-2)}{n}(n为偶数)\\ \end{cases}
angle=180−内角=180−n内角和={n180×(n−1)(n为奇数)n180×(n−2)(n为偶数)
另一种星星 ——————
胖星星
import turtle as t
for x in range(5):
t.forward(50)
t.left(36)
t.forward(50)
t.right(108)
t.hideturtle() # 隐藏海龟
t.done()
import turtle as t
for x in range(5):
t.forward(50) # 边长50
t.left(72) # (180-36)/2=72
t.forward(50)
t.right(144) # 180-36=144
t.hideturtle() # 隐藏海龟
t.done()
import turtle as t
# 画一个六角星
for x in range(6):
t.forward(50) # 画出边
t.left(60) # 每个角度是60度
t.forward(50) # 画出边
t.right(120) # 转向120度
t.hideturtle()
t.done()
另一种 ————
import turtle as t
n=7
for x in range(n):
t.forward(100) # 画出边
t.left((180-180/n)/2) # 每个角度是51.43度
t.forward(100) # 画出边
t.right((180-180/n)*3/2) # 转向128.57度
t.hideturtle() # 隐藏海龟
t.done()
import turtle as t
n=9 # n为奇数
for x in range(n):
t.forward(100) # 画出边
t.left((180-180/n)/2)
t.forward(100) # 画出边
t.right((180-180/n)*3/2)
t.hideturtle() # 隐藏海龟
t.done()
import turtle as t
angle = 120
while True:
t.forward(50)
t.left(angle)
if abs(t.pos()) < 1:
break
t.ht()
t.done()
from turtle import *
color('red', 'yellow')
begin_fill()
while True:
forward(100)
left(170) # n=36
if abs(pos()) < 1:
break
end_fill()
ht()
done()
3. 圆形
circle()
import turtle as t
t.circle(50) # 绘制圆形
t.circle(-50) # 绘制圆形
t.up() # 起笔
t.forward(100)
t.down() # 落笔
t.circle(50) # 绘制圆形
t.circle(-50) # 绘制圆形
t.hideturtle()
t.done()
---- 改变参数steps绘制多边形
"""
画圆 cicrle(r,extend,steps=None)
画三角形 circle(r,extend,steps=3)
画四边形 circle(r,extend,steps=4)
画n边形 circle(r,extend,steps=n) n为正整数
"""
import turtle as t
t.circle(50, steps=3) # 绘制三角形
t.circle(-50, steps=5) # 绘制正五边形
t.up() # 起笔
t.forward(100)
t.down() # 落笔
t.circle(50, steps=4) # 绘制正方形
t.circle(-50, steps=8) # 绘制正八边形
t.hideturtle()
t.done()
---- 改变参数extend绘制弧形
import turtle as t
t.circle(50, 180)
t.hideturtle()
t.done()
import turtle as t
step=5 # 每次增加距离
for r in range(10, 90, step):
t.circle(r,90+r*2) # 绘制圆
t.penup() # 起笔
t.home() # 回到原点
t.pendown() # 落笔
t.hideturtle()
t.done()
------- 画同心圆
import turtle as t
step=10 # 每次增加距离
for r in range(10,50,step):
t.circle(r) # 绘圆
t.up() # 起笔
t.right(90) # 顺时针90°, 方向由原先的向右转为向下
t.forward(step) # 移动海龟位置起绘点
t.right(270) # 方向向右
t.down() # 将笔放下准备绘制
t.hideturtle()
t.done()
import turtle as t
step = 10 # 每次增加距离
colors = ['red','orange','yellow','green','cyan','blue','purple']
twidth = 0 # 初始宽度
for r in range(1,8):
t.color(colors[r%7-1])
twidth+=0.5 # 宽度
t.width(twidth)
t.circle(r*step) # 绘圆
t.up() # 起笔
t.right(90)
t.forward(step)
t.right(270)
t.down() # 落笔
t.hideturtle()
t.done()
angle=60 | angle=30 |
---|---|
|
|
import turtle as t
t.color('pink')
twidth = 0 # 初始宽度
angle = 30 # 旋转角度
for angle in range(0,360,angle):
t.seth(angle) # 调整海龟的方向 setheading()
t.circle(25)
t.hideturtle()
t.done()
----填充色 每隔3s时间更改填充区间颜色,达到颜色区间动画设计(红绿灯😄)。
import time
import turtle as t
colors=['red','yellow','green']
t.speed(10)
for i in range(0,30):
t.color('white',colors[i%3])
t.begin_fill()
t.circle(50)
t.end_fill()
time.sleep(3)
t.ht()
t.done()
4. 心形
from turtle import *
color("red")
begin_fill()
left(45)
forward(100)
circle(50,180)
right(90)
circle(50,180)
forward(100)
end_fill()
hideturtle()
done()
5. 螺旋
方形螺旋
import turtle as t
for x in range(1,100):
t.forward(x) # 海龟向前绘线移动x
t.right(90) # 海龟方向向右转90°
t.hideturtle()
t.done()
import turtle as t
for x in range(1,100):
t.forward(x) # 海龟向前绘线移动x
t.right(91) # 海龟方向向右转91°
t.hideturtle()
t.done()
import turtle as t
for x in range(1,37):
t.forward(50) # 海龟向前绘线移动100
t.left(90) # 海龟方向向左转90°
t.forward(50)
t.left(90)
t.forward(50)
t.left(90)
t.forward(50)
t.left(100)
t.hideturtle()
t.done()
或者
import turtle as t
for _ in range(36):
for _ in range(4):
t.forward(50) # 向前绘线移动50
t.left(90) # 方向向左转90°
t.left(10) # 转动10°以绘制下一个正方形
t.hideturtle()
t.done()
上色
import turtle as t
for i in range(36):
for _ in range(4):
t.color(0.5, 1, i/36) # 色彩调整
t.forward(50) # 向前绘线移动50
t.left(90) # 方向向左转90°
t.left(10) # 转动10°以绘制下一个正方形
t.hideturtle()
t.done()
四、窗口设置
import time
import turtle as t
screen = t.Screen() # 创建一个屏幕
screen.title('test') # 标题
#screen.bgcolor('yellow') # 背景色
screen.bgpic('q.gif')
print("窗口width=", screen.window_width())# 获取窗口宽度 窗口width= 768
print("窗口height=", screen.window_height())# 获取窗口高度 窗口height= 648
time.sleep(3)
screen.setup(600,480) # 重设窗口大小
print("窗口width=", screen.window_width())# 获取窗口宽度 窗口width= 600
print("窗口height=", screen.window_height())# 获取窗口高度 窗口height= 480
t.left(45)
t.forward(50)
print(t.pos()) # (35.36,35.36)
screen.setworldcoordinates(0,0,100,100) # 重设世界坐标 (左上, 右下)
print(t.pos()) # (0.00,0.00)
t.left(45)
t.forward(50)
print(t.pos()) #(35.36,35.36)
t.write('测试test',align="center",font=('segeo script',24)) # 绘制文字
t.done()
五、海龟显隐
|
|
|
---|---|---|
t.clearstamps() | clearstamps(1) | clearstamps(-1) |
import turtle as t
t.color('green')
t.shape('turtle') # 显示海龟形状
for angle in range(0,361,60):
t.forward(50)
t.stamp() # 海龟章
t.home() # 回到原点
t.seth(angle)
#t.clearstamps(None) # 清除海龟章
t.clearstamps(-1) # 清除倒数第一只海龟
#t.clearstamps(1) # 清除第一只海龟
#t.clearstamps() # 清除所有海龟
#t.clearstamps(None) # 清除所有海龟
t.ht() # 隐藏海龟 hideturtle
#t.st() # 显示海龟 showturtle
t.done()
使用了ht(),那么isvisible()为False,否则为True
clearstamps()或者clearstamps(None)清除所有海龟,除了作为shape的那一只
import time
import turtle as t
t.color('green')
t.shape('turtle')
firstStamp=t.stamp() # 盖章第1只海龟
t.forward(100)
secondStamp=t.stamp() # 盖章第2只海龟
t.forward(100)
thirdStamp=t.stamp() # 盖章第3只海龟
time.sleep(3)
t.clearstamp(secondStamp) # 清除第2只海龟
time.sleep(3)
t.clearstamps(None) # 清除所有海龟(除了作为shape的那一只)
t.hideturtle() # 隐藏目前海龟
print(t.isvisible()) # False
t.done()
screen.getshapes() 方法可以列出所有的海龟光标
import turtle as t
screen = t.Screen() # 创建一个屏幕
t.color('green')
print(screen.getshapes())
for cursor in screen.getshapes():
t.shape(cursor) # 更改海龟光标
t.stamp() # 海龟游标盖章
t.up()
t.forward(30)
t.down()
t.done()
六、图形交互
鼠标点击,输出x y
import turtle as t
screen = t.Screen() # 创建一个屏幕
def printStr(x,y):
print(x,y)
screen.onclick(printStr) # 输出x y
screen.mainloop() # screen.mainloop()在最后一行,让程序不结束
import turtle as t
screen = t.Screen() # 创建一个屏幕
def drawCircle(x,y):
if x>0:
t.fillcolor('yellow')
else:
t.fillcolor('blue')
t.up()
t.setpos(x,y-50)
t.begin_fill()
t.circle(50)
t.end_fill()
t.ht()
screen.onclick(drawCircle) # 绘制圆形
screen.mainloop() # screen.mainloop()在最后一行,让程序不结束