效果如视频

生日蛋糕+彩色旋转文字祝福

声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

彩色旋转文字-CSDN博客文章浏览阅读193次。这篇文章介绍了如何利用Python的Turtle库创建一个彩色动态图形,通过wuxing函数实现劳动节快乐的字样旋转并随机着色,展示了基础的IT图形处理技术。 https://blog.csdn.net/skhoole/article/details/138357710?fromshare=blogdetail&sharetype=blogdetail&sharerId=138357710&sharerefer=PC&sharesource=skhoole&sharefrom=from_link用Python画一个生日蛋糕_python画蛋糕,生日快乐-CSDN博客文章浏览阅读1.4w次,点赞47次,收藏354次。朋友的生日到了,疫情原因封在学校里,不能线下庆祝的话,那就画一个生日蛋糕给她。_python画蛋糕,生日快乐 https://blog.csdn.net/m0_46207115/article/details/124093010?fromshare=blogdetail&sharetype=blogdetail&sharerId=124093010&sharerefer=PC&sharesource=skhoole&sharefrom=from_link和deepseek对话了一个下午+晚上,把两个功能合并起来了

代码如下:

# -*- coding: utf-8 -*-
"""
Created on Sun Feb 23 19:29:25 2025

@author: 破无差
"""
# -*- coding: utf-8 -*-
import turtle as t
import math
import random
import time
t.colormode(255)
class BirthdayAnimation:
    def __init__(self):
        self.screen = t.Screen()
        self.screen.setup(800, 1000)  # 加大窗口尺寸
        self.screen.bgcolor("#d3dae8")
        self.screen.tracer(0)
        
        # 创建两个独立画笔
        self.cake_pen = t.Turtle()    # 蛋糕画笔
        self.text_pen = t.Turtle()   # 文字画笔
        
        # 初始化画笔
        self.cake_pen.hideturtle()
        self.cake_pen.speed(0)
        
        self.text_pen.hideturtle()
        self.text_pen.penup()
        self.text_pen.speed(0)
        self.text_pen.goto(0, 280)    # 初始文字位置

    #---------- 蛋糕绘制部分 (修改所有t->self.cake_pen) ----------#
    def drawX(self, a, i):
        angle = math.radians(i)
        return a * math.cos(angle)

    def drawY(self, b, i):
        angle = math.radians(i)
        return b * math.sin(angle)

    def layer_0(self):
        self.cake_pen.pencolor("white")
        self.cake_pen.fillcolor("#fef5f7")
        self.cake_pen.penup()
        self.cake_pen.goto(150, 0)
        self.cake_pen.pendown()
        
        self.cake_pen.begin_fill()
        for i in range(180):
            x = self.drawX(150, i)
            y = self.drawY(-60, i)-120
            self.cake_pen.goto(x, y)
        self.cake_pen.goto(x, y+120)

        for i in range(180):
            x = self.drawX(-150, i)
            y = self.drawY(60, i)
            self.cake_pen.goto(x, y)
        self.cake_pen.end_fill()

        # 顶部奶油
        self.cake_pen.pencolor("#f2d7dd")
        self.cake_pen.begin_fill()
        for i in range(360):
            x = self.drawX(150, i)
            y = self.drawY(60, i)
            self.cake_pen.goto(x, y)
        self.cake_pen.fillcolor("#f2d7dd")
        self.cake_pen.end_fill()

        # 下溢奶油
        self.cake_pen.begin_fill()
        self.cake_pen.pensize(4)
        self.cake_pen.pencolor("#f2d7dd")
        for i in range(1800):
            x = self.drawX(150, 0.1 * i)
            y = self.drawY(-20, i) - 85
            self.cake_pen.goto(x, y)
        self.cake_pen.goto(-150, 0)
        self.cake_pen.pensize(1)
        for i in range(0, 180):
            x = self.drawX(-150, i)
            y = self.drawY(-60, i)
            self.cake_pen.goto(x, y)
        self.cake_pen.fillcolor("#f2d7dd")
        self.cake_pen.end_fill()

    def layer_1(self):
        # 第二层底层
        self.cake_pen.pencolor("#ffa79d")
        self.cake_pen.penup()
        self.cake_pen.goto(120, 0)
        self.cake_pen.pendown()
        
        self.cake_pen.begin_fill()
        for i in range(360):
            x = self.drawX(120, i)
            y = self.drawY(48, i)
            self.cake_pen.goto(x, y)
        self.cake_pen.fillcolor("#ffa79d")
        self.cake_pen.end_fill()

        self.cake_pen.begin_fill()
        for i in range(180):
            x = self.drawX(120, i)
            y = self.drawY(48, i) + 70
            self.cake_pen.goto(x, y)
        self.cake_pen.goto(-120, 0)
        self.cake_pen.end_fill()

        # 蓝色浇头
        self.cake_pen.penup()
        self.cake_pen.goto(120, 70)
        self.cake_pen.pendown()
        self.cake_pen.pencolor('#cbd9f9')
        self.cake_pen.fillcolor("#cbd9f9")
        self.cake_pen.begin_fill()
        for i in range(360):
            x = self.drawX(120, i)
            y = self.drawY(48, i) + 70
            self.cake_pen.goto(x, y)
        self.cake_pen.end_fill()
        
                # 蓝色中心为顶向下浇浇头
        self.cake_pen.begin_fill()
        self.cake_pen.pensize(8)
        self.cake_pen.goto(120, 70)
        for s in range(0, 12):  # 相当于涂抹糕身的特效
            for i in range(180):
                x = self.drawX(120, i)
                y = self.drawY(-48, i) + 70-5*s
                self.cake_pen.goto(x, y)
            for i in range(180):
                x = self.drawX(-120, i)
                y = self.drawY(-48, i)+70-5.1*s
                self.cake_pen.goto(x, y)
        
        
        # 白色涂层
        self.cake_pen.penup()
        self.cake_pen.goto(120, 70)
        self.cake_pen.pendown()
        self.cake_pen.pencolor("#fff0f3")
        self.cake_pen.fillcolor("#fff0f3")
        self.cake_pen.begin_fill()
        for i in range(360):
            x = self.drawX(120, i)
            y = self.drawY(48, i) + 70
            self.cake_pen.goto(x, y)
        self.cake_pen.end_fill()
        
        # 蓝色蛋糕的顶面白色涂层里的涂层
        self.cake_pen.penup()
        self.cake_pen.goto(110, 70)
        self.cake_pen.pendown()
        self.cake_pen.pencolor("#fff9fb")
        self.cake_pen.begin_fill()
        for i in range(360):
            x = self.drawX(110, i)
            y = self.drawY(44, i) + 70
            self.cake_pen.goto(x, y)
        self.cake_pen.fillcolor("#fff9fb")
        self.cake_pen.end_fill()
        
        # 第二层蛋糕圆弧部分(类似于瀑布蛋糕)
        self.cake_pen.penup()
        self.cake_pen.goto(120, 70)
        self.cake_pen.pendown()
        self.cake_pen.begin_fill()
        self.cake_pen.pensize(4)
        self.cake_pen.pencolor("#fff0f3")
        for i in range(1800):
            x = self.drawX(120, 0.1 * i)
            y = self.drawY(-18, i) + 10
            self.cake_pen.goto(x, y)
        self.cake_pen.goto(-120, 70)
        self.cake_pen.pensize(1)
        for i in range(180, 360):
            x = self.drawX(120, i)
            y = self.drawY(48, i) + 70
            self.cake_pen.goto(x, y)
        self.cake_pen.fillcolor("#fff0f3")
        self.cake_pen.end_fill()
        
        # 蓝色蛋糕的顶面白色涂层里的涂层
        self.cake_pen.penup()
        self.cake_pen.goto(110, 70)
        self.cake_pen.pendown()
        self.cake_pen.pencolor("#fff9fb")
        self.cake_pen.begin_fill()
        for i in range(360):
            x = self.drawX(110, i)
            y = self.drawY(44, i) + 70
            self.cake_pen.goto(x, y)
        self.cake_pen.fillcolor("#fff9fb")
        self.cake_pen.end_fill()
        
        # 第二层蛋糕圆弧部分(类似于瀑布蛋糕)
        self.cake_pen.penup()
        self.cake_pen.goto(120, 70)
        self.cake_pen.pendown()
        self.cake_pen.begin_fill()
        self.cake_pen.pensize(4)
        self.cake_pen.pencolor("#fff0f3")
        for i in range(1800):
            x = self.drawX(120, 0.1 * i)
            y = self.drawY(-18, i) + 10
            self.cake_pen.goto(x, y)
        self.cake_pen.goto(-120, 70)
        self.cake_pen.pensize(1)
        for i in range(180, 360):
            x = self.drawX(120, i)
            y = self.drawY(48, i) + 70
            self.cake_pen.goto(x, y)
        self.cake_pen.fillcolor("#fff0f3")
        self.cake_pen.end_fill()
        

    def layer_2(self):
        # 第三层
        self.cake_pen.pencolor("#6f3732")
        self.cake_pen.penup()
        self.cake_pen.goto(80, 70)
        self.cake_pen.pendown()
        
        self.cake_pen.begin_fill()
        self.cake_pen.goto(80, 120)
        for i in range(180):
            x = self.drawX(80, i)
            y = self.drawY(32, i) + 120
            self.cake_pen.goto(x, y)
        self.cake_pen.goto(-80, 70)
        for i in range(180, 360):
            x = self.drawX(80, i)
            y = self.drawY(32, i) + 70
            self.cake_pen.goto(x, y)
        self.cake_pen.fillcolor("#6f3732")
        self.cake_pen.end_fill()
        
        # 棕色蛋糕的表面涂层
        self.cake_pen.penup()
        self.cake_pen.goto(80, 120)
        self.cake_pen.pendown()
        self.cake_pen.pencolor("#ffaaa0")
        self.cake_pen.begin_fill()
        for i in range(360):
            x = self.drawX(80, i)
            y = self.drawY(32, i) + 120
            self.cake_pen.goto(x, y)
        self.cake_pen.fillcolor("#ffaaa0")
        self.cake_pen.end_fill()
        
        # 涂层内圈
        self.cake_pen.penup()
        self.cake_pen.goto(70, 120)
        self.cake_pen.pendown()
        self.cake_pen.pencolor("#ffc3be")
        self.cake_pen.begin_fill()
        for i in range(360):
            x = self.drawX(70, i)
            y = self.drawY(28, i) + 120
            self.cake_pen.goto(x, y)
        self.cake_pen.fillcolor("#ffc3be")
        self.cake_pen.end_fill()
        
        # 第二层涂层圆弧部分(类似于瀑布蛋糕)
        self.cake_pen.penup()
        self.cake_pen.goto(80, 120)
        self.cake_pen.pendown()
        self.cake_pen.begin_fill()
        self.cake_pen.pensize(3)
        self.cake_pen.pencolor("#ffaaa0")
        for i in range(1800):
            x = self.drawX(80, 0.1 * i)
            y = self.drawY(-12, i) + 80
            self.cake_pen.goto(x, y)
        self.cake_pen.goto(-80, 120)
        self.cake_pen.pensize(1)
        for i in range(180, 360):
            x = self.drawX(80, i)
            y = self.drawY(32, i) + 120
            self.cake_pen.goto(x, y)
        self.cake_pen.fillcolor("#ffaaa0")
        self.cake_pen.end_fill()

    def candle_part(self):
        # 蜡烛
        self.cake_pen.penup()
        self.cake_pen.goto(0, 120)
        self.cake_pen.pendown()
        self.cake_pen.pencolor("#b1c9e9")
        self.cake_pen.begin_fill()
        for i in range(360):
            x = self.drawX(4, i)
            y = self.drawY(1, i) + 130
            self.cake_pen.goto(x, y)
        self.cake_pen.goto(4, 180)
        for i in range(540):
            x = self.drawX(4, i)
            y = self.drawY(1, i) + 180
            self.cake_pen.goto(x, y)
        self.cake_pen.goto(-4, 130)
        self.cake_pen.fillcolor("#b1c9e9")
        self.cake_pen.end_fill()
        # 蜡烛的白色线条
        self.cake_pen.pencolor("white")
        self.cake_pen.pensize(2)
        for i in range(1, 6):
            self.cake_pen.goto(4, 130 + 10 * i)
            self.cake_pen.penup()
            self.cake_pen.goto(-4, 130 + 10 * i)
            self.cake_pen.pendown()
        self.cake_pen.penup()
        self.cake_pen.goto(0, 180)
        self.cake_pen.pendown()
        self.cake_pen.goto(0, 190)
        self.cake_pen.pensize(1)
        self.cake_pen.penup()
        self.cake_pen.goto(4, 200)
        self.cake_pen.pendown()
        
        # 火焰部分
        self.cake_pen.pencolor("#F160AD")
        self.cake_pen.begin_fill()
        for i in range(360):
            ii = random.randint(0, 1)  # 模拟火焰大小随机形状
            if ii == 0:
                x = self.drawX(4, i) + random.random()
            else:
                x = self.drawX(4, i) - random.random()
            y = self.drawY(10, i) + 200
            self.cake_pen.goto(x, y)
        self.cake_pen.fillcolor("#F160AD")
        self.cake_pen.end_fill()
    
        # 随机星星点点
    def writing(self):
        color = ["#e28cb9", "#805a8c", "#eaa989", "#6e90b7", "#b8b68f", "#e174b5", "#cf737c", "#7c8782"]
        
     # 棕色蛋糕部分
        for i in range(20):  # 个人私设的小彩蛋,Ta的生日多大就有多少个小星星
            self.cake_pen.penup()
            x = random.randint(-80, 80)
            y = random.randint(60, 90)
            self.cake_pen.goto(x, y)
            self.cake_pen.pendown()
            self.cake_pen.dot(random.randint(2, 5), color[random.randint(0, 7)])
    
        # 背景板的星星点点(可加可不加)
        for i in range(50):
            self.cake_pen.penup()
            x = random.randint(-500, 500)
            y = random.randint(150, 300)
            self.cake_pen.goto(x, y)
            self.cake_pen.pendown()
            self.cake_pen.dot(random.randint(3, 5), color[random.randint(0, 7)])
    
        self.cake_pen.setheading(90)
        self.cake_pen.penup()
        self.cake_pen.goto(0, 0)
        self.cake_pen.forward(210)
        self.cake_pen.left(90)
        self.cake_pen.forward(200)
        self.cake_pen.pendown()
    #---------- 文字动画部分 ----------#
    def rotating_text(self):
        angle = 0  # 初始角度
        text = "祝XXX生日快乐!"  # 中文文字
        center_x, center_y = 0, -20  # 圆心坐标
        radius = 250  # 旋转半径

        while True:
            self.text_pen.clear()  # 清除上一帧的文字
            self.text_pen.penup()
            
            # 计算每个字符的位置
            for i, char in enumerate(text):
                # 计算当前字符的角度
                char_angle = angle - (i * 360 / len(text))  # 均匀分布字符 -是顺时针
                char_angle_rad = math.radians(char_angle)  # 转换为弧度
                
                # 计算字符的坐标
                x = center_x + radius * math.cos(char_angle_rad)
                y = center_y + radius * math.sin(char_angle_rad)
                
                # 移动到字符位置
                self.text_pen.goto(x, y)
                self.text_pen.setheading(char_angle + 90)  # 调整字符朝向
                
                # 随机颜色
                r = random.randint(100, 255)
                g = random.randint(100, 255)
                b = random.randint(100, 255)
                self.text_pen.pencolor(r, g, b)
                
                # 绘制字符
                self.text_pen.write(char, align="center", font=("楷体", 50, "bold"))
            
            self.screen.update()  # 更新屏幕
            time.sleep(0.05)  # 控制刷新速度
            angle += 3  # 控制旋转速度 -是顺时针

    def run(self):
        # 先绘制蛋糕
        self.layer_0()
        self.layer_1()
        self.layer_2()
        self.candle_part()
        self.screen.update()
        self.cake_pen.penup()
        self.cake_pen.goto(200,-350)
        self.cake_pen.write("————XXX 年月日")
        self.writing()
        # 再启动文字动画
        self.rotating_text()

if __name__ == '__main__':
   
    animation = BirthdayAnimation()
    animation.run()
    t.done()

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐