Python Turtle绘制中国结完整代码与实现步骤

花开有时
花开有时
发布时间:2026-10-15| 4人浏览过
原创

本文介绍如何使用Python的Turtle库绘制精美的中国结。文章详细解析了结体、耳翼及流苏的绘制逻辑,提供了完整的面向对象代码实现。通过调整画笔颜色、粗细及坐标参数,可一键生成对称精致的传统工艺品图形,适合Python入门及图形编程爱好者参考。

1 中国结的组成部分

中国结作为一种传统手工编织工艺品,其展现出的情致与智慧反映了汉族古老文明的一个侧面。由于中国结外观对称且制作精致,它不仅象征着汉族悠久的历史,也契合中国传统装饰的习俗与审美标准,因此得名“中国结”。在民间,中国结寓意着团结、幸福与平安,其精湛的做工深受大众喜爱。其主要组成部分如下图所示。

2 设计中国结对象

本示例基于Python Turtle库进行绘制。首先需设计一个中国结对象,并将画笔颜色设定为中国红。同时,定义一个__goto()函数,用于封装Turtle库中画笔移动的相关操作,以简化后续绘图逻辑。

import turtle as t

class chineseKnot:
  '''
  * @breif: 中国结
  '''  
  def __init__(self) -> None:
    # 画笔初始化
    self.t = t
    self.t.pensize(10)
    self.t.setup(700, 700)
    self.t.pencolor("red")
    self.t.speed(14)
    # 结心坐标
    self.x = 0
    self.y = 200
    
  '''
  * @breif: 画笔移动到指定位置
  * @param[in]: x -> 画笔移动位置横坐标
  * @param[in]: y -> 画笔移动位置纵坐标
  * @retval: None
  '''  
  def __goto(self, x: int, y: int) -> None:
    self.t.penup()
    self.t.goto(x,y)
    self.t.pendown()

3 绘制结体

def drawBody(self) -> None:
    for i in range(11):
        self.__goto(self.x - i * 10 * sqrt(2), self.y - i * 10 * sqrt(2))
        self.t.seth(-45)
        self.t.fd(200)
        self.__goto(self.x + i * 10 * sqrt(2), self.y - i * 10 * sqrt(2))
        self.t.seth(-135)
        self.t.fd(200)

4 绘制耳翼

def drawEdge(self) -> None:
    for i in range(4):
      # 左上角
      self.__goto(-10 * sqrt(2) - i * 20 * sqrt(2),
                  200 - 10 * sqrt(2) - i * 20 * sqrt(2))
      self.t.seth(135)
      self.t.fd(20)
      self.t.circle(10, 180)
      self.t.fd(20)

      # 右上角
      self.__goto(10 * sqrt(2) + i * 20 * sqrt(2),
                  200 - 10 * sqrt(2) - i * 20 * sqrt(2))
      self.t.seth(45)
      self.t.fd(20)
      self.t.circle(-10, 180)
      self.t.fd(20)

      # 左下角
      self.__goto(-10 * sqrt(2) - i * 20 * sqrt(2),
                  200 - 190 * sqrt(2) + i * 20 * sqrt(2))
      self.t.seth(-135)
      self.t.fd(20)
      self.t.circle(-10, 180)
      self.t.fd(20)
       
      # 右下角
      self.__goto(10 * sqrt(2) + i * 20 * sqrt(2),
                  200 - 190 * sqrt(2) + i * 20 * sqrt(2))
      self.t.seth(-45)
      self.t.fd(20)
      self.t.circle(10, 180)
      self.t.fd(20)

    # 左侧
    self.t.seth(-45)
    self.__goto(90 * sqrt(2), 200 - 110 * sqrt(2))  
    self.t.circle(20,270)
    self.__goto(-90 * sqrt(2), 200 - 110 * sqrt(2))
    self.t.circle(-20,270)
    
    # 右侧
    self.__goto(80 * sqrt(2), 200 - 120 * sqrt(2))
    self.t.circle(40,270)
    self.__goto(-80 * sqrt(2), 200 - 120 * sqrt(2))
    self.t.circle(-40,270)

5 绘制挂耳和流苏

def drawAdorn(self):
    # 上侧
    self.__goto(self.x, self.y)
    self.t.pensize(14)
    self.t.seth(90)
    self.t.fd(60)
    self.__goto(0,320)
    self.t.seth(180)
    self.t.circle(30,360)
    # 下侧
    self.__goto(0,200 - 200 * sqrt(2))
    self.t.pensize(40)
    self.t.seth(-90)
    self.t.fd(20)
    self.t.pensize(2)
    for i in range(11):
        self.__goto(-20 + 4 * i, 200 - 200 * sqrt(2))
        self.t.seth(-90)
        self.t.fd(200)

6 完整代码,一键运行

import turtle as t
from math import sqrt

class chineseKnot:
  '''
  * @breif: 中国结
  '''  
  def __init__(self) -> None:
    # 画笔初始化
    self.t = t
    self.t.pensize(10)
    self.t.setup(700, 700)
    self.t.pencolor("red")
    self.t.speed(14)
    # 结心坐标
    self.x = 0
    self.y = 200

  '''
  * @breif: 画中国结
  * @param[in]: None
  * @retval: None
  '''
  def drawKnot(self) -> None:
    self.drawBody()
    self.drawEdge()
    self.drawAdorn()
    self.t.hideturtle()
    self.t.done()

  '''
  * @breif: 画中国结主体部分
  * @param[in]: None
  * @retval: None
  '''
  def drawBody(self) -> None:
    for i in range(11):
        self.__goto(self.x - i * 10 * sqrt(2), self.y - i * 10 * sqrt(2))
        self.t.seth(-45)
        self.t.fd(200)
        self.__goto(self.x + i * 10 * sqrt(2), self.y - i * 10 * sqrt(2))
        self.t.seth(-135)
        self.t.fd(200)

  '''
  * @breif: 画中国结边缘部分
  * @param[in]: None
  * @retval: None
  '''       
  def drawEdge(self) -> None:
    for i in range(4):
      # 左上角
      self.__goto(-10 * sqrt(2) - i * 20 * sqrt(2),
                  200 - 10 * sqrt(2) - i * 20 * sqrt(2))
      self.t.seth(135)
      self.t.fd(20)
      self.t.circle(10, 180)
      self.t.fd(20)

      # 右上角
      self.__goto(10 * sqrt(2) + i * 20 * sqrt(2),
                  200 - 10 * sqrt(2) - i * 20 * sqrt(2))
      self.t.seth(45)
      self.t.fd(20)
      self.t.circle(-10, 180)
      self.t.fd(20)

      # 左下角
      self.__goto(-10 * sqrt(2) - i * 20 * sqrt(2),
                  200 - 190 * sqrt(2) + i * 20 * sqrt(2))
      self.t.seth(-135)
      self.t.fd(20)
      self.t.circle(-10, 180)
      self.t.fd(20)
       
      # 右下角
      self.__goto(10 * sqrt(2) + i * 20 * sqrt(2),
                  200 - 190 * sqrt(2) + i * 20 * sqrt(2))
      self.t.seth(-45)
      self.t.fd(20)
      self.t.circle(10, 180)
      self.t.fd(20)

    # 左侧
    self.t.seth(-45)
    self.__goto(90 * sqrt(2), 200 - 110 * sqrt(2))  
    self.t.circle(20,270)
    self.__goto(-90 * sqrt(2), 200 - 110 * sqrt(2))
    self.t.circle(-20,270)
    
    # 右侧
    self.__goto(80 * sqrt(2), 200 - 120 * sqrt(2))
    self.t.circle(40,270)
    self.__goto(-80 * sqrt(2), 200 - 120 * sqrt(2))
    self.t.circle(-40,270)

  '''
  * @breif: 画中国结装饰部分
  * @param[in]: None
  * @retval: None
  '''  
  def drawAdorn(self):
    # 上侧
    self.__goto(self.x, self.y)
    self.t.pensize(14)
    self.t.seth(90)
    self.t.fd(60)
    self.__goto(0,320)
    self.t.seth(180)
    self.t.circle(30,360)
    # 下侧
    self.__goto(0,200 - 200 * sqrt(2))
    self.t.pensize(40)
    self.t.seth(-90)
    self.t.fd(20)
    self.t.pensize(2)
    for i in range(11):
        self.__goto(-20 + 4 * i, 200 - 200 * sqrt(2))
        self.t.seth(-90)
        self.t.fd(200)

  '''
  * @breif: 画笔移动到指定位置
  * @param[in]: x -> 画笔移动位置横坐标
  * @param[in]: y -> 画笔移动位置纵坐标
  * @retval: None
  '''  
  def __goto(self, x: int, y: int) -> None:
    self.t.penup()
    self.t.goto(x,y)
    self.t.pendown()
        
if __name__ == '__main__':
  knot = chineseKnot()
  knot.drawKnot()

到此这篇关于通过Python绘制中国结的示例代码的文章就介绍到这了,更多相关Python绘制中国结内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。