新的文化叫编程_振撼的自我介绍多媒体动画演示_屏幕中央启动center

"""
   这次把上次编写的代码又稍微改进了一下,做成了一个自我介绍的多媒体视频。音效效果可是相当的振撼哟,坚定信念_Python无敌。
   亮点,部分采用了“中文”编程!还有就是每次启动窗口一定在屏幕中央,并且没有边框。
"""
import pygame    
import os
import winsound
from pygame.locals import *

class Dream():
    info =[ '李兴球简介',
            '生于1976年9月',
            '祖籍江西萍乡福田镇双源村',
            '高中时代开始学习编程',
            '2010年开始致力于儿童编程的普及',
            '曾在北京,杭州某教育集团做课程研发',
            '原创近千例编程案例,著有多部Python书籍',
            '有感于一线城市Python教师,亦是严重匮乏',
            '放弃一线城市高薪工作,回到老家萍乡',
            '致力于Python,人工智能语言的普及',
            '新的文化,叫编程! ',
            '新的旅程,已开始',
            '谢谢大家,本视频用Python编程制作。',
            '坚定信念,Python无敌',
            '做学问,我选Python,你呢?'
            ]
    tips = []
    tips_index = 0
    tips_amounts = len(info)
    def __init__(self,size):
        """
           size:屏幕大小
        """
        self.width = size[0]
        self.height = size[1]        
        self.screen = pygame.display.set_mode(size,NOFRAME,0)
        self.clock = pygame.time.Clock()
        self.end = False
        self.title("做学问,我选Python,你呢?")
        self.myfont = pygame.font.Font("msyh.ttf",42)
        for string in Dream.info:
            tip = self.myfont.render(string,True,(0,255,255))
            tip_width = tip.get_width()
            tip_render_pos = (self.width//2  - tip_width//2 ),200
            Dream.tips.append([tip,tip_render_pos])
        
    def title(self,title):
        pygame.display.set_caption(title)
        
    def playmusic(self,wavfile,loop = True):
        """播放背景音乐,loop为非零值表示重复播放,其它为播放一次"""
        try:
           if loop :
              winsound.PlaySound(wavfile,winsound.SND_ASYNC|winsound.SND_LOOP)  # 循环异步播放
           else:            
              winsound.PlaySound(wavfile,winsound.SND_ASYNC)                    # 异步播放一次
        except:
            pass        
        
    def 成真(self):
        self.end = True
        try:
            pygame.quit()
        except:
            pass
    def fadeshow(self,imagefile,speed=1,time=3):
        """淡入淡出显示图像,参数说明:
           imagefile:图像文件
           speed:速度,1-255的值
           time:显示时间,秒为单位
           
        """
        if not os.path.exists(imagefile):return
        extname = os.path.splitext(imagefile)[-1]
        extname =  extname.lower()[1:]
        if not extname in ('jpg','jpeg','png','gif','bmp','pcx','tga','tif','lbm','pbm','pgm','ppm','xpm'):return
        speed = abs(speed)
        time = int(time)
        picture = pygame.image.load(imagefile)

        self.tip = Dream.tips[Dream.tips_index][0]
        self.tip_render_pos = Dream.tips[Dream.tips_index][1]
        
        Dream.tips_index = Dream.tips_index + 1
        Dream.tips_index = Dream.tips_index % Dream.tips_amounts
        
        
        "淡入的代码段,通过设置透明度实现"
        for i in range(0,256,speed):             # 从0到255变化,0 是全透明,255是不透明.
            self.clock.tick(60)
            event = pygame.event.poll()          # 加这个不会有无响应
            if event.type == QUIT:self.成真();return
            picture.set_alpha(i)                 # 设置透明度
            self.screen.fill((0,0,0))            # 渲染screen为黑色
            self.screen.blit(picture,(0,0) )     # 在screen上画picture                              
            self.screen.blit(self.tip,self.tip_render_pos)
            pygame.display.flip()                # 更新显示
        "这个for循环是等待一定的时间"
        for i in range(60 * time):               # 由于fps是60,即1/60秒显示一幅画,所以重复的次数要乘以60
            self.clock.tick(60)
            event = pygame.event.poll()
            if event.type == QUIT:self.成真();return
            self.screen.fill((0,0,0))
            self.screen.blit(picture,(0,0) )
            self.screen.blit(self.tip,self.tip_render_pos)
            pygame.display.flip()
        "淡出的代码段"
        for i in range(255,-1,-speed):           # 从255到0
            self.clock.tick(60)                  # 设置fps为60
            event = pygame.event.poll()          # 获取一个事件
            if event.type == QUIT:self.成真();return # 如果是退出事件,就退出
            picture.set_alpha(i)                 # 设置图像透明度
            self.screen.fill((0,0,0))
            self.screen.blit(picture,(0,0) )     # 把picture画在screen上
            self.screen.blit(self.tip,self.tip_render_pos)
            pygame.display.flip()                # 更新显示
        
if __name__ == "__main__":
    
    "如果不是做为模块导入,那么就执行以下语句"
    os.environ['SDL_VIDEO_CENTERED'] = '1'
    size = (860,380)                         # 尺寸元组
    size= (960,720)
    pygame.init()
    梦想 = Dream(size)                       # 新建梦对象,就像做了一个梦
    梦想.playmusic("Stage_1_紧张宏大背景乐.wav")   # 播放背景音乐
    p = "python创意游戏动画"
    path = os.getcwd() + os.sep + p          # 要淡入淡出显示的图片文件夹
    while True:
        for image in os.listdir(path):       # 遍历每一张图片
            imagefile= path + os.sep + image # 组合历全路径文件名
            if 梦想.end:  break              # 按了关闭按钮,这个变量会为真,就退出for循环      
            梦想.fadeshow(imagefile,speed=3)
    梦想.成真()