当前位置:   article > 正文

【Python】 标准库turtle(海龟函数画图)_turtle.screensize(w,h)

turtle.screensize(w,h)

一.turtle基础知识和相关命令

  • 画布–通过turtle.screensize(w,h,bg)设置画布的宽、高和背景颜色。
  • 画笔–可以设置画笔的状态属性等,具体关于画笔的命令见下表。
  • 坐标–绝对坐标:以画布中心为坐标原点(0,0),画笔运动以坐标值来指定;相对坐标:以海龟当前位置为参考(初始为坐标原点),通过海龟接下来的运动来控制画笔

turtle库是Python自带的标准库,可以直接导入(import)后调用其中的命令。
表一:画笔运动命令

命令功能说明
turtle.forward(x)或turtle.fd(x)当前画笔方向移动x像素长度
turtle.backward(x) 或 turtle.bk(x)或 turtle.back(x)向当前画笔的相反方向移动x像素长度
turtle.right(degree)或turtle.rt(degree)画笔方向顺时针移动degree度
turtle.left(degree) 或turtle.lt(degree)画笔方向逆时针移动degree度
turtle.tilt( degree)将画笔方向按顺时针旋转degree度
turtle.setheading(angle) 或turtle.seth(angle)设置画笔当前朝向为angle角度
turtle.pendown( )或turtle.pd( )或turtle.down( )落下画笔,移动时绘制图形,缺省时也为绘制
turtle.penup( )或turtle.pu( )或turtle.up( )提起画笔移动,不绘制图形,用于另起一个地方绘制
turtle.goto(x,y) 或turtle.steps(x,y)或turtle.setpositon(x,y)将画笔移动到坐标为x,y的位置
turtle.circle(radius,extend=None,steps=None )以给定半径画圆。参数:radius–半径为正(负)表示圆心在画笔的左边(右边)画圆;extend–弧度,可选参数;steps–可选参数,做半径为radius的圆的内切正多边形。steps为多边形的边数。
turtle.setx(m )将当前x轴移动到指定坐标m处,画笔落下时沿途会绘制
turtle.sety(n)将当前y轴移动到指定坐标n处,画笔落下时沿途会绘制
turtle.home( )将当前画笔移动到原点处,画笔朝向东,画笔落下时沿途会绘制
turtle.dot ( r [,‘color’/ (R,G,B) ])绘制一个指定直径和颜色的圆点,颜色缺省时默认为当前画笔颜色,指定颜色时可以是‘red’这样的字符串形式也可以是(R,G,B)元组形式

表二:画笔控制命令和画笔属性

命令功能说明
turtle.position()或turtle.pos()返回画笔的当前位置
turtle.xcor( )返回当前的x坐标
turtle.ycor( )返回当前的y坐标
turtle.filllcolor(‘color’)绘制图形的填充颜色
turtle.color(color1,color2)同时设置pencolor=color1,fillcolor=color2
turtle.filling()返回当前是否在填充状态
turtle.begin_fill()准备开始填充图形
turtle.end_fill()填充完成
turtle.hideturtle( ) 或turtle.ht( )隐藏画笔的turtle形状
turtle.showturtle( )或turtle.st( )显示画笔的turtle形状
turtle.pensize( )设置线条的粗细。参数:width–一个正数
turtle.pencolor( ),没有参数传入时返回当前画笔的颜色,传入参数设置护臂颜色,可以是字符串’color’形式,也可以是RGB3元组形式
turtle.speed(speed)设置画笔移动速度,画笔绘制的速度范围[0,10]整数
turtle.degrees( )设置一整圈的度数。默认是360度。
turtle.radians( )将角度测量单位设置为弧度。相当于degrees(2*math.pi)
turtle.shape( )设置乌龟的图形形状,取“arrow”,“turtle”,“circle”,“square”,“triangle”,“classic”
turtle.shapesize( )或turtle.turtlesize( )返回画笔的属性。

表三:全局控制命令

命令功能说明
turtle.screensize(w,h,bg)设置画布的宽(单位像素)、高、背景颜色;当没有参数输入时返回默认大小
turtle.setup(w,h)w,h输入宽、高为整数时表示像素;为小数时表示占据电脑屏幕的比例,(startx,starty)这一坐标表示矩形窗口左上角顶点的位置,如果为空则窗口位于屏幕中心
turtle.clear( )清空turtle窗口,但是turtle的位置和状态不会改变
turtle.reset( )清空窗口,重置turtle状态为起始状态
turtle.undo( )撤销上一个turtle动作
turtle.isvisible( )返回当前turtle是否可见
turtle.stamp( )复制当前图形到画布上,返回stamp_id.可以调用,可以删除。
turtle.clearstamp( )删除stamp()返回的值。
turtle.write(s [,font=(’‘font-name’’,font-size,’‘font-type’’)])写文本,s为文本内容,font是字体参数
turtle.towards(x,y)返回当前位置同指定位置(x,y)之间的角度
turtle.heading( )返回当前的方向值
turtle.distance( )返回x,y两个点之间的直线距离
turtle.shearfactor( )设置或返回当前的剪切因子
turtle.tiltangle( )设置或返回当前的倾斜角度
turtle.onclick( )鼠标点击事件。参数:fun----一个带有两个参数的函数,这些参数将与画布上单点击的坐标一个调用。num—鼠标按钮数量,默认为1(鼠标左键)。add—为True的时候将添加新的绑定,否则替换以前的绑定。
turtle.onrelease( )鼠标释放事件。参数同点击事件
turtle.ondrag( )鼠标移动事件。参数同点击事件
turtle.clone( )创建并返回具有相同位置等等属性的乌龟克隆
turtle.getturtle( )或turtle. getpen( )获取turtle对象本身
turtle.getscreen( )返回正在绘制的对象
turtle.setundobuffer( )设置或禁用中断器。参数:size—整数。如果大小是None则禁用缓冲区。
turtle.bgcolor( )设置或返回当前的TurtleScreen的背景颜色
turtle.bgpic( )设置背景图片。参数:picname-文件名
turtle.ontimer定时器
turtle.textinput( ) 或turtle.numinput( )弹出一个输入字符串和数字的窗口。

表四:其他命令

命令功能说明
turtle.mainloop( ) 或turtle.done( )启动事件循环-调用Tkinter中的mainloop函数。这个语句必须是乌龟图形程序中的最后一个语句
turtle.mode(mode=None)设置乌龟模式(standard,logo或world)并执行重置。如果没有给出模式则返回当前模式。
turtle.delay(delay=None)设置或返回以毫秒为单位的绘图延迟
turtle.begin_poly( )开始记录多边形的顶点,当前乌龟位置是多边形的第一个顶点
turtle.end_poly( )停止记录多边形的顶点,当前乌龟位置是多边形的最后一个顶点
turtle.get_poly( )返回最后记录的多边形

二.实例

1.树形一

from turtle import *
from random import *
from math import *
 
def tree(n, l):
    pd()
    t = cos(radians(heading() + 45)) / 8 + 0.25
    pencolor(t, t, t)
    pensize(n / 4)
    forward(l)
    if n > 0:
        b = random() * 15 + 10
        c = random() * 15 + 10
        d = l * (random() * 0.35 + 0.6)
        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, n)
        circle(2)
        left(90)
    pu()
    backward(l)
 
bgcolor(0.5, 0.5, 0.5)
ht()
speed(0)
tracer(0, 0)
left(90)
pu()
backward(300)
tree(13, 100)
done()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

效果图:
树形1
2.树形2

from turtle import *
 
# 设置色彩模式是RGB:
colormode(255)
 
lt(90)
 
lv = 14
l = 120
s = 45
 
width(lv)
 
# 初始化RGB颜色:
r = 0
g = 0
b = 0
pencolor(r, g, b)
 
penup()
bk(l)
pendown()
fd(l)
 
def draw_tree(l, level):
    global r, g, b
    # save the current pen width
    w = width()
 
    # narrow the pen width
    width(w * 3.0 / 4.0)
    # set color:
    r = r + 1
    g = g + 2
    b = b + 3
    pencolor(r % 200, g % 200, b % 200)
 
    l = 3.0 / 4.0 * l
 
    lt(s)
    fd(l)
 
    if level < lv:
        draw_tree(l, level + 1)
    bk(l)
    rt(2 * s)
    fd(l)
 
    if level < lv:
        draw_tree(l, level + 1)
    bk(l)
    lt(s)
 
    # restore the previous pen width
    width(w)
 
speed("fastest")
 
draw_tree(l, 4)
 
done()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

效果图:
树形2 3.时钟

import turtle
from datetime import *
 
# 抬起画笔,向前运动一段距离放下
def Skip(step):
    turtle.penup()
    turtle.forward(step)
    turtle.pendown()
 
def mkHand(name, length):
    # 注册Turtle形状,建立表针Turtle
    turtle.reset()
    Skip(-length * 0.1)
    # 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
    turtle.begin_poly()
    turtle.forward(length * 1.1)
    # 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
    turtle.end_poly()
    # 返回最后记录的多边形。
    handForm = turtle.get_poly()
    turtle.register_shape(name, handForm)
 
def Init():
    global secHand, minHand, hurHand, printer
    # 重置Turtle指向北
    turtle.mode("logo")
    # 建立三个表针Turtle并初始化
    mkHand("secHand", 135)
    mkHand("minHand", 125)
    mkHand("hurHand", 90)
    secHand = turtle.Turtle()
    secHand.shape("secHand")
    minHand = turtle.Turtle()
    minHand.shape("minHand")
    hurHand = turtle.Turtle()
    hurHand.shape("hurHand")
   
    for hand in secHand, minHand, hurHand:
        hand.shapesize(1, 1, 3)
        hand.speed(0)
   
    # 建立输出文字Turtle
    printer = turtle.Turtle()
    # 隐藏画笔的turtle形状
    printer.hideturtle()
    printer.penup()
    
def SetupClock(radius):
    # 建立表的外框
    turtle.reset()
    turtle.pensize(7)
    for i in range(60):
        Skip(radius)
        if i % 5 == 0:
            turtle.forward(20)
            Skip(-radius - 20)
           
            Skip(radius + 20)
            if i == 0:
                turtle.write(int(12), align="center", font=("Courier", 14, "bold"))
            elif i == 30:
                Skip(25)
                turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
                Skip(-25)
            elif (i == 25 or i == 35):
                Skip(20)
                turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
                Skip(-20)
            else:
                turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
            Skip(-radius - 20)
        else:
            turtle.dot(5)
            Skip(-radius)
        turtle.right(6)
        
def Week(t):   
    week = ["星期一", "星期二", "星期三",
            "星期四", "星期五", "星期六", "星期日"]
    return week[t.weekday()]
 
def Date(t):
    y = t.year
    m = t.month
    d = t.day
    return "%s %d%d" % (y, m, d)
 
def Tick():
    # 绘制表针的动态显示
    t = datetime.today()
    second = t.second + t.microsecond * 0.000001
    minute = t.minute + second / 60.0
    hour = t.hour + minute / 60.0
    secHand.setheading(6 * second)
    minHand.setheading(6 * minute)
    hurHand.setheading(30 * hour)
    
    turtle.tracer(False) 
    printer.forward(65)
    printer.write(Week(t), align="center",
                  font=("Courier", 14, "bold"))
    printer.back(130)
    printer.write(Date(t), align="center",
                  font=("Courier", 14, "bold"))
    printer.home()
    turtle.tracer(True)
 
    # 100ms后继续调用tick
    turtle.ontimer(Tick, 100)
 
def main():
    # 打开/关闭龟动画,并为更新图纸设置延迟。
    turtle.tracer(False)
    Init()
    SetupClock(160)
    turtle.tracer(True)
    Tick()
    turtle.mainloop()
 
if __name__ == "__main__":
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121

效果图:
时钟4.螺旋线

import turtle
turtle.speed("fastest")
turtle.pensize(2)
for x in range(100):
    turtle.forward(2*x)
    turtle.left(91)
turtle.done()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

效果图:(可以尝试修改代码绘制彩色螺旋线)
螺旋线 5.黄金螺旋线(斐波那契螺旋线)

from turtle import *
#import cmath
speed(10)
pensize(5)
 
#判断较小整数的函数
def little(a,b):
    if a<b:
        return a
    else:
        return b
#初始点
#矩形
x0 = 250
y0 = 150
r= little(2*x0,2*y0)
 
#定义绘制、填充1/2正方形及扇形的函数
def square_sector(r,color_couple):
    color("black",color_couple[0])
    begin_fill()
    #顺时针画1/2正方形
    #for i in range(2):
    fd(r)
    rt(90)
    fd(r)
    end_fill()
    #顺时针画剩余1/2正方形及1/4圆弧
    color("black",color_couple[1])
    begin_fill()
    for i in range(2):
        rt(90)
        fd(r)
    rt(90)
    circle(-r,90)
    end_fill()
 
 
#黄金比例
#golden_ratio = (cmath.sqrt(5)-1)/2#can't convert complex to int
golden_ratio = 0.618
 
 
#5组填充色——[color_rect,color_arc]#1/2矩形,扇形
color_ls = [["#8F653B","#EDCB67"],["#B58539","#7D6A98"],\
            ["#FAC374","#56ACA9"],["#D87D84","#DA8F3C"],["#769A43","#CF4749"]]
 
pu()
goto(x0,y0)#矩形的右上顶点,默认初始角度0
pd()
seth(-90)
#循环绘制、填充矩形及扇形
for i in range(5):
    r = 300*(golden_ratio**i)#边长
    #rt(90)#"正方形圆弧图块整体"右转90度绘制
    square_sector(r,color_ls[i])
 
hideturtle()
done()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

效果图:
黄金螺旋线

  • 推荐几篇turtle库的优秀博文

用Python绘制斐波那契螺旋线(黄金螺旋线)
Python绘图Turtle库详解
python 学习笔记(三)—turtle库的使用(超详细)

以上示例代码整理于多名博主的博文,侵删!
关于turtle库的其他许多绘图命令尚未整理完全,之后会陆续在此篇博客更新。

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

闽ICP备14008679号