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

  如果下载很慢,可能得翻了墙下载。

  详细可以参考这篇:去看看

posted @ 2024-03-05 14:40  PKGAME  阅读(29)  评论(0编辑  收藏  举报