当前位置:   article > 正文

python——开发2022年过年烟花小程序_龙年春节python

龙年春节python

一、更新库,确保你的pip为最新版

python -m pip install --upgrade pip

批量更新库的脚本可参考python——批量更新库的脚本_xiaofengdada的博客-CSDN博客

注:必须要更新,不然后会发现缺少模块却又下载不了。


二、编写脚本

此脚本放烟花必须要一个背景照片,就以我家大楼为例吧:

 脚本如下:

  1. import tkinter as tk
  2. from PIL import Image, ImageTk
  3. from time import time, sleep
  4. from random import choice, uniform, randint
  5. from math import sin, cos, radians
  6. # 重力变量
  7. GRAVITY = 0.5
  8. # listof colors,can choose randomly or use as queue(FIFO
  9. colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']
  10. '''
  11. create a class for particles粒子
  12. particles are emitted almost randomly on the sky,
  13. forming around(组成一个圈) of circle(a star)before falling and getting removed from canvas
  14. Attributes(属性):
  15. id:每个特定烟花的标识符
  16. x,y:烟花的绽放坐标
  17. vx,vy:烟花的绽放速度
  18. total:一颗烟花里的星星总数
  19. age:一颗星星会在画布上停留多久
  20. color:自我移植
  21. cv:画布
  22. lifespan:星星在画布上停留的最后时间
  23. '''
  24. class part: # 为每一个烟花绽放出来的粒子单独构建一个类的对象
  25. def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx=0., vy=0., size=2., color='red', lifespan=2,
  26. **kwargs):
  27. self.id = idx # 每个烟花的特定标识符
  28. self.x = x # 烟花的绽放x轴
  29. self.y = y # 烟花的绽放x轴
  30. self.initial_speed = explosion_speed # 初速度
  31. self.vx = vx # 外放x轴速度
  32. self.vy = vy # 外放y轴速度
  33. self.total = total # 绽放的粒子数
  34. self.age = 0 # 已停留时间
  35. self.color = color # 颜色
  36. self.cv = cv # 画布
  37. self.cid = self.cv.create_oval(x - size, y - size, x + size, y + size,
  38. fill=self.color) # create_oval()创建一个椭圆,参数为左上x,左上y,右下x,右下y,填满的颜色,该函数返回一个id
  39. self.lifespan = lifespan # 应该停留时间
  40. def update(self, dt): # 更新数据,已停留时间增加
  41. self.age += dt
  42. # 粒子膨胀
  43. if self.alive() and self.expand(): # 如果停留时间(2s)足够&&膨胀时间(1.2s)足够
  44. move_x = cos(radians(self.id * 360 / self.total)) * self.initial_speed # 粒子的x轴继续膨胀
  45. move_y = sin(radians(self.id * 360 / self.total)) * self.initial_speed # 粒子的y轴继续膨胀
  46. self.cv.move(self.cid, move_x, move_y) # 根据id把画布上的粒子移动x和y个距离
  47. self.vx = move_x / (float(dt) * 1000)
  48. # 以自由落体坠落
  49. elif self.alive(): # 如果只是停留时间足够,说明膨胀到最大了,应该准备下坠
  50. move_x = cos(radians(self.id * 360 / self.total)) # x轴继续膨胀
  51. self.cv.move(self.cid, self.vx + move_x, self.vy + GRAVITY * dt) # 而y轴按照重力因素做落体运动,但实际上这个重力是v而不是a
  52. self.vy += GRAVITY * dt # 更新一下y轴
  53. elif self.cid is not None: # 如果粒子的生命周期已过,就将其移除
  54. cv.delete(self.cid) # 删除该粒子对象
  55. self.cid = None
  56. # 定义膨胀效果的时间帧
  57. def expand(self):
  58. return self.age <= 1.2 # 膨胀时间小于1.2s
  59. # 检查粒子是否仍在生命周期内
  60. def alive(self): # 已停留时间是不是比应该停留时间短
  61. return self.age <= self.lifespan
  62. '''
  63. 烟花模拟回路:
  64. 递归调用来在画布上重复发出新的烟火
  65. 通过每个“部件”对象内部的更新协议,每次调用时都要在画布上创建并绘制列表(星列表,每个星列表成员都是粒子列表)来重复地在画布上发出新的焰火
  66. '''
  67. # 生成新的一轮爆炸
  68. def simulate(cv):
  69. t = time() # time()函数返回自1970年后经过的浮点秒数,精确到小数点后6位
  70. explode_points = [] # 爆炸点列表--烟花列表
  71. wait_time = randint(10, 100) # 随机生成一个int n,10<=n<=100
  72. numb_explode = randint(6, 10) # 爆炸的个数是6~10
  73. # 为所有模拟烟花绽放的全部例子创建一列列表
  74. for point in range(numb_explode): # 遍历爆炸的个数
  75. objects = [] # 这是每个点的爆炸粒子列表
  76. x_cordi = randint(50, 550) # 每个点的爆炸x轴
  77. y_cordi = randint(50, 150) # 爆炸y轴
  78. speed = uniform(0.5, 1.5) # 随机生成一个float speed,0.5<=speed<1.5
  79. size = uniform(0.5, 3) # 随机生成一个float size,0.5<=size<3
  80. color = choice(colors) # choice()是python内置函数,随机返回元组,列表,或字符串的一个成员
  81. explosion_speed = uniform(0.2, 1) # 爆炸的绽放速度也要随机出来
  82. total_particles = randint(10, 50) # 爆炸出来的粒子数半径也随机
  83. for i in range(1, total_particles): # 同一个烟花爆炸出来的粒子的大小,速度,坐标都是相同的
  84. r = part(cv, idx=i, total=total_particles, explosion_speed=explosion_speed, x=x_cordi, y=y_cordi,
  85. vx=speed, vy=speed, color=color, size=size,
  86. lifespan=uniform(0.6, 1.75)) # 把上述参数带入,但他们每个粒子的生存时间是自己独立的
  87. objects.append(r) # 添加进粒子列表里
  88. explode_points.append(objects) # 把该粒子列表添加进烟花列表里
  89. total_time = .0 # 先把时间置0
  90. # 在1.8秒时间帧内保持更新
  91. while total_time < 1.8:
  92. sleep(0.01) # 让画面暂停0.01s
  93. tnew = time() # 刷新时间
  94. t, dt = tnew, tnew - t # 时间等于新时间,与上次时间间隔为tnew-t
  95. for point in explode_points: # 遍历烟花列表
  96. for item in point: # 遍历烟花里的粒子列表
  97. item.update(dt) # 更新时间
  98. cv.update() # 刷新页面
  99. total_time += dt # 为上面的while循环增加时间
  100. root.after(wait_time, simulate, cv) # 将组件置于其他组件之后,就是放在最顶层,覆盖下面的,这里递归第哦啊用了自己,形成新的一轮爆炸
  101. def close(*ignore):
  102. # 打开模拟循环并关闭窗口
  103. global root
  104. root.quit()
  105. if __name__ == "__main__":
  106. root = tk.Tk()
  107. cv = tk.Canvas(root, height=500, width=500) # 绘制一个画布
  108. # 绘制一个黑色背景
  109. # cv.create_rectangle(0,0,600,600,fill="black")
  110. # use a nice background image
  111. image = Image.open("4.png")
  112. photo = ImageTk.PhotoImage(image)
  113. cv.create_image(0, 0, image=photo, anchor='nw') # 在画板上绘制一张图片
  114. cv.pack() # 把cv添加进去
  115. root.protocol("WM_DELETE_WINDOW", close)
  116. # 在0.1s后才开始调用stimulate()
  117. root.after(100, simulate, cv) # 调用stimulate生成一轮烟花绽放效果
  118. root.mainloop() # 执行root,生成窗口
  119. # 让我更加明白了python的一切皆对象

三、编写成春联小程序

(一)先给软件选择一个好看一点的图标ico

ICO图标在线生成

 (二)使用pyinstaller工具,对其进行编译

pyinstaller.exe -F -i .\烟花小程序.ico .\烟花.py

(三)编译成功,直接去dist文件夹查看该小程序,并运行它 

 烟花小程序就编写完毕啦,在此小编提前祝大家新年快乐,虎虎生威!

python——开发2022年虎年春联小程序_xiaofengdada的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/74604
推荐阅读
相关标签
  

闽ICP备14008679号