• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

放烟花的python程序

武飞扬头像
学习ing的小豫
帮助1

一.前言

重点:需要打包后的程序可以直接评论区留言或者私聊我,无需编程直接使用。

2023春节期间做的烟花程序,支持一定的个性化设置,已打包上传在我的资源。主要学习其它大神的烟花代码,后续自己做了改进和添加,对于烟花代码部分有详细的注释,后面用tkinter做了用户操作界面。按1随机生成1个烟花,按2随机生成10个烟花,鼠标点击在鼠标位置生成一个烟花。登录界面账号密码分别为新年快乐,岁岁平安。如果删除了一些重要文件,或者一些别的问题,程序会报错具体问题。这篇文章中已经包含了全部代码,可以供大家学习交流。

二.效果展示

学新通

 学新通

 学新通

三.代码

功能介绍一下:

1.可以加载自己的图片作为背景图片,屏幕框会根据图片自适应改变大小。但是路径只能用/,其实可以改输入为原生字符串,但是都已经打包了,懒得改代码了。

2.帧率设置,这个主要是看配置,卡的话可以降低一点。

3.文字设置,就是可以把屏幕中的主标题和副标题设置显示或者隐藏,也可以改变为自己想要的文字。

4.自动烟花,除了手动键盘生成烟花和鼠标点击生成烟花,还会自动随机生成烟花,可以通过关闭自动放烟花,或者改变自动放烟花的频率。

具体参数设置可以点击说明,获取提示信息。

导入背景图片其实可以用原生字符串改进一下,但是由于我已经打包了程序,所以这里就不改了

用到的库

  1.  
    # by惜豫
  2.  
    import imagesize
  3.  
    import pygame
  4.  
    from random import randint, uniform, choice
  5.  
    import math
  6.  
    from tkinter import *
  7.  
    import tkinter.messagebox

全局变量等

其中有一个???,请替换为password,这里我写成???是因为博客发文助手觉得有风险

  1.  
     
  2.  
    vector = pygame.math.Vector2 # 向量类引入
  3.  
    fps = 60 # 帧率
  4.  
    switch_T = 0 # 自动放烟花开关,0为开,1为关
  5.  
    T = 0.25 # 自动放烟花周期
  6.  
    user = '新年快乐' # 账号
  7.  
    ??? = '岁岁平安' # 密码
  8.  
    text1 = '新春快乐' # 主文字
  9.  
    len_text1 = 4 # 主文字长度
  10.  
    text2 = 'by:惜豫' # 副文字
  11.  
    bg = "img/bg.jpg" # 背景路径
  12.  
    try:
  13.  
    DISPLAY_WIDTH, DISPLAY_HEIGHT = imagesize.get(bg) # 屏幕宽高
  14.  
    except:
  15.  
    tkinter.messagebox.showerror('提示', '找不到系统背景文件,请确保文件不被删除或修改后重新尝试!')
  16.  
    gravity = vector(0, 0.3*DISPLAY_HEIGHT/800) # 重力向量
  17.  
    launch = 'launch.mp3' # 发射声
  18.  
    explode = 'explode.mp3' # 爆炸声
  19.  
     
  20.  
    trail_colours = [(45, 45, 45), (60, 60, 60), (75, 75, 75), (125, 125, 125), (150, 150, 150)] # 飞行路径(尾迹)颜色参数
  21.  
    dynamic_offset = 1 # 爆炸前产生尾迹需要的时间
  22.  
    static_offset = 3 # 爆炸后产生尾迹需要的时间
学新通

烟花类

  1.  
    # 烟花
  2.  
    class Firework:
  3.  
    # 初始化
  4.  
    def __init__(self):
  5.  
    # 随机颜色 颜色变量为元组
  6.  
    self.colour = (randint(0, 255), randint(0, 255), randint(0, 255)) # 产生一种随机颜色作为烟花爆炸前的烟花粒子颜色(升空)
  7.  
    self.colours = (
  8.  
    (randint(0, 255), randint(0, 255), randint(0, 255)),
  9.  
    (randint(0, 255), randint(0, 255), randint(0, 255)),
  10.  
    (randint(0, 255), randint(0, 255), randint(0, 255))
  11.  
    ) # 产生三种随机颜色作为颜色爆炸后的烟花粒子颜色
  12.  
    self.firework = Particle(randint(0, DISPLAY_WIDTH), DISPLAY_HEIGHT, True,
  13.  
    self.colour) # 创造一个烟花粒子
  14.  
    self.exploded = False # 是否已爆炸
  15.  
    self.particles = [] # 爆炸后的烟花粒子
  16.  
    self.min_particles = 100 # 爆炸烟花粒子数量区间最小值
  17.  
    self.max_particles = 225 # 爆炸烟花粒子数量区间最大值
  18.  
    self.launch_mp3 = pygame.mixer.Sound(launch)
  19.  
    self.explode_mp3 = pygame.mixer.Sound(explode)
  20.  
     
  21.  
    # 更新烟花,即绘制该烟花的所有粒子,及更新烟花粒子的状态参数(如是否消失而该被移除)
  22.  
    def update(self, win):
  23.  
    # 未爆炸情况
  24.  
    if not self.exploded:
  25.  
    if self.firework.life == 0:
  26.  
    self.launch_mp3.play()
  27.  
    self.firework.apply_force(gravity) # 为烟花粒子添加重力
  28.  
    self.firework.move() # 移动烟花粒子位置
  29.  
    # 遍历烟花粒子的全部尾迹粒子
  30.  
    for tf in self.firework.trails:
  31.  
    tf.show(win) # 绘制尾迹粒子
  32.  
     
  33.  
    self.show(win) # 绘制烟花粒子
  34.  
     
  35.  
    # 达到最高点(速度从初始方向衰减到0或指向地面)
  36.  
    if self.firework.vel.y >= 0:
  37.  
    self.exploded = True # 爆炸判断参数修改
  38.  
    self.explode() # 烟花爆炸
  39.  
    # 爆炸后情况
  40.  
    else:
  41.  
    # 遍历爆炸产生的烟花粒子
  42.  
    for particle in self.particles:
  43.  
    # 添加一定比例的爆炸的冲击力和重力,y轴方向上力始终为指向地面方向
  44.  
    particle.apply_force(vector(gravity.x uniform(-1, 1) / 20, gravity.y / 2 (randint(1, 8) / 100)))
  45.  
    particle.move() # 移动烟花粒子
  46.  
    # 遍历烟花粒子的尾迹粒子
  47.  
    for t in particle.trails:
  48.  
    t.show(win) # 绘制尾迹粒子
  49.  
    particle.show(win) # 绘制烟花粒子
  50.  
     
  51.  
    # 烟花爆炸,生成爆炸的烟花粒子
  52.  
    def explode(self):
  53.  
    amount = randint(self.min_particles, self.max_particles) # 产生区间范围内的爆炸烟花粒子数
  54.  
    self.explode_mp3.play()
  55.  
    # 遍历烟花粒子数
  56.  
    for i in range(amount):
  57.  
    self.particles.append(Particle(self.firework.pos.x, self.firework.pos.y, False, self.colours)) # 添加爆炸烟花粒子
  58.  
     
  59.  
    # 绘制升空期的烟花粒子
  60.  
    def show(self, win):
  61.  
    # 绘制烟花粒子(圆)
  62.  
    pygame.draw.circle(win, self.colour, (int(self.firework.pos.x), int(self.firework.pos.y)), self.firework.size)
  63.  
     
  64.  
    # 移除该烟花爆炸后所以消失需移除的烟花粒子(其尾迹粒子跟着移除),再返回该烟花是否已经完全放完需要移除(即所以爆炸烟花粒子已经消失移除)
  65.  
    def remove(self):
  66.  
    # 是否爆炸(因为仅用于爆炸烟花粒子)
  67.  
    if self.exploded:
  68.  
    # 遍历爆炸烟花粒子
  69.  
    for p in self.particles:
  70.  
    # 判断烟花粒子是否已经消失需移除
  71.  
    if p.remove is True:
  72.  
    self.particles.remove(p) # 从烟花粒子列表中移除已经消失了的烟花粒子
  73.  
     
  74.  
    # 判断是否所以爆炸粒子已经消失移除
  75.  
    if len(self.particles) == 0:
  76.  
    return True # 返回该烟花可移除
  77.  
    else:
  78.  
    return False # 返回该烟花不需移除(未放完)
学新通

烟花粒子类

  1.  
    # 烟花粒子
  2.  
    class Particle:
  3.  
    # 初始化,传入参数:位置坐标x,y,烟花阶段判断,颜色参数
  4.  
    def __init__(self, x, y, firework, colour):
  5.  
    self.firework = firework # 是否为烟花阶段(未爆炸阶段)
  6.  
    self.pos = vector(x, y) # 当前位置坐标
  7.  
    self.origin = vector(x, y) # 初始位置坐标(仅用于作为爆炸粒子的烟花粒子)
  8.  
    self.remove = False # 该粒子是否需移除(仅用于作为爆炸粒子的烟花粒子)
  9.  
    self.explosion_radius = randint(5, 18) * 5 # 爆炸半径(仅用于作为爆炸粒子的烟花粒子)
  10.  
    self.life = 0 # 存活时间(仅用于作为爆炸粒子的烟花粒子)
  11.  
    self.acc = vector(0, 0) # 由于受力产生的加速度
  12.  
    # trail variables
  13.  
    self.trails = [] # stores the particles trail objects 储存粒子尾迹物体
  14.  
    # 上十帧烟花粒子坐标,用作尾迹粒子坐标,(-10,-10)表示画在屏幕外,即尾迹未产生
  15.  
    self.prev_posx = [-10] * 10 # stores the 10 last positions
  16.  
    self.prev_posy = [-10] * 10 # stores the 10 last positions
  17.  
     
  18.  
    # 设置升空期烟花粒子参数
  19.  
    if self.firework:
  20.  
    self.vel = vector(0, -randint(17, 20)*DISPLAY_HEIGHT/800) # 升空速度,y上17-20
  21.  
    self.size = 5 # 烟花粒子大小(半径)
  22.  
    self.colour = colour # 烟花粒子颜色
  23.  
    # 存入尾迹粒子
  24.  
    for i in range(5):
  25.  
    self.trails.append(Trail(i, self.size, True)) # 创建尾迹粒子类的五个尾迹粒子
  26.  
    # 设置爆炸产生的烟花粒子参数
  27.  
    else:
  28.  
    self.vel = vector(uniform(-1, 1), uniform(-1, 1)) # 爆炸速度添加基础系数(大小[-1,1]),符号表示爆炸方向,大小为权值系数
  29.  
    # 速度越小的概率越大,所以靠近烟花中心的爆炸粒子会更加多而密集
  30.  
    self.vel.x *= randint(7, self.explosion_radius 2) # 为x上速度系数乘上速度值(最小值很为7,最大值在7到18低概率随机)
  31.  
    self.vel.y *= randint(7, self.explosion_radius 2) # 为y上速度系数乘上速度值(最小值很为7,最大值在7到18低概率随机)
  32.  
    self.size = randint(2, 4) # 爆炸粒子大小[2,4],故其尾迹为[0,2]
  33.  
    self.colour = choice(colour) # 在三种爆炸颜色中选择一种(爆炸前为1种颜色,爆炸产生共3种颜色的爆炸粒子)
  34.  
    # 存入尾迹粒子
  35.  
    for i in range(5):
  36.  
    self.trails.append(Trail(i, self.size, False)) # 创建尾迹粒子类的五个尾迹粒子
  37.  
     
  38.  
    # 为烟花粒子设置加速度
  39.  
    def apply_force(self, force):
  40.  
    self.acc = force # 添加加速度
  41.  
     
  42.  
    # 移动烟花粒子(更新烟花粒子和其尾迹粒子的各种数据)
  43.  
    def move(self):
  44.  
    # 对于爆炸后的烟花粒子添加速度衰减
  45.  
    if not self.firework:
  46.  
    self.vel.x *= 0.8 # x方向衰减
  47.  
    self.vel.y *= 0.8 # y方向衰减
  48.  
    self.vel = self.acc # 加速度改变速度
  49.  
    self.pos = self.vel # 速度改变位置
  50.  
    self.acc *= 0 # 加速度消耗清除
  51.  
     
  52.  
    # 很奇怪,这句没用,前面life==0使得只判断一次distance是0的情况,所以爆炸不会因为超过半径消失,半径提供速度,因为时间消失
  53.  
    if self.life == 0 and not self.firework: # check if particle is outside explosion radius
  54.  
    distance = math.sqrt((self.pos.x - self.origin.x) ** 2 (self.pos.y - self.origin.y) ** 2)
  55.  
    if distance > self.explosion_radius:
  56.  
    self.remove = True
  57.  
     
  58.  
    self.decay()
  59.  
     
  60.  
    self.trail_update()
  61.  
     
  62.  
    self.life = 1
  63.  
     
  64.  
    # 绘制烟花粒子(仅用于作为爆炸粒子的烟花粒子,升空期的烟花粒子绘制在firework类中定义)
  65.  
    def show(self, win):
  66.  
    pygame.draw.circle(win, (self.colour[0], self.colour[1], self.colour[2], 0), (int(self.pos.x), int(self.pos.y)),
  67.  
    self.size) # 绘制烟花粒子(圆)参数:win窗口,color颜色透明的0,坐标pos,半径size,边框不设置默认0即无
  68.  
     
  69.  
    # 判断烟花粒子是否衰退而消失需要移除,只是修改是否需要移除的参数,不会移除烟花粒子(仅用于作为爆炸粒子的烟花粒子)
  70.  
    def decay(self):
  71.  
    if 50 > self.life > 10: # 存活时间在(10,50)时1/30概率衰减消散
  72.  
    ran = randint(0, 30) # 随机数
  73.  
    if ran == 0: # 判断是否命中消失的1/30
  74.  
    self.remove = True # 消失移除参数修改
  75.  
    elif self.life > 50: # 存活时间大于50时
  76.  
    ran = randint(0, 5) # 随机数1/5概率消失
  77.  
    if ran == 0: # 判断是否命中消失的1/5
  78.  
    self.remove = True # 消失移除参数修改
  79.  
     
  80.  
    # 更新尾迹粒子数据
  81.  
    def trail_update(self):
  82.  
    self.prev_posx.pop() # 移除最久远前的x坐标位置记录
  83.  
    self.prev_posx.insert(0, int(self.pos.x)) # 添加单位时间(一帧)前的x坐标位置在最前
  84.  
    self.prev_posy.pop() # 移除最久远前的y坐标位置记录
  85.  
    self.prev_posy.insert(0, int(self.pos.y)) # 添加单位时间(一帧)前的y坐标位置在最前
  86.  
     
  87.  
    for n, t in enumerate(self.trails):
  88.  
    if t.dynamic:
  89.  
    t.get_pos(self.prev_posx[n dynamic_offset], self.prev_posy[n dynamic_offset])
  90.  
    else:
  91.  
    t.get_pos(self.prev_posx[n static_offset], self.prev_posy[n static_offset])
学新通

尾迹粒子类

  1.  
    # 尾迹粒子(升空烟花粒子,和爆炸粒子的尾迹颜色与大小不同,5个尾迹粒子,升空尾迹大小逐渐变小,爆炸的大小相同)
  2.  
    class Trail:
  3.  
    def __init__(self, n, size, dynamic): # 传入参数:尾迹序号,尺寸,动态与否
  4.  
    self.pos_in_line = n # 尾迹序号
  5.  
    self.pos = vector(-10, -10) # 位置坐标
  6.  
    self.dynamic = dynamic # 是否动态中(即升空期,爆炸后的烟花粒子尾迹为False)
  7.  
     
  8.  
    # 升空期烟花尾迹参数导入
  9.  
    if self.dynamic:
  10.  
    self.colour = trail_colours[n] # 读取该序号尾迹的颜色
  11.  
    self.size = int(size - n / 2) # 尾迹粒子大小,序号越大(越尾部)的尾迹粒子越小,[3,5]
  12.  
    # 爆炸散落烟花粒子的尾迹参数导入
  13.  
    else:
  14.  
    self.colour = (255, 255, 200) # 爆炸散落烟花粒子的尾迹颜色
  15.  
    self.size = size - 2 # 尾迹粒子大小
  16.  
    # 确保粒子大小不为负数
  17.  
    if self.size < 0:
  18.  
    self.size = 0 # 粒子大小最小为0
  19.  
     
  20.  
    # 获取位置坐标,参数:坐标x,y
  21.  
    def get_pos(self, x, y):
  22.  
    self.pos = vector(x, y) # 获取位置坐标
  23.  
     
  24.  
    # 绘制尾迹粒子,参数:窗口名
  25.  
    def show(self, win):
  26.  
    pygame.draw.circle(win, self.colour, (int(self.pos.x), int(self.pos.y)), self.size) # 绘制圆形作为烟花粒子
  27.  
     
  28.  
     
  29.  
    # 更新所有烟花(绘制所以烟花,移除已经放完的烟花),更新屏幕
  30.  
    def update(win, fireworks):
  31.  
    # 遍历所有烟花
  32.  
    for fw in fireworks:
  33.  
    fw.update(win) # 更新并绘制烟花
  34.  
    # 判断是否需要移除烟花
  35.  
    if fw.remove():
  36.  
    fireworks.remove(fw) # 移除烟花
  37.  
     
  38.  
    pygame.display.update() # 更新屏幕
学新通

烟花主程序

  1.  
    # 主函数
  2.  
    def main():
  3.  
    global window
  4.  
    # 初始化
  5.  
    pygame.init()
  6.  
    pygame.font.init()
  7.  
    pygame.mixer.init()
  8.  
     
  9.  
    # launch_mp3 = pygame.mixer.Sound(launch)
  10.  
    # launch_mp3.play()
  11.  
     
  12.  
    pygame.display.set_caption("Fireworks in Pygame") # 标题
  13.  
    background = pygame.image.load(bg) # 背景
  14.  
    myfont = pygame.font.Font("img/simkai.ttf", 80) # 大字体
  15.  
    myfont1 = pygame.font.Font("img/simkai.ttf", 30) # 小字体
  16.  
     
  17.  
    testsurface = myfont.render(text1, False, (251, 59, 85)) # 大字体文字
  18.  
    testsurface1 = myfont1.render(text2, False, (251, 59, 85)) # 小字体文字
  19.  
     
  20.  
    # pygame.image.load("")
  21.  
    win = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT)) # 创建窗口
  22.  
    # win.blit(background)
  23.  
    clock = pygame.time.Clock() # 创建时钟
  24.  
    pygame.mixer.set_num_channels(70) # 设置声音频道数量
  25.  
    fireworks = [] # 创建烟花列表
  26.  
    running = True # 运行与否参数
  27.  
     
  28.  
    # 运行循环
  29.  
    while running:
  30.  
    clock.tick(fps) # 设置帧率
  31.  
    # 获取事件
  32.  
    for event in pygame.event.get():
  33.  
    # 关闭窗口
  34.  
    if event.type == pygame.QUIT:
  35.  
    running = False # 修改运行参数,停止运行
  36.  
    # 按键
  37.  
    if event.type == pygame.KEYDOWN:
  38.  
    if event.key == pygame.K_1: # 按下1
  39.  
    fireworks.append(Firework()) # 生成一个烟花
  40.  
    if event.key == pygame.K_2: # 按下2
  41.  
    # 循环迭代10次
  42.  
    for i in range(10):
  43.  
    fireworks.append(Firework()) # 生成一个烟花(循环共10次)
  44.  
    if event.type == pygame.MOUSEBUTTONUP: # 鼠标点击生成烟花
  45.  
    firework_new = Firework() # 创建烟花
  46.  
    firework_new.firework = Particle(event.pos[0], DISPLAY_HEIGHT, True, firework_new.colour) # 位置为鼠标所在位置
  47.  
    fireworks.append(firework_new) # 放入烟花
  48.  
    win.fill((20, 20, 30)) # 窗口填满颜色
  49.  
    win.blit(background, (0, 0)) # 加载背景图片
  50.  
    win.blit(testsurface, ((int(DISPLAY_WIDTH-len_text1*80)/2), 30)) # 加大字体文字
  51.  
    win.blit(testsurface1, ((int(DISPLAY_WIDTH len_text1*80)/2), 80)) # 加小字体文字
  52.  
     
  53.  
    if randint(switch_T, int(fps*T)) == 0: # 1/fps*T概率命中添加烟花
  54.  
    fireworks.append(Firework()) # 生成一个烟花
  55.  
     
  56.  
    update(win, fireworks) # 更新窗口
  57.  
     
  58.  
    # 关闭窗口
  59.  
    pygame.quit()
  60.  
    window.deiconify()
学新通

用户界面

  1.  
    def windows():
  2.  
    global window
  3.  
    # 生成烟花
  4.  
    def creat():
  5.  
    try:
  6.  
    window.withdraw()
  7.  
    main()
  8.  
    except:
  9.  
    tkinter.messagebox.showerror('提示', '出现未知错误,希望您能记住当前情况将其向作者反馈,作者QQ:2278526910。')
  10.  
    # 更换背景图片,自适应屏幕大小
  11.  
    def changebg():
  12.  
    global bg, DISPLAY_HEIGHT, DISPLAY_WIDTH, gravity
  13.  
    try:
  14.  
    x, y = imagesize.get(str(text_bg.get())) # 屏幕宽高
  15.  
    if x == -1 and y == -1:
  16.  
    tkinter.messagebox.showwarning('提示', '无法在该路径下读取到允许的图片文件,请检查路径再重试!')
  17.  
    elif x < 100 or y < 100:
  18.  
    tkinter.messagebox.showwarning('提示', '图片尺寸过小,请将图片尺寸改大或更换其它图片再重试。')
  19.  
    elif x < 400 or y < 400:
  20.  
    if tkinter.messagebox.askokcancel('提示', '图片尺寸较小,建议替换更加大尺寸的图片,也可以进行现在该图片,是否要继续?'):
  21.  
    DISPLAY_WIDTH, DISPLAY_HEIGHT = imagesize.get(str(text_bg.get())) # 屏幕宽高
  22.  
    gravity = vector(0, 0.3 * DISPLAY_HEIGHT / 800) # 重力向量
  23.  
    bg = str(text_bg.get())
  24.  
    label_bg.config(text='路径:' bg)
  25.  
    elif x > 1920 or y > 1080:
  26.  
    if tkinter.messagebox.askokcancel('提示', '图片尺寸过小,建议替换更加小尺寸的图片,也可以进行现在该图片,是否要继续?'):
  27.  
    DISPLAY_WIDTH, DISPLAY_HEIGHT = imagesize.get(str(text_bg.get())) # 屏幕宽高
  28.  
    gravity = vector(0, 0.3 * DISPLAY_HEIGHT / 800) # 重力向量
  29.  
    bg = str(text_bg.get())
  30.  
    label_bg.config(text='路径:' bg)
  31.  
    else:
  32.  
    DISPLAY_WIDTH, DISPLAY_HEIGHT = imagesize.get(str(text_bg.get())) # 屏幕宽高
  33.  
    gravity = vector(0, 0.3 * DISPLAY_HEIGHT / 800) # 重力向量
  34.  
    bg = str(text_bg.get())
  35.  
    label_bg.config(text='路径:' bg)
  36.  
    except:
  37.  
    tkinter.messagebox.showwarning('提示', '无法在该路径下读取到文件,请检查路径再重试!')
  38.  
     
  39.  
    text_bg.set('')
  40.  
     
  41.  
    # 重置背景
  42.  
    def clearbg():
  43.  
    global bg, gravity, DISPLAY_HEIGHT, DISPLAY_WIDTH
  44.  
    bg = "img/bg.jpg"
  45.  
    DISPLAY_WIDTH, DISPLAY_HEIGHT = imagesize.get(bg) # 屏幕宽高
  46.  
    gravity = vector(0, 0.3 * DISPLAY_HEIGHT / 800) # 重力向量
  47.  
    label_bg.config(text='路径:' bg)
  48.  
     
  49.  
    # 改变帧率
  50.  
    def changf():
  51.  
    global fps
  52.  
    try:
  53.  
    a = int(entry_t.get())
  54.  
    except Exception:
  55.  
    a = 'no'
  56.  
    if a == 'no':
  57.  
    tkinter.messagebox.showerror('提示', '请输入整数型数据')
  58.  
    else:
  59.  
    if 0 < a < 60:
  60.  
    fps = a
  61.  
    label_f.config(text='fps:' str(fps))
  62.  
    elif 120 >= a >= 60:
  63.  
    if tkinter.messagebox.askokcancel('提示', '正在修改为更高帧率,可能会造成严重卡顿甚至程序运行无响应,是否确认提高帧率'):
  64.  
    fps = a
  65.  
    label_f.config(text='fps:' str(fps))
  66.  
    else:
  67.  
    tkinter.messagebox.showerror('提示', '超过允许设置上限,设置失败')
  68.  
    entry_t.delete(0, 'end')
  69.  
     
  70.  
    # 改变自动生成烟花的周期概率
  71.  
    def changeT():
  72.  
    global T, switch_T
  73.  
    try:
  74.  
    a = float(entry_T.get())
  75.  
    except Exception:
  76.  
    a = 'no'
  77.  
    if a == 'no':
  78.  
    tkinter.messagebox.showerror('提示', '输入错误,请输入大于0的整数/小数!')
  79.  
    else:
  80.  
    if 0.25 <= a:
  81.  
    T = a
  82.  
    label_T.config(text='周期概率:' str(T))
  83.  
    switch_T = 0
  84.  
    button_To.config(text='关闭')
  85.  
    elif 0 < a:
  86.  
    if tkinter.messagebox.askokcancel('提示', '此修改的周期概率过小,烟花随机生成频率高,可能会造成严重卡顿甚至程序运行无响应,是否确认修改?'):
  87.  
    T = a
  88.  
    label_T.config(text='周期概率:' str(T))
  89.  
    switch_T = 0
  90.  
    button_To.config(text='关闭')
  91.  
    else:
  92.  
    tkinter.messagebox.showerror('提示', '设置失败,请输入正数!')
  93.  
    entry_T.delete(0, 'end')
  94.  
     
  95.  
    # 自动生成烟花开关
  96.  
    def switchT():
  97.  
    global T, switch_T
  98.  
    if switch_T:
  99.  
    switch_T = 0
  100.  
    label_T.config(text='周期概率:' str(T))
  101.  
    button_To.config(text='关闭')
  102.  
    else:
  103.  
    switch_T = 1
  104.  
    label_T.config(text='已关闭烟花自动随机生成功能。')
  105.  
    button_To.config(text='打开')
  106.  
     
  107.  
    # 重置帧率
  108.  
    def clearf():
  109.  
    global fps
  110.  
    fps = 60
  111.  
    label_f.config(text='fps:' str(fps))
  112.  
     
  113.  
    # 改变文字
  114.  
    def changetext():
  115.  
    global text1, text2, len_text1
  116.  
    list_char = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't'
  117.  
    , 'u', 'v', 'w', 'x', 'y', 'z', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'A', 'S', 'D'
  118.  
    , 'F', 'G', 'H', 'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '1', '2', '3', '4', '5', '6'
  119.  
    , '7', '8', '9', '0', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', ' ', '=', '~'
  120.  
    , ' ', '\n', '\\', '|', '{', '[', '}', ']', ';', ':', '\'', '\"', ',', '<', '>', '.', '/', '?']
  121.  
    text1_new = entry_text1.get()
  122.  
    text2_new = entry_text2.get()
  123.  
    if text1_new != '':
  124.  
    text1 = text1_new
  125.  
    len_text1 = 0
  126.  
    for i in text1:
  127.  
    if i in list_char:
  128.  
    len_text1 = 0.5
  129.  
    else:
  130.  
    len_text1 = 1
  131.  
    if text2_new != '':
  132.  
    text2 = text2_new
  133.  
    entry_text1.delete(0, 'end')
  134.  
    entry_text2.delete(0, 'end')
  135.  
    label_text.config(text='当前文字:”' text1 '“;”' text2 '”。')
  136.  
     
  137.  
    # 文字开关
  138.  
    def switch():
  139.  
    global text1, text2
  140.  
    if tkinter.messagebox.askokcancel('提示', '是否清空文字?清空后将不再显示任何文字,你也可以取消此操作然后单独关闭副文字。'):
  141.  
    text1 = ''
  142.  
    text2 = ''
  143.  
    elif tkinter.messagebox.askyesno('提示', '是否清空副文字,清空后将不再显示副文字?'):
  144.  
    text2 = ''
  145.  
    label_text.config(text='当前文字:”' text1 '“;”' text2 '”。')
  146.  
     
  147.  
    # 作者
  148.  
    def anchor():
  149.  
    tkinter.messagebox.showinfo('提示', '作者:惜豫。QQ:2278526910。有任何bug可加QQ反馈')
  150.  
     
  151.  
    # 说明
  152.  
    def info():
  153.  
    tkinter.messagebox.showinfo('提示', '一般情况下无问题,少数情况下运行后非常卡顿甚至未响应,具体情况看你的帧率设置和电脑配置,请认真看完说明!')
  154.  
    tkinter.messagebox.showinfo('提示', '背景设置:请输入背景图片的绝对路径或相对于fireworks.exe文件的相对路径,注意将“\\”改为“/”还是不懂问我。')
  155.  
    tkinter.messagebox.showinfo('提示', '帧率设置:请输入纯数字,默认为60,最高允许120,卡顿请小幅度此参数,降低动态效果来减缓卡顿。')
  156.  
    tkinter.messagebox.showinfo('提示', '文字设置:设置背景文字,两个输入框分别是主文字和副文字。')
  157.  
    tkinter.messagebox.showinfo('提示', '自动烟花:默认开启下以1.5(单位s)为周期规律,自动随机生成烟花。'
  158.  
    '周期规律指系统随机生成烟花的概率平均为多少秒生成一个。简单来说越大自动生成烟花速度越慢。')
  159.  
     
  160.  
    # 关闭程序
  161.  
    def destroy():
  162.  
    answer = tkinter.messagebox.askokcancel('提示', '真的要狠心离开我了吗?QAQ')
  163.  
    if answer:
  164.  
    window.destroy()
  165.  
     
  166.  
    # 登录
  167.  
    def enter():
  168.  
    e1 = entry1.get()
  169.  
    e2 = entry2.get()
  170.  
    if (e1 == user) and (e2 == password):
  171.  
    top_enter.destroy()
  172.  
    window.deiconify()
  173.  
    else:
  174.  
    tkinter.messagebox.showerror('提示', '账号或者密码有误,请输入正确的账号密码!')
  175.  
     
  176.  
    # 调试界面
  177.  
    window = Tk()
  178.  
    window.title('烟花生成器')
  179.  
    window.geometry('470x600')
  180.  
    window.protocol('WM_DELETE_WINDOW', destroy)
  181.  
    window.withdraw()
  182.  
     
  183.  
    lable_title = Label(window, text='烟花调试界面', font=('Arial', 35), fg='red')
  184.  
    lable_title.grid(row=0, columnspan=5)
  185.  
     
  186.  
    Label(window).grid(row=1, column=0, columnspan=4)
  187.  
    Label(window).grid(row=3, column=0, columnspan=4)
  188.  
     
  189.  
    text_bg = StringVar()
  190.  
    Label(window, text='背景设置:', font=('Arial', 18)).grid(row=4, column=0, padx=5, sticky='w')
  191.  
    label_bg = Label(window, text='路径:' bg)
  192.  
    label_bg.grid(row=4, column=1, padx=10, pady=10, columnspan=2, sticky='w')
  193.  
    entry_bg = Entry(window, width=30, font=('Arial', 15), textvariable=text_bg)
  194.  
    entry_bg.grid(row=5, column=0, pady=10, columnspan=2, sticky='w', padx=10)
  195.  
    button_bgi = Button(window, text='导入', command=changebg)
  196.  
    button_bgo = Button(window, text='重置', command=clearbg)
  197.  
    button_bgi.grid(row=5, column=2, pady=10, padx=20, sticky='w')
  198.  
    button_bgo.grid(row=5, column=3, pady=10, sticky='w')
  199.  
     
  200.  
    Label(window, text='帧率设置:', font=('Arial', 18)).grid(row=6, column=0, padx=5, sticky='w')
  201.  
    label_f = Label(window, text='fps:' str(fps))
  202.  
    label_f.grid(row=6, column=1, padx=10, pady=10, columnspan=2, sticky='w')
  203.  
    entry_t = Entry(window, width=30, font=('Arial', 15))
  204.  
    entry_t.grid(row=7, column=0, pady=10, columnspan=2, sticky='w', padx=10)
  205.  
    button_ti = Button(window, text='更改', command=changf)
  206.  
    button_to = Button(window, text='重置', command=clearf)
  207.  
    button_ti.grid(row=7, column=2, pady=10, padx=20, sticky='w')
  208.  
    button_to.grid(row=7, column=3, pady=10, sticky='w')
  209.  
     
  210.  
    Label(window, text='文字设置:', font=('Arial', 18)).grid(row=8, column=0, padx=5, sticky='w')
  211.  
    label_text = Label(window, text='主文字:”' text1 '“;副文字”' text2 '”。')
  212.  
    label_text.grid(row=8, column=1, padx=5, pady=10, columnspan=2, sticky='w')
  213.  
    entry_text1 = Entry(window, width=10, font=('Arial', 15))
  214.  
    entry_text1.grid(row=9, column=0, pady=10, sticky='w', padx=10)
  215.  
    entry_text2 = Entry(window, width=10, font=('Arial', 15))
  216.  
    entry_text2.grid(row=9, column=1, pady=10, padx=10)
  217.  
    button_capi = Button(window, text='更改', command=changetext)
  218.  
    button_capo = Button(window, text='开关', command=switch)
  219.  
    button_capi.grid(row=9, column=2, pady=10, padx=20, sticky='w')
  220.  
    button_capo.grid(row=9, column=3, pady=10, sticky='w')
  221.  
     
  222.  
    Label(window, text='自动烟花:', font=('Arial', 18)).grid(row=10, column=0, padx=5, sticky='w')
  223.  
    label_T = Label(window, text='周期概率:' str(T))
  224.  
    label_T.grid(row=10, column=1, padx=10, pady=10, columnspan=2, sticky='w')
  225.  
    entry_T = Entry(window, width=30, font=('Arial', 15))
  226.  
    entry_T.grid(row=11, column=0, pady=10, columnspan=2, sticky='w', padx=10)
  227.  
    button_Ti = Button(window, text='更改', command=changeT)
  228.  
    button_To = Button(window, text='关闭', command=switchT)
  229.  
    button_Ti.grid(row=11, column=2, pady=10, padx=20, sticky='w')
  230.  
    button_To.grid(row=11, column=3, pady=10, sticky='w')
  231.  
     
  232.  
    Button(window, text='生成', command=creat).grid(row=12, column=1, padx=60, pady=10, sticky='w')
  233.  
     
  234.  
    Button(window, text='作者', command=anchor).grid(row=13, column=0, padx=10, pady=30, sticky='w')
  235.  
    Button(window, text='说明', command=info).grid(row=13, column=1, pady=30, padx=60, sticky='w')
  236.  
    Button(window, text='退出', command=destroy).grid(row=13, column=3, pady=40, sticky='w')
  237.  
     
  238.  
    # 登录界面
  239.  
    top_enter = Toplevel()
  240.  
    top_enter.title('登录')
  241.  
    top_enter.geometry('240x300')
  242.  
    top_enter.protocol('WM_DELETE_WINDOW', destroy)
  243.  
    Label(top_enter, text='烟花生成器', font=('Arial', 25), fg='red').grid(row=0, columnspan=3, column=1)
  244.  
    Label(top_enter, text='账号:').grid(row=1, columnspan=3, column=0, sticky='w', padx=10, pady=5)
  245.  
    entry1 = Entry(top_enter, width=30, bd=2)
  246.  
    entry1.grid(row=2, columnspan=3, column=1, padx=10)
  247.  
    Label(top_enter, text='密码:').grid(row=3, columnspan=3, column=0, sticky='w', padx=10, pady=5)
  248.  
    entry2 = Entry(top_enter, width=30, bd=2)
  249.  
    entry2.grid(row=4, columnspan=3, column=1, padx=10)
  250.  
    button_enter = Button(top_enter, text='登录', command=enter)
  251.  
    button_enter.grid(row=5, column=1, padx=10)
  252.  
    button_register = Button(top_enter, text='退出', command=destroy)
  253.  
    button_register.grid(row=5, column=3, padx=10)
  254.  
     
  255.  
    window.mainloop() # 窗口循环
  256.  
     
学新通

运行

  1.  
    try:
  2.  
    windows()
  3.  
    except:
  4.  
    tkinter.messagebox.showerror('提示', '出现问题无法启动,可能是程序重要文件被删除或修改导致,请检查复原或者重新安装,如无法解决则可能是'
  5.  
    '一些未知问题,请向作者反馈,联系QQ:2278526910')

四.后言

打包后的程序安装包已经上传资源,需要的可以点我主页自行下载,或者私聊我下载。

最后祝大家天天快乐,天天开心,学习进步,考试全过,升职加薪,出任CEO,迎娶白富美,走向人生巅峰。(水个字数)哈哈哈哈哈哈哈哈哈

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggeagc
系列文章
更多 icon
同类精品
更多 icon
继续加载