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)
暂无评论