python turtle相关
一、简介
二、内容
三、问题
一、简介
最近需要考计算机二级python,然后里面出现了平时基本没用到的turtle, 在这里做一下复习总结。
turtle, 是 Python 中用来绘图的标准库,它总体上讲,就是控制一只乌龟在纸上画画, 控制它的朝向,笔粗细,填充。
二、内容
以下,按书上归类进行描述。
三大类分别是: 窗体函数,画笔状态函数,画笔运动函数。
书上没有的,会标记补充。
turtle,是以窗口横纵中心为 0,0的原点
1 窗体函数
1.1 turtle.setup()
setup(width, height, startx, starty)
方法有四个参数
width, height: 如果是整数,表示就是像素值,如果是小数,就是窗口与屏幕的比例。
startx, starty: 表示窗口左侧与屏幕左侧像素距离。 不传或者为None, 则是默认居中。
如果对于窗口没什么要求,也可以不调用此方法,一样可以直接画图。
1.2 补充:turtle.title()
title(title_str)
title_str:传入字符串,设置窗口标题
1.3 补充:turtle.done()
done()的作用:暂停程序,停止画笔绘制,但绘图窗体不关闭,直到用户关闭Python Turtle图形化窗口为止。
如果不加这个,turtle运行完就会关闭窗口。
相关代码示例
import turtle # 设置窗口跟标题 turtle.setup(1000, 800, 100, 100) turtle.title('练习turtle') turtle.done()
效果图
2 画笔状态函数
2.1 turtle.pendown() 和 turtle.penup()
画笔的放下和提起
penup() 可以简写为 pu() 或者 up(): 画笔提起
pendown() 可以简写为 pd() 或者 down(): 画笔放下
2.2 turtle.pensize() 和 turtle.pencolor()
画笔的粗细,和画笔颜色
pensize(size) 可以简写为 width(size) : 传入size整数,设置笔宽像素。如果不传,返回当前笔的宽度值。
pencolor(colorstring) 或者 pencolor((r,g,b)): 传入画笔颜色,或者rgb颜色。比如金黄色 可以使用 pencolor(‘gold’) 或者 pencolor((1,0.84,0))
示例代码
import turtle # turtle.fd() 在第三部分 画笔移动会讲 # 画笔向前移动100像素 turtle.fd(100) # 画笔提起 turtle.pu() # 虽然向前移动了100像素,但是由于画笔提起,所以没有痕迹 turtle.fd(100) # 放下画笔 turtle.pd() # 不传入值,turtle.width() 会返回画笔宽度值 print('画笔pensize', turtle.width()) # 设置画笔宽度 turtle.width(5) # 设置画笔颜色 为红色 turtle.pencolor('red') # 向前移动100像素 turtle.fd(100) # 暂定窗口, 使其不会关闭 turtle.done()
效果图
控制台返回
2.3 turtle.color()
设置画笔颜色和填充颜色。
color(colorstring1, colorstring2) 或者 color((r1,g1,b1),(r2,g2,b2))
第一个参数为画笔颜色,第二个参数为填充颜色。
如果直传一个颜色参数,那就是,画笔和填充颜色设置成一样的颜色。
2.4 turtle.begin_fill() 和 turtle.end_fill()
填充和结束填充
当begin_fill() 时会记录开始记录位置,然后end_fill()结束记录,程序会根据行走的路径进行颜色填充。
2.5 turtle.filling()
查看代码是不是在 turtle.begin_fill() 和 turtle.end_fill() 之间。
是返回True, 否则返回False
示例代码
import turtle # 设置画笔和填充颜色,设置为同一颜色 turtle.color('red') # 填充标记开始 turtle.begin_fill() # turtle.circle() 在第三部分 画笔移动会讲 # 以半径为100像素向左画圆 turtle.circle(100) # 查看是不是在begin_fill() end_fill() 之间 print('是不是在fill', turtle.filling()) # 结束标记点,并填充颜色 turtle.end_fill() # 查看是不是在begin_fill() end_fill() 之间 print('是不是在fill', turtle.filling()) turtle.begin_fill() # 设置画笔和填充颜色为不同颜色 turtle.color('blue', 'gold') # 以半径为100像素向右画圆 turtle.circle(-100) turtle.end_fill() # 暂定窗口, 使其不会关闭 turtle.done()
效果图
控制台返回
2.6 turtle.clear() 和 turtle.reset()
clear(): 清空当前窗口,但不改变画笔位置和一些状态。
reset():清空当前窗口,画笔位置回到原点,并且一些状态恢复默认。
2.7 turtle.screensize()
设置画布大小。
窗体和画布是两个概念。 setup()可以修改窗体大小, 而screensize是修改画布大小。
当窗体大于画布时,画布会填充满窗口,当窗体小于画布时,窗体会出现滚动条。
screensize(width, height, bgcolor) 有三个参数
width, height: 传入整数,画布的宽与高,
bgcolor: 传入颜色字符串,或者颜色rgb元组,跟上面设置颜色一样。
不传入参数,返回画布大小元组
ps: 当设置画布大小小于窗体时会无效,当设置大于窗体时,会出现滚动条。
示例代码
import time import turtle # 设置画笔速度 在第三部分 画笔移动会讲 turtle.speed(1) # turtle.fd() 在第三部分 画笔移动会讲 # 画笔向前移动100像素 turtle.fd(100) # 清空画布内容, 画笔坐标值回到原点, 包括一些设置都会恢复默认,比如画笔速递 turtle.reset() # 画笔向前移动100像素 turtle.fd(100) time.sleep(3) turtle.speed(1) # 画笔向前移动100像素 turtle.fd(100) # 清空画布内容, 不改变画笔坐标值,也不会修改画笔速度 turtle.clear() # 画笔向前移动100像素 turtle.fd(100) # 设置窗口大小,并填充背景颜色 turtle.screensize(1000, 1000, 'yellow') # 返回画布元组 print('画布大小元组', turtle.screensize()) # 暂定窗口, 使其不会关闭 turtle.done()
控制台
2.8 turtle.showturtle() 和 turtle.hideturtle()
showturtle()显示画笔图标
hideturtle()隐藏画笔图标
2.9 turtle.isvisible()
返回图标是不是显示,显示为True, 隐藏为False
2.10 turtle.write()
根据设置字体将字符串在图上显示出来
write(str, font=None)
str: 需要显示色字符串,
font: 字体设置的元组 比如 ('Arial', 50, 'normal')
示例代码
import turtle turtle.speed(1) # 查看图标是不是显示 print('图标状态', turtle.isvisible()) # 隐藏图标 turtle.hideturtle() # 查看图标是不是显示 print('图标状态', turtle.isvisible()) turtle.fd(100) # 显示图标 turtle.showturtle() # 查看图标是不是显示 print('图标状态', turtle.isvisible()) # 将字符串显示在画布上 turtle.write('好好学习', font=('Arial', 50, 'normal')) # 暂定窗口, 使其不会关闭 turtle.done()
效果图
控制台
3 画笔运动函数
3.1 turtle.forward() 和 turtle.backward()
forward(distance)可以简写为 fd(distance): 画笔向前移动distance像素距离
backward(distance)可以简写为 bk(distance): 画笔向后移动distance像素距离,画笔的方向不变
3.2 turtle.left() 和 turtle.right()
left(angle)可以简写为 (angle): 画笔方向向左转动angle 角度
right(angle)可以简写为 rt(angle): 画笔方向向右转动angle 角度
3.3 turtle.setx() 和turtle.sety()
setx(val): 保持y轴值不变,将画笔的x轴值,移动为val, 如果画笔状态为落下,便会画出痕迹。
sety(val): 保持x轴值不变,将画笔的y轴值,移动为val,如果画笔状态为落下,便会画出痕迹。
3.3 turtle.goto()
goto(x, y): 将 画笔移动到坐标为(x, y)的点上,如果画笔状态为落下,便会画出痕迹。
3.4 turtle.setheading()
setheading(to_angle): 调整画笔角度, 以最初位置,也就是原点初始位置方向为基准, 将当前画笔角度调整到to_angle的角度上。
3.5 turtle.home()
home(): 移动画笔到初始位置,并调整画笔朝向为初始朝向。
示例代码
import turtle turtle.write('向前移动100') turtle.fd(100) turtle.write('左转90度') turtle.lt(90) # 为了防止文字重叠,将后退100 分为两个 后退50 turtle.bk(50) turtle.write('后退100') turtle.bk(50) turtle.write('右转60度') turtle.rt(60) # 为了防止文字重叠,将前进100 分为两个 前进50 turtle.fd(50) turtle.write('前进100') turtle.fd(50) turtle.write('去往坐标为 -200,-100') turtle.goto(-200, -100) turtle.write('纵移坐标到 y轴为100') turtle.sety(100) turtle.write('横移坐标到 x轴为100') turtle.setx(100) turtle.write('设置画笔朝向为绝对值为135度') turtle.setheading(135) # 为了防止文字重叠,将前进100 分为两个 前进50 turtle.fd(50) turtle.write('前进100') turtle.fd(50) turtle.write('去往原点') turtle.home() # 暂定窗口, 使其不会关闭 turtle.done()
效果图
3.6 turtle.circle()
circle(radius, extent=None, steps=None): 绘制圆弧。
radius: 圆弧半径, 当半径为正数时,画笔向左边画弧, 当半径为负数时,画笔向右画弧。
extent: 圆弧角度,不传值,默认为画圆, 传值为角度值。当值为正数时,向前正向画弧,值为负数时,向后反向画弧。
steps: 不传值,默认为画圆弧。传整数值,画圆弧等分后的线段。
3.7 turtle.dot()
绘制一个带有背景颜色的的圆点
dot(size, color): size为原点直径,color为字符串名称或者,rgb元组,跟上面的颜色设置一样。
3.8 turtle.undo()
撤销绘图的最后一次操作
3.9 turtle.speed()
画笔移动速度
speed(s): 传入整数0-10. 0代表没有绘制, 10为最快速递,超过10会视为0。
代码示例
import turtle as t # 设置画笔速度为2 t.speed(2) # 太极圆半径 tai_d = 150 # 提笔 t.up() # 后退半径位置 t.bk(tai_d) # 画笔角度向右转90度 t.right(90) # 落笔 t.down() # 开始画太极黑鱼 # 开启填充 t.begin_fill() # 向左画半径为 tai_d ,角度为180度的圆弧 t.circle(tai_d, 180) # 画太极内圆, 向左画半径为tai_d/2 ,角度为180的圆弧 t.circle(tai_d / 2, 180) # 画太极内圆, 向右画半径为tai_d/2 ,角度为180的圆弧 t.circle(-tai_d / 2, 180) # 结束填充,太极黑鱼画完 t.end_fill() # 开始画白鱼 # 向右画半径为 tai_d ,角度为180度的圆弧 t.circle(-tai_d, 180) # 画白鱼眼睛 # 提笔 t.up() # 去往 坐标为 (-tai_d / 2, 0 )的点 t.goto(-tai_d / 2, 0) # 落笔 t.down() # 画直径为30 ,颜色为black的圆点 t.dot(35, 'black') # 画黑鱼眼睛 # 提笔 t.up() # 去往 坐标为 (tai_d / 2, 0 )的点 t.goto(tai_d / 2, 0) # 落笔 t.down() # 画直径为30 ,颜色为white的圆点 t.dot(35, 'white') # 撤销画最后的圆点 t.undo() t.done()
效果图
示例代码二,八卦
import turtle as t # 八卦总长半径 b_d = 400 # 单根爻长 yao_len = 180 # 阴爻中间空长 kong_len = 30 # 爻宽度 yao_width = 10 # 爻间隔 yao_jian_ge = 40 ##太极半径 taiji_d = 150 taiji_dian_d = 35 # 画八卦的边框 def bian(): t.up() t.goto(-b_d, 0) t.setheading(-90) t.width(3) t.down() t.circle(b_d, steps=8) # 画单个的爻 def huayao(juli, radius, yang=True): t.width(yao_width) t.up() t.home() t.left(radius) t.fd(juli) t.left(90) t.fd(yao_len / 2) t.left(180) t.down() if yang: t.fd(yao_len) else: first_len = (yao_len - kong_len) / 2 t.fd(first_len) t.penup() t.fd(kong_len) t.pendown() t.fd(first_len) # 根据参数,方向,画八卦其中一卦 def fangwei(can, radius): yaochang = b_d * 0.8 for item in can: huayao(yaochang, radius, item) yaochang -= yao_jian_ge # 生成八卦爻的参数列表,未按先天八卦或者后台八卦排序,有兴趣可以自行去排序 def get_ba_can(): can = [0, 1] back = [] for item in can: for item1 in can: for item2 in can: back.append([item, item1, item2]) return back # 根据八卦爻的参数列表,画八个卦 def hua_yao(): ba_can_list = get_ba_can() for key, item in enumerate(ba_can_list): print(key, item) jiao = 22.5 + (key * 45) fangwei(item, jiao) # 画中心的太极圆 def hua_taiji(): t.up() t.home() t.width(1) t.bk(taiji_d) t.right(90) t.down() t.begin_fill() t.circle(taiji_d, 180) t.circle(taiji_d / 2, 180) t.circle(-taiji_d / 2, 180) t.end_fill() t.circle(-taiji_d, 180) t.up() t.goto(-taiji_d / 2, 0) t.down() t.dot(taiji_dian_d, 'black') t.up() t.goto(taiji_d / 2, 0) t.down() t.dot(taiji_dian_d, 'white') # 运行方法汇总 def run_work(): t.setup(1000, 1000) t.title("八卦") t.speed(10) bian() hua_yao() hua_taiji() t.hideturtle() t.done() if __name__ == "__main__": run_work()
效果图
三、问题
1. 注意创建文件名时,别 turtle 重名,会导致运行不了。
2. 怎么保存画完的图。
turtle.getscreen() turtle.getcanvas().postscript(file="./bagua.eps")
可以将画的图保存为eps文件。
再通过 PIL ,可以将其转换为jpg,格式
from PIL import Image
im = Image.open("./bagua.eps") im.save("./bagua.jpg", "JPEG")
如果报错:OSError: Unable to locate Ghostscript on paths
则需要装Ghostscript ,
官网地址在这:https://ghostscript.com/releases/gsdnld.html
如果下载很慢,可能得翻了墙下载。
详细可以参考这篇:去看看