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:\Users\FrankLi\xxxx\dist --icon="./start.ico"
uploading-image-149426.pngpython
# -*- 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:\Users\FrankLi\PycharmProjects\jdquickbuy.py\game\dist --icon="./favicon.ico"
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编程