用Python画一条蛇,新年与您一起画蛇添福

用Python画一条蛇,新年与您一起画蛇添福

蛇年到了,祝大家在新的一年画蛇添福,画蛇添富!

从2021年开始,我每年都会用Python画一幅当年生肖的图,今年是第5年。

前面四年的文章链接如下:
用Python标准库turtle画一头金牛,祝您新年牛气冲天!
用Python标准库turtle画一只老虎,祝您新年虎虎生威,大吉大利
用Python画一只小兔子,祝您新年前途似锦,大展宏图
用Python画一条祥龙,祝您新年龙腾万里

今年继续画一条蛇,为大家送上祝福。你也可以免费获取代码自己运行。

绘图过程录制成了如下视频,点击视频可以先看到效果。

视频展示

用Python画一条蛇,新年与您一起画蛇添福

绘图结果

在这里插入图片描述

实现方法介绍

本文的绘图工具使用Python标准库turtle库,无需安装,导入即可使用。

部分函数用法介绍(如果已经知道基本用法可以跳过此部分):

画布设置

  • title(): 设置窗口的标题。
  • bgpic():设置背景图片。
  • setup(width, height, x, y): 设置窗口大小和窗口左上角在屏幕中的位置。
  • shape():设置鼠标的形状。
  • done(): 绘图结束后,不自动关闭窗口。

画笔设置

  • pencolor(color): 设置画笔颜色。
  • width(): 设置画笔宽度。
  • speed(int): 设置画笔的速度,传入1~10的数字,1最慢,10最快。传入其他值会更快,但是没有鼠标移动的动画效果。
  • penup(): 提起画笔,提起后移动画笔不会留下痕迹。
  • pendown(): 落下画笔,开始绘图前先将画笔落下。
  • setx(value): 设置画笔的x轴坐标。
  • sety(value): 设置画笔的y轴坐标。
  • towards(x, y): 设置画笔指向的点。
  • setheading(): 设置画笔的方向。与towards()配合可以设置画笔指向某个点,如setheading(towards(0, 0))可以设置画笔指向原点。
  • pos(): 返回画笔当前的坐标。鼠标移动一段时间后可以print()打印此函数获取鼠标位置。
  • heading(): 返回画笔当前的方向。

画笔操作

  • circle(radius[, extent=arc]): 画一个圆,传入圆的半径,根据画笔的方向控制圆心的位置,圆心与画笔的方向垂直。传入弧度值可以画出指定弧度的圆弧。
  • left(angle): 画笔左转,传入任意一个目标角度。
  • right(angle): 画笔右转。
  • forward(distance): 画笔前进一段距离。
  • backward(distance): 画笔后退一段距离。
  • goto(x, y): 移动画笔到指定坐标。

颜色填充

  • begin_fill(): 开始填充。
  • fillcolor(color): 设置图形中填充的颜色。
  • end_fill(): 结束填充。

具体画图时,调整画笔的起点,设置不同的转角度数和不同的前进长度,可以得到不同形状的弧线(其实是折线,看起来是弧线的效果),用弧线构成完整的图形。

部分代码

# coding=utf-8
"""
作者:小斌哥ge
公众号: 小斌哥ge
微信:XiaoBinnGe-
发表时间:2025年1月
"""
from turtle import *
import time


def set_start(x, y, w=1, c='black'):
    penup()
    setx(x)
    sety(y)
    setheading(towards(0, 0))
    width(w)
    pencolor(c)
    pendown()
    speed(0)


def left_rotate(times, angle, length):
    for i in range(times):
        left(angle)
        forward(length)


def right_rotate(times, angle, length):
    for i in range(times):
        right(angle)
        forward(length)


def fill_color_patch(x, y, c='black'):
    set_start(x, y, 1, c=c)
    begin_fill()
    set_start(x, y, 1, c=c)
    forward(1)
    fillcolor(c)
    end_fill()


def draw_body():
    """蛇身"""
    fill_color_patch(105, 0, c='black')
    begin_fill()
    set_start(105, 0, w=2, c='#732501')
    left_rotate(1, 80, 5)
    right_rotate(3, 3, 5)
    left_rotate(3, 3, 5)
    right_rotate(3, 6, 10)
    left_rotate(5, 4, 10)
    left_rotate(6, 5, 5)
    left_rotate(6, 6, 5)
    left_rotate(7, 9.5, 5)
    right_rotate(3, 12, 3)
    left_rotate(1, 90, 3)
    right_rotate(3, 30, 2.5)
    left_rotate(1, 120, 3)
    right_rotate(3, 25, 5)
    left_rotate(1, 80, 2)
    right_rotate(2, 20, 3)
    left_rotate(1, 50, 3)
    right_rotate(3, 30, 4)
    left_rotate(1, 80, 2)
    right_rotate(2, 18, 2)
    left_rotate(1, 75, 3)
    right_rotate(4, 25, 4)
    left_rotate(1, 80, 2)
    right_rotate(2, 18, 3)
    left_rotate(1, 75, 3)
    right_rotate(3, 25, 4)
    left_rotate(1, 90, 3)
    right_rotate(3, 25, 4)
    right_rotate(2, 10, 4)
    right_rotate(1, 105, 10)
    right_rotate(2, 5, 10)
    right_rotate(3, 6, 10)
    right_rotate(3, 9, 10)
    right_rotate(3, 8, 10)
    right_rotate(3, 9, 10)
    right_rotate(2, 6, 10)
    right_rotate(3, 8, 10)
    right_rotate(3, 7, 15)
    right_rotate(3, 5, 15)
    right_rotate(3, 5, 12)
    right_rotate(3, 7, 12)
    right_rotate(6, 7, 8)
    right_rotate(3, 6, 10)
    right_rotate(3, 5, 10)
    left_rotate(5, 2, 10)
    left_rotate(3, 3, 8)
    left_rotate(3, 5, 5)
    left_rotate(2, 5, 10)
    goto(105, 0)
    fillcolor('white')
    end_fill()

    set_start(7, -52, w=2, c='#732501')
    right_rotate(1, 145, 10)
    left_rotate(3, 10, 10)
    left_rotate(2, 8, 12)
    width(1)
    left_rotate(1, 8, 12)
    set_start(-6, -92, w=2, c='#732501')
    right_rotate(1, 135, 10)
    left_rotate(3, 10, 10)
    left_rotate(2, 7, 12)
    width(1)
    left_rotate(1, 7, 12)
    set_start(-15, -153, w=2, c='#732501')
    right_rotate(1, 112, 10)
    left_rotate(3, 8, 15)
    left_rotate(3, 8, 11)
    width(1)
    left_rotate(1, 8, 11)
    set_start(35, -210, w=2, c='#732501')
    right_rotate(1, 95, 10)
    left_rotate(3, 7, 10)
    left_rotate(3, 9, 10)
    width(1)
    left_rotate(1, 9, 10)
    set_start(118, -216, w=2, c='#732501')
    right_rotate(1, 80, 10)
    left_rotate(3, 10, 8)
    left_rotate(2, 10, 9)
    width(1)
    left_rotate(1, 10, 9)
    set_start(173, -190, w=2, c='#732501')
    right_rotate(1, 48, 10)
    left_rotate(3, 8, 8)
    left_rotate(2, 10, 6)
    width(1)
    left_rotate(1, 10, 6)
    set_start(195, -145, w=2, c='#732501')
    right_rotate(1, 25, 10)
    left_rotate(3, 8, 7)
    left_rotate(2, 10, 7)
    width(1)
    left_rotate(1, 10, 7)
    set_start(177, -91, w=2, c='#732501')
    left_rotate(1, 10, 5)
    left_rotate(3, 9, 5)
    left_rotate(2, 10, 5)
    width(1)
    left_rotate(1, 10, 5)
    set_start(150, -73, w=2, c='#732501')
    left_rotate(1, 30, 4)
    left_rotate(2, 15, 4)
    width(1)
    left_rotate(1, 15, 4)

    fill_color_patch(105, 0, c='black')
    begin_fill()
    set_start(105, 0, w=2, c='#732501')
    left_rotate(1, 80, 5)
    right_rotate(3, 3, 5)
    left_rotate(3, 3, 5)
    right_rotate(3, 6, 10)
    left_rotate(5, 4, 10)
    left_rotate(6, 5, 5)
    left_rotate(6, 6, 5)
    left_rotate(7, 9.5, 5)
    right_rotate(3, 12, 3)
    left_rotate(1, 90, 3)
    right_rotate(3, 30, 2.5)
    left_rotate(1, 120, 3)
    right_rotate(3, 25, 5)
    left_rotate(1, 80, 2)
    right_rotate(2, 20, 3)
    left_rotate(1, 50, 3)
    right_rotate(3, 30, 4)
    left_rotate(1, 80, 2)
    right_rotate(2, 18, 2)
    left_rotate(1, 75, 3)
    right_rotate(4, 25, 4)
    left_rotate(1, 80, 2)
    right_rotate(2, 18, 3)
    left_rotate(1, 75, 3)
    right_rotate(3, 25, 4)
    left_rotate(1, 90, 3)
    right_rotate(3, 25, 4)
    right_rotate(1, 20, 3)
    left_rotate(1, 150, 10)
    right_rotate(3, 2, 5)
    left_rotate(1, 80, 6)
    right_rotate(3, 26, 2)
    left_rotate(3, 3, 4)
    left_rotate(3, 9, 5)
    left_rotate(3, 15, 4.5)
    right_rotate(3, 25, 3)
    right_rotate(3, 22.5, 3)
    right_rotate(3, 23, 3)
    right_rotate(3, 6, 5)
    right_rotate(9, 4, 5)
    left_rotate(1, 10, 8)
    left_rotate(1, 2, 10)
    left_rotate(1, 4, 5)
    right_rotate(3, 4, 5)
    left_rotate(3, 4, 5)
    right_rotate(3, 3, 5)
    right_rotate(3, 2, 6)
    right_rotate(3, 2, 7)
    goto(105, 0)
    fillcolor('#FB8301')
    end_fill()

    fill_color_patch(-6.34, -93.48, c='black')
    begin_fill()
    set_start(-6.34, -93.48, w=2, c='#732501')
    setheading(67.5)
    left_rotate(3, 2, 10)
    left_rotate(1, 90, 5)
    right_rotate(3, 5, 4)
    right_rotate(3, 7, 4)
    left_rotate(3, 10, 4)
    left_rotate(3, 10, 4)
    right_rotate(3, 8, 5)
    left_rotate(2, 2, 3)
    right_rotate(4, 14, 4)
    left_rotate(2, 5, 5)
    right_rotate(3, 10, 5)
    right_rotate(3, 7, 5)
    left_rotate(3, 8, 5)
    left_rotate(3, 15, 4)
    left_rotate(6, 15, 3)
    left_rotate(3, 14, 3)
    left_rotate(6, 15, 3)
    left_rotate(1, 90, 4)
    left_rotate(1, 70, 3)
    right_rotate(5, 20, 2)
    right_rotate(5, 28, 1)
    right_rotate(3, 7, 5)
    right_rotate(3, 6, 4)
    left_rotate(3, 10, 5)
    left_rotate(9, 5, 6)
    right_rotate(1, 2, 4)
    left_rotate(3, 12, 5)
    right_rotate(3, 2, 4)
    right_rotate(6, 5, 4)
    left_rotate(3, 10, 5)
    goto(-6.34, -93.48)
    fillcolor('#FB8301')
    end_fill()


if __name__ == '__main__':
    title('画蛇添福(公众号:小斌哥ge)')
    wide = 500
    height = 500
    screensize(wide, height, '#EDB700')
    # screensize(wide, height, '#D2051E')
    setup(wide + 30, height + 30, 600, 50)
    shape(name='turtle')
    time.sleep(1)
    draw_body()
    # draw_head()
    # draw_cap()
    # draw_tattoo()
    # draw_red_packet()
    set_start(1000, 1000)
    done()

代码获取

代码有1700行,可以点文章下方的名片用WX关注我,在后台回复关键字“画蛇添福”获取完整代码。

声明:转载、二创等使用本文代码,请注明出处。


相关阅读:
用Python画一条祥龙,祝您新年龙腾万里
用Python画一只小兔子,祝您新年前途似锦,大展宏图
用Python标准库turtle画一只老虎,祝您新年虎虎生威,大吉大利
用Python标准库turtle画一头金牛,祝您新年牛气冲天!

📢欢迎 点赞👍 收藏⭐ 评论📝 关注 如有错误敬请指正!

☟ 学Python,点击下方名片关注我。☟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小斌哥ge

非常感谢,祝你一切顺利。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值