zoukankan      html  css  js  c++  java
  • 用 python 写一个年会抽奖小程序

    使用 pyinstaller 打包工具常用参数指南

     
    pyinstaller -F demo.py
    参数 	含义
    -F 	指定打包后只生成一个exe格式的文件
    -D 	–onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)
    -c 	–console, –nowindowed 使用控制台,无界面(默认选项)
    -w 	–windowed, –noconsole 使用窗口,无控制台
    -p 	添加搜索路径,让其找到对应的库。
    -i 	改变生成程序的icon图标
    
    pyinstaller -F -w -noconsole Annual_awards_main.py --distpath=C:UsersFrankLixxxxdist --icon="./start.ico"
    

    在线 图标转换

    资源文件目录:

    uploading-image-149426.png

    完整 代码 第一版

    # -*- coding: utf-8 -*-
    __author__ = 'Frank Li'
    __version__ = 1.0
    import pygame
    from pygame.locals import *
    from sys import exit
    import xlrd
    import random
    
    FULLSCREEN = False
    MUSIC_FILE = './music/月之门 - 白龙口.mp3'
    DRUM_STICK = './frontimgs/gc_cz.png'
    font_file = './fonts/simhei.ttf'
    excel_file = './employee/name_file.xlsx'
    clock = pygame.time.Clock()
    mode =  1 if FULLSCREEN else 0 # default 0 <--> Full Screen
    
    mouse_range = dict(top=460,bottom=560,left=970,right=1030)
    
    def get_name_list_from_excel(file_name):
        '''"解析 人员.xlsx 文件,得到人员名单列表"'''
        name_list = []
        excelFile = xlrd.open_workbook(file_name)
        sheet = excelFile.sheet_by_name('employee')
        #print sheet.name, sheet.nrows, sheet.ncols
        job_num  = sheet.cell(0, 0).value
        job_name = sheet.cell(0, 1).value
        for row in range(1, sheet.nrows):
            job_num  = sheet.cell(row, 0).value
            job_name = sheet.cell(row, 1).value
            name_list.append((job_num, job_name))
        return job_num, job_name, name_list
    
    def handle_mouse_event(index,drum_stick_obj,pause_flag):
        if pygame.mouse.get_pressed()[0]:
            x, y = pygame.mouse.get_pos()
            x -= drum_stick_obj.get_width() / 2
            y -= drum_stick_obj.get_height() / 2
            if all((mouse_range.get('top')-50 < y < mouse_range.get('bottom'),mouse_range.get('left')-50 < x < mouse_range.get('right'))):
                print('coming ...')
                pause_flag =  not pause_flag
    
                if pause_flag:
                    pygame.mixer.music.stop()
                    print('暂停') if pause_flag else print('播放')
                else:
                    pygame.mixer.music.play()
                    print('暂停') if pause_flag else print('播放')
                    if name_list:
                        del name_list[index]
    
        return index,pause_flag
    
    if __name__ == '__main__':
        job_num, job_name, name_list = get_name_list_from_excel(file_name=excel_file)
        pygame.init()
        if not FULLSCREEN:
            screen = pygame.display.set_mode((1200,673),0,32)
            bgImage = './bgimgs/bg_1366x768.png'
        else:
            screen = pygame.display.set_mode((1200, 673), 0, 32)
            bgImage = './bgimgs/bg_1366x768.png'  # 这里替换一下
    
        bgImageObj = pygame.image.load(bgImage).convert()
        screen.blit(bgImageObj, (0, 0))
        drum_stick_obj = pygame.image.load(DRUM_STICK).convert_alpha()
    
        pygame.display.set_caption("年会抽奖小程序")
    
        pygame.mixer.init()
        pygame.mixer.music.load(MUSIC_FILE)
        pygame.time.delay(1000) # 等待 1 s 钟
        pygame.mixer.music.set_volume(0.5)  # 设置播放音量
        pygame.mixer.music.play(-1) # 循环播放
        pause_flag = False
    
        if len(name_list):
            index = random.randint(0,len(name_list)-1)
        else:
            prompt = '请检查员工信息表是否为空!'
    
        while True:
            clock.tick(60)
            for event in pygame.event.get():
                if event.type == pygame.QUIT or event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                    pygame.quit()
                    exit()
                if event.type == pygame.MOUSEBUTTONDOWN:
                    x,y = pygame.mouse.get_pos()
                    print(x,',',y)
                    index,pause_flag = handle_mouse_event(index,drum_stick_obj,pause_flag) # 暂停完成其实是将index再次返回重绘时候又用一样的
    
            if not pause_flag:
                # 若没有按下暂停键,那么每次循环都随机
                if len(name_list):
                    index = random.randint(0, len(name_list)-1)
                    # 写字
                    pno = name_list[index][0]
                    pname = name_list[index][1]
                    text_context = '恭喜工号 {} 姓名{}  喜提特等奖!'.format(pno, pname)
                else:
                    text_context = ' 年会抽奖完满结束,祝大家新年万事如意,阖家欢乐!'
                # if not pygame.mixer.music.get_busy():
                #     pygame.mixer.music.play()
    
            # 重新刷新背景图片 防止重影
            screen.blit(bgImageObj, (0, 0))
    
            # 获取鼠标位置,使用 图片替代
            x, y = pygame.mouse.get_pos()
            x -= drum_stick_obj.get_width() / 2
            y -= drum_stick_obj.get_height() / 2
            pygame.mouse.set_visible(False)
            screen.blit(drum_stick_obj,(x,y))
    
            # 抽奖结果展示
            font = pygame.font.Font(font_file, 40)
            text_obj = font.render(text_context, True, (255, 255, 255), (0, 0, 0))
            text_pos = text_obj.get_rect()
            text_pos.center = (500, 50)
            screen.blit(text_obj, text_pos)
    
            # 作者以及版本信息
            font2 = pygame.font.Font(font_file, 10)
            text_obj = font2.render('软件作者 {} , 版本号: {}'.format(__author__,__version__), True, (255, 255, 255), (255, 0, 0))
            text_pos = text_obj.get_rect()
            text_pos.center = (1000, 650)
            screen.blit(text_obj, text_pos)
    
            pygame.display.update()
    
    
    
    # 使用 pyinstaller 打包
    
    pyinstaller -F -w -noconsole AnnualGame.py --distpath=C:UsersFrankLiPycharmProjectsjdquickbuy.pygamedist --icon="./favicon.ico"
    
    

    python 主流 GUI 库

    Python下各种GUI简介、使用优缺点对比
    GUI编程对比
    
    简介特点
    
    优缺点
    
    PyQt 
    
    Python 对跨平台的 GUI 工具集 Qt 的包装实现了 440 个类以及 6000 个函数或者方法 ,PyQt 是作为 Python 的插件实现的。  
    
    比较流行的一个 Tkinter 的替代品,功能 非常强大,可以用Qt开发多美漂亮的界面,也就可以用PyQt开发多么漂亮的界面。 跨平台的支持很好,不过在商业授权上似乎存在一些问题。
    
    Tkinter
    
    绑定了 Python 的 Tk GUI 工具集 ,就是Python 包装的Tcl代码,通过内嵌在 Python 解释器内部的 Tcl 解释器实现, Tkinter的调用转换成 Tcl 命令,然后交给 Tcl 解释器进行解释,实现 Python 的 GUI 界面。
    
    对比Tk和其它语言的绑定,比如 PerlTk ,是直接由 Tk 中的 C 库实现的。
    
    历史最悠久, Python 事实上的标准 GUI , Python 中使用 Tk GUI 工具集的标准接口,已经包括在标准的 Python Windows 安
    
    装中,著名的 IDLE 就是使用 Tkinter 实现 GUI 的创建的 GUI 简单,学起来和用起来也简单。
    
    wxPython
    
    Python 对跨平台的 GUI 工具集 wxWidgets ( C++ 编写)的包装,作为 Python 的一个 扩展模块实现。
    
    比较流行的一个 Tkinter 的替代品,在 各种平台下都表现挺好。
    
    PyGTK
    
    一系列的 Python 对 GTK+ GUI 库的包装。
    
    比较流行的一个 Tkinter 的替代品,许多 Gnome 下的著名应用程序的 GUI 都是使用 PyGTK 实现的,比如 BitTorrent , GIMP和 Gedit 都有可选的实现,在 Windows 平台 似乎表现不太好,这点也无可厚非,毕竟使用的是GTK 的 GUI 库。
    
    PySide
    
    另一个 Python 对跨平台的 GUI 工具集 Qt 的包装,捆绑在 Python 当中,最初由 BoostC++ 库实现,后来迁移到 Shiboken。
    
    比较流行的一个 Tkinter 的替代品,和上 面类似,至于两者的区别,这里 有一个介绍。
    
     
    
    PyQt 的介绍 : http://en.wikipedia.org/wiki/PyQt
    
    Tkinter 的介绍 : http://en.wikipedia.org/wiki/Tkinter
    
    wxPython 的介绍 : http://en.wikipedia.org/wiki/WxPython
    
    PyGTK 的介绍 : http://en.wikipedia.org/wiki/PyGTK
    
    PySide 的介绍 : http://en.wikipedia.org/wiki/PySide
    

    主流GUI

    如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。
  • 相关阅读:
    php程序员面试经验
    模板引擎(smarty)知识点总结五
    模板引擎(smarty)知识点总结三
    js计算字数
    phpexcel导出成绩表
    phpexcel用法(转)
    模板引擎(smarty)知识点总结
    apache泛域名解析
    对象的解构赋值
    解构赋值
  • 原文地址:https://www.cnblogs.com/Frank99/p/10346164.html
Copyright © 2011-2022 走看看