boxmoe_header_banner_img

Hello!

加载中

文章导读

心形创意弹窗代码详解


avatar
genan 2025-11-05 58
import tkinter as tk  # 导入tkinter库并简称为tk,这是Python的标准GUI库

def createWindow():
    # 创建Tk类的实例 - 这是你的主窗口对象
    # 注意:Tk()是构造函数调用,不是普通函数
    window = tk.Tk()

    # 设置窗口标题 - 调用window对象的title方法
    window.title("这是我的第一个窗口")
    
    # 设置窗口大小和位置
    # "300x200"表示窗口宽300像素,高200像素
    # "+500+300"表示窗口距离屏幕左边界500像素,上边界300像素
    window.geometry("300x200+500+300")
    
    # 创建Label类的实例(标签对象)
    # text参数设置标签显示的文本内容
    label = tk.Label(window, text="这是一个标签")
    
    # 调用pack()方法进行布局管理
    # 没有这行,标签虽然存在但不会显示出来
    label.pack()

    # 启动GUI主事件循环
    # 这行代码让窗口保持显示状态,等待用户操作
    # 没有这行,窗口会瞬间闪退
    window.mainloop()

# 调用函数,实际创建并显示窗口
createWindow()

1、通过上述代码,即可实现第一步,弹窗,这个弹窗包括一个标题和文本内容,且在geometry中可以按需修改窗口的大小和位置。

2、接下来我们开始设计心形窗口的颜色和文字。需要达到的效果是每个弹窗都是随机的一句话,且背景颜色也不同,所以这里的逻辑是我们使用两个列表tips和colors来放置需要文字和颜色。

    # 随机文字
    tips = [
        "天冷多穿衣服", "多喝热水", "要吃热饭", "我想你了",
        "保持微笑~~~(^v^)~~~", "保持好心情呀", "好好爱自己", "梦想成真",
        "别熬夜", "所有的烦恼都消失", "身体倍儿棒", "吃嘛嘛香",
        "每天都要元气满满", "升职加薪!", "期待下次见面"
    ]

    # 随机颜色
    colors = [
        'lightpink', 'skyblue', 'lightgreen', 'lavender',
        'lightyellow', 'plum', 'coral', 'bisque', 'aquamarine',
        'mistyrose', 'honeydew', 'lavenderblush', 'oldlace'
    ]
    # 使用random模块的choice函数,从colors列表中随机抽取一个颜色值,并将结果赋值给color变量
    color = random.choice(colors)

    window.configure(background=color)
    label = tk.Label(
        window,
        text=random.choice(tips),
        bg=color,
        font=("微软雅黑", 16, "bold")
    )
    label.pack()

所以把这段放在createWindow的函数中,完整代码为:

def CreateWindow(x, y, root):
    """创建单个弹窗"""
    # 创建一个新窗口(Toplevel用于创建子窗口,Tk用于创建主窗口)
    window = tk.Toplevel()
    window.title("你好呀~")  # 设置窗口标题

    # 随机文字列表 - 包含各种温馨的提示语
    tips = [
        "天冷多穿衣服", "多喝热水", "要吃热饭", "我想你了",
        "保持微笑~~~(^v^)~~~", "保持好心情呀", "好好爱自己", "梦想成真",
        "别熬夜", "所有的烦恼都消失", "身体倍儿棒", "吃嘛嘛香",
        "每天都要元气满满", "升职加薪!", "期待下次见面"
    ]

    # 随机颜色列表 - 包含各种柔和的颜色
    colors = [
        'lightpink', 'skyblue', 'lightgreen', 'lavender',
        'lightyellow', 'plum', 'coral', 'bisque', 'aquamarine',
        'mistyrose', 'honeydew', 'lavenderblush', 'oldlace'
    ]
    color = random.choice(colors)  # 从颜色列表中随机选择一个颜色

    # 设置窗口的背景颜色
    window.configure(background=color)
    
    # 创建标签控件(用于显示文字)
    label = tk.Label(
        window,                    # 指定这个标签属于哪个窗口
        text=random.choice(tips),  # 从提示语列表中随机选择一条文字
        bg=color,                  # 设置标签背景颜色(与窗口背景相同)
        font=("微软雅黑", 16, "bold")  # 设置字体:微软雅黑,16号,粗体
    )
    label.pack()  # 将标签放置到窗口中(pack是简单的布局管理器)

3、接下来我们就要考虑如何让弹窗的轨迹形成一个♥的形状,这里需要引入一个python库math,需要用到♥形的函数,具体代码:

def heart_coordinates(num_points):
    """
    计算标准心形坐标
    知识点:使用参数方程计算心形曲线,t从0到2π均匀分布
    数学公式:x = 16 * sin³(t), y = 13*cos(t) - 5*cos(2t) - 2*cos(3t) - cos(4t)
    """
    points = []  # 创建空列表存储坐标点
    for i in range(num_points):
        # 将圆周等分为num_points份,t从0到2π均匀取值
        t = 2 * math.pi * i / num_points
        
        # 心形曲线的参数方程
        x = 16 * (math.sin(t) ** 3)  # x坐标计算
        y = 13 * math.cos(t) - 5 * math.cos(2 * t) - 2 * math.cos(3 * t) - math.cos(4 * t)  # y坐标计算
        
        points.append((x, y))  # 将坐标点以元组形式添加到列表中
    
    return points  # 返回所有坐标点的列表

4、然后我们就考虑如何让弹窗的轨迹连续形成一个心形了。以下是连续生成轨迹的代码:

def create_heart_sequence():
    """
    创建心形序列窗口 - 主控制函数
    知识点:使用after()实现定时器功能,nonlocal声明外部变量,递归调用实现循环
    """
    # 获取屏幕信息
    screen_width, screen_height = get_screen_resolution()
    print(f"屏幕分辨率: {screen_width}x{screen_height}")  # 打印分辨率信息

    # 计算心形坐标点
    points = heart_coordinates(60)  # 生成60个心形轨迹点

    # 创建隐藏的主控制窗口
    # 知识点:Tk()创建主窗口,withdraw()隐藏窗口
    root = tk.Tk()        # 创建主窗口对象(程序的核心)
    root.withdraw()       # 隐藏主窗口(不显示在屏幕上)

    current_index = 0  # 当前处理的坐标点索引

    def create_next_window():
        """
        递归函数:创建下一个窗口
        知识点:nonlocal声明使用外部函数的变量,after()实现延迟执行
        """
        nonlocal current_index  # 声明使用外部函数的current_index变量
        
        # 如果还有未处理的坐标点
        if current_index < len(points):
            x, y = points[current_index]  # 获取当前坐标点
            
            # 创建心形窗口
            create_heart_window(x, y, root, screen_width, screen_height)
            
            current_index += 1  # 移动到下一个坐标点
            
            # 知识点:after(毫秒数, 函数, 参数)实现定时器功能
            root.after(350, create_next_window)  # 350毫秒后再次调用自己
    
    # 立即开始生成序列
    # 知识点:after(100, create_next_window)表示100毫秒后开始执行
    root.after(100, create_next_window)  # 给程序初始化时间,然后开始创建窗口
    
    # 知识点:mainloop()启动GUI主事件循环,保持程序运行
    root.mainloop()  # 进入主循环,等待事件发生

总结:最后的主体代码为:

import tkinter as tk
import random
import math

tips = [
    "天冷多穿衣服", "多喝热水", "要吃热饭", "我想你了",
    "保持微笑~~~(^v^)~~~", "保持好心情呀", "好好爱自己", "梦想成真",
    "别熬夜", "所有的烦恼都消失", "身体倍儿棒", "吃嘛嘛香",
    "每天都要元气满满", "升职加薪!", "期待下次见面"
]

colors = [
    'lightpink', 'skyblue', 'lightgreen', 'lavender',
    'lightyellow', 'plum', 'coral', 'bisque', 'aquamarine',
    'mistyrose', 'honeydew', 'lavenderblush', 'oldlace'
]


def get_screen_resolution():
    """获取屏幕分辨率"""
    root = tk.Tk()
    root.withdraw()
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    root.destroy()
    return screen_width, screen_height


def heart_coordinates(num_points):
    """标准心形坐标"""
    points = []
    for i in range(num_points):
        t = 2 * math.pi * i / num_points
        x = 16 * (math.sin(t) ** 3)
        y = 13 * math.cos(t) - 5 * math.cos(2 * t) - 2 * math.cos(3 * t) - math.cos(4 * t)
        points.append((x, y))
    return points


def create_heart_window(x, y, root, screen_width, screen_height):
    """创建单个心形窗口"""
    # 坐标转换
    scale_factor = min(screen_width, screen_height) / 1500
    screen_x = int(x * 30 * scale_factor + screen_width / 2)
    screen_y = int(-y * 30 * scale_factor + screen_height / 2)

    # 创建窗口
    window = tk.Toplevel()
    window.title("你好呀~")
    window.geometry(f"250x100+{screen_x}+{screen_y}")

    # 随机选择颜色和文字
    color = random.choice(colors)
    text = random.choice(tips)

    # 设置窗口样式
    window.configure(background=color)
    label = tk.Label(
        window,
        text=text,
        bg=color,
        font=("微软雅黑", 16, "bold")
    )
    label.pack()

    # 绑定关闭事件
    def on_closing():
        root.destroy()
    window.protocol("WM_DELETE_WINDOW", on_closing)


def create_heart_sequence():
    """创建心形序列窗口"""
    # 获取屏幕信息
    screen_width, screen_height = get_screen_resolution()
    print(f"屏幕分辨率: {screen_width}x{screen_height}")

    # 计算心形坐标
    points = heart_coordinates(60)

    # 创建隐藏的主控制窗口
    root = tk.Tk()
    root.withdraw()

    current_index = 0

    def create_next_window():
        nonlocal current_index
        if current_index < len(points):
            x, y = points[current_index]
            create_heart_window(x, y, root, screen_width, screen_height)
            current_index += 1
            root.after(350, create_next_window)  # 350ms后创建下一个

    # 立即开始生成
    root.after(100, create_next_window)
    root.mainloop()


# 运行心形序列
create_heart_sequence()


评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码