用 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:\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 庫

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編程

相關文章
相關標籤/搜索