Python基础教程——用Python写一个流星雨!(附源码)

2024-01-08 18:54:11

“流星雨是世间宝藏,而你是我的人间理想”
写在前面
冲鸭,冬鱼带你一起去看流星雨!这里有蓝色系和粉色系的流星雨,小伙伴们喜欢蓝色系的流星雨,还是粉色系的流星雨呢?当然啦,也可以改成你喜欢的颜色哦,一起来看看吧~

环境:Python

软件:PyCharm

详细分析

这是一个用 Python 语言编写的爱情表白程序,包含两个部分,一个是流星雨动画,另一个是表白窗口。用户可以选择同意或拒绝表白,如果同意,就会看到一个流星雨动画,如果拒绝,则需要再次选择,直到同意为止。下面对程序进行详细分析:

1.导入库和模块

程序中使用了 turtle 库、random 库、tkinter 库和 math 库。turtle 库用于绘制流星,random 库用于生成随机数,tkinter 库用于实现表白窗口,math 库用于计算弧度。

2.定义流星类

定义了一个 Star 类用于描述流星的属性和行为。在初始化函数中,随机生成了流星的初始位置、大小、颜色、速度和角度等属性。在 star 函数中实现了绘制流星的具体过程,使用 turtle 库中的函数在画布上绘制流星。在 move 函数中实现了流星的运动轨迹,使流星向下和向右方向移动,并且当流星超出画布边界时,重新生成流星的位置和属性。

3.生成所有流星

生成一个包含 100 个流星的列表,每个流星的属性随机生成。

4.绘制流星雨

使用 while 循环实现流星雨的动画效果,每次循环清空画布,并绘制所有流星的运动轨迹和形状,然后更新画布,使其显示出来。

5.定义爱情表白窗口

使用 tkinter 库实现一个简单的表白窗口,包含一段文字和两个按钮:同意和拒绝。当点击同意按钮时,窗口关闭,跳转到流星雨动画界面。如果点击拒绝按钮,则弹出提示框,提醒用户再次选择。

6.绑定退出事件

使用 protocol() 函数绑定了退出事件,当点击窗口的关闭按钮时,弹出提示框,让用户再次确认是否退出程序。

总体来说,这个流星雨程序使用了多个库和模块,实现了流星雨动画和表白窗口的效果,并实现了一些交互功能,带来了一些新鲜和有趣的体验。

运行结果

蓝色流星雨

粉色流星雨

完整代码


import turtle as tu
import random as ra
import tkinter as tk
import math
def Meteors():
    tu.setup(1.0, 1.0)
    tu.screensize(1.0, 1.0)    #设置画布大小
    tu.bgcolor('black')  #设置画布颜色
    tu.title("流星雨")
    t = tu.Pen()
    t.hideturtle()               #隐藏画笔
    # colors = ['skyblue', 'white', 'cyan', 'aqua']   #流星的颜色列表,蓝色
    colors = ['pink', 'lightpink', 'deeppink']  #粉色
    class Star():    #流星类
        def __init__(self):
            self.r = ra.randint(50,100)
            self.t = ra.randint(1,3)
            self.x = ra.randint(-2000,1000)   #流星的横坐标
            self.y = ra.randint(444, 999)  #流星的纵坐标
            self.speed = ra.randint(5,10)     #流星移动速度
            self.color = ra.choice(colors)    #流星的颜色
            self.outline = 1                 #流星的大小
        def star(self):                #画流星函数
            t.pensize(self.outline)    #流星的大小
            t.penup()                  #提笔
            t.goto(self.x,self.y)      #随机位置
            t.pendown()                #落笔
            t.color(self.color)
            t.begin_fill()
            t.fillcolor(self.color)
            t.setheading(-30)
            t.right(self.t)
            t.forward(self.r)
            t.left(self.t)
            t.circle(self.r*math.sin(math.radians(self.t)),180)
            t.left(self.t)
            t.forward(self.r)
            t.end_fill()
        def move(self):                    #流星移动函数
            if self.y >= -500:            #当流星还在画布中时
                self.y -= self.speed     #设置上下移动速度
                self.x += 2*self.speed   #设置左右移动速度
            else:
                self.r = ra.randint(50,100)
                self.t = ra.randint(1,3)
                self.x = ra.randint(-2000,1000)
                self.y = 444
                self.speed = ra.randint(5,10)
                self.color = ra.choice(colors)
                self.outline = 1
    Stars = []            #用列表保存所有流星
    for i in range(100):
        Stars.append(Star())
    while True:           #开始绘制
        tu.tracer(0)
        t.clear()
        for i in range(100):    #80个流星
            Stars[i].move()
            Stars[i].star()
        tu.update()
    tu.mainloop()

def love():
    root = tk.Tk()
    root.title('?')
    root.resizable(0, 0)
    root.wm_attributes("-toolwindow", 1)
    screenwidth = root.winfo_screenwidth()
    screenheight = root.winfo_screenheight()
    widths = 300
    heights = 100
    x = (screenwidth - widths) / 2
    y = (screenheight - heights) / 2
    root.geometry('%dx%d+%d+%d' % (widths, heights, x, y))  # 设置在屏幕中居中显示
    tk.Label(root, text='亲爱的,做我女朋友好吗?', width=37, font=('宋体', 12)).place(x=0, y=10)


    def OK():  # 同意按钮
        root.destroy()
        # 同意后显示相应的效果
        Meteors()

    def NO():  # 拒绝按钮,拒绝不会退出,必须同意才可以退出哦~
        tk.messagebox.showwarning('?', '再给你一次机会!')


    def closeWindow():
        tk.messagebox.showwarning('?', '逃避是没有用的哦')


    tk.Button(root, text='好哦', width=5, height=1, command=OK).place(x=80, y=50)
    tk.Button(root, text='不要', width=5, height=1, command=NO).place(x=160, y=50)
    root.protocol('WM_DELETE_WINDOW', closeWindow)  # 绑定退出事件
    root.mainloop()

if __name__ == "__main__":
    love()

最后这里免费分享给大家一份Python学习资料,包含视频、源码。课件,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
编程资料、学习路线图、源代码、软件安装包等!

看下方图片哦(掉落)↓↓↓

Python所有方向的学习路线图,清楚各个方向要学什么东西
100多节Python课程视频,涵盖必备基础、爬虫和数据分析
100多个Python实战案例,学习不再是只会理论
华为出品独家Python漫画教程,手机也能学习
历年互联网企业Python面试真题,复习时非常方便****

在这里插入图片描述

文章来源:https://blog.csdn.net/2301_78217634/article/details/135461934
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。