天天看点

pyqt5写一个抽奖程序(再次美化)

今天再次优化了之前用python写的抽奖程序

pyqt版本:pyqt5

python版本:3.6.6

下面直接上代码,有建议的话,欢迎大家交流评论!

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'Lucky_draw_pro.ui'
#
# Created by: PyQt5 UI code generator 5.15.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
'''
1.3版本
1.bug的修改 get
2.实现动态图展示 get
3.程序图标展示 get
4.支持奖池表格导入+展示 get
5.中奖记录展示--初步确定用子窗口展示 notget
6.可配置抽奖人数和抽奖批次 支持新增、修改(删除暂时未实现) get
7.支持一次抽取多人 get
8.抽取方式优化:不采取随机数方式抽取,而是将名单乱序,使用数组切片方式进行截取,每次获取抽取人数,进行抽取。get

'''
# ''' font-family:设置字体
        #
        #     text-align:设置文本文字对齐方式
        #
        #     background:设置控件背景色
        #
        #     border:设置边界,none为无边界
        #
        #     font-size:字体大小
        #
        #     border-radius:设置四边圆角
        #
        #     hover:伪状态,设置鼠标悬浮在控件上方时变化
        # '''
import configparser

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QMainWindow, QApplication,QLabel,QLineEdit,QMessageBox,QComboBox,QGridLayout,QTextBrowser)
from PyQt5.QtCore import Qt, QSize, QWaitCondition
from PyQt5.QtCore import Qt, QThread, pyqtSignal, QMutex
from PyQt5.QtGui import QMovie, QTextCursor, QIcon
import sys
import random
import numpy as np
import time
import xlrd
import re
import os

qmut_1 = QMutex() #创建线程锁
qmut_2 = QMutex()
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

'''主界面'''
class Ui_Draw(object):
    #静态变量,使用静态变量直接被类获取,通过线程类调用修改截取大小
    contraler_count = 0
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.setWindowState(Qt.WindowMaximized)
        Dialog.setWindowTitle('Lucky')
        Dialog.setWindowIcon(QIcon('3738.png_300.png'))
        self.from_Dialog = Dialog
        self.gridLayout = QtWidgets.QGridLayout(Dialog)
        self.gridLayout.setObjectName("gridLayout")
        self.pushButton_2 = QtWidgets.QPushButton(Dialog)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout.addWidget(self.pushButton_2, 5, 0, 1, 1)
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 4, 0, 1, 1)
        self.pushButton_3 = QtWidgets.QPushButton(Dialog)
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout.addWidget(self.pushButton_3, 6, 0, 1, 1)
        self.pushButton_4 = QtWidgets.QPushButton(Dialog)
        self.pushButton_4.setObjectName("pushButton_4")
        self.gridLayout.addWidget(self.pushButton_4, 7, 0, 1, 1)
        self.gridLayout_3 = QtWidgets.QGridLayout()
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.textEdit_2 = QtWidgets.QTextEdit(Dialog)
        self.textEdit_2.setEnabled(True)
        self.textEdit_2.setObjectName("textEdit_2")
        self.gridLayout_3.addWidget(self.textEdit_2, 2, 0, 1, 1)
        self.textEdit = QtWidgets.QTextEdit(Dialog)
        self.textEdit.setEnabled(False)
        self.textEdit.setObjectName("textEdit")
        self.gridLayout_3.addWidget(self.textEdit, 0, 0, 1, 1)
        self.comboBox = QtWidgets.QComboBox(Dialog)
        self.comboBox.setObjectName("comboBox")
        self.gridLayout.addWidget(self.comboBox, 2, 0, 1, 1)
        self.spinBox = QtWidgets.QSpinBox(Dialog)
        self.spinBox.setObjectName("spinBox")
        self.gridLayout.addWidget(self.spinBox,3, 0, 1, 1)
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setEnabled(False)
        self.label.setObjectName("label")
        #设置字体居中
        self.label.setAlignment(Qt.AlignCenter)
        self.gridLayout_3.addWidget(self.label, 1, 0, 1, 1)
        self.label.setStyleSheet('''QLabel{color:black;font-size:50px;font-family:webdings;}''')
        #测试代码
        self.label_gif = QtWidgets.QLabel(Dialog)
        self.label_gif.setEnabled(False)
        self.label_gif.setObjectName("label")
        # 设置字体居中
        self.label_gif.setAlignment(Qt.AlignTop)
        self.gridLayout_3.addWidget(self.label_gif, 0, 3, 2, 2)
        self.label_gif.setStyleSheet('''QLabel{color:black;font-size:50px;font-family:webdings;}''')
        # 测试代码
        self.label_gif_2 = QtWidgets.QLabel(Dialog)
        self.label_gif_2.setEnabled(False)
        self.label_gif_2.setObjectName("label")
        # 设置字体居中
        self.label_gif_2.setAlignment(Qt.AlignRight)
        self.gridLayout_3.addWidget(self.label_gif_2, 1, 3, 2, 2)
        self.label_gif_2.setStyleSheet('''QLabel{color:black;font-size:50px;font-family:webdings;}''')
        self.gridLayout.addLayout(self.gridLayout_3, 1, 0, 1, 1)
        self.font_2 = QtGui.QFont()
        self.font_2.setFamily("Arial")  # 括号里设置字体
        self.font_2.setPointSize(20)  # 括号里的设置字体大小
        self.comboBox.setFont(self.font_2)
        self.spinBox.setFont(self.font_2)
        # # 加载动态图
        self.gif = QMovie(os.path.join(BASE_DIR ,'test_4.gif'))
        self.label_gif.setMovie(self.gif)
        self.gif.start()
        self.gif_2 = QMovie(os.path.join(BASE_DIR ,'test_4.gif'))
        self.label_gif_2.setMovie(self.gif_2)
        self.gif_2.start()
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)


    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "欢乐大抽奖"))
        self.label.setText(_translate("Dialog", "6"))
        #执行奖池导入操作
        self.input_in_Lucky()
        #开启线程
        self.my_thread = MyThread()  # 实例化线程对象
        self.my_thread.my_signal.connect(self.set_label_func)
        self.my_thread.is_on = True
        self.my_thread.start()  # 启动线程
        self.my_thread.pause()  # 默认休眠线程
        self.lucklogs = Luck_logs()
        self.pushButton.setText(_translate("Dialog", "开始游戏"))
        self.pushButton.clicked.connect(self.begin_in_Lucky)
        #页面默认值
        self.textEdit.setPlaceholderText("大奖究竟花落谁家,敬请期待!!!")
        self.textEdit_2.setPlainText("NOW!!! " + ' 抽奖即将开始~')
        self.textEdit_2.setPlainText('本轮获奖人员: ')
        self.pushButton_2.setText(_translate("Dialog", "抽奖结束"))
        self.pushButton_2.clicked.connect(self.jump_to_success)
        #奖池
        self.pushButton_3.setText(_translate("Dialog", "奖池人员"))
        self.pushButton_3.clicked.connect(self.view_Lucky)
        self.pushButton_4.setText(_translate("Dialog", "设置"))
        self.pushButton_4.clicked.connect(self.jump_to_Luck_logs)

        self.spinBox.valueChanged.connect(self.spinBox_value_change)
        if self.pushButton.setEnabled:
            self.pushButton_2.setEnabled(False)
        #是否展示选人动画的标志位,默认为False
        self.call_set_view = False
        self.read_ini()
        #设置计数器上界
        self.comboBox.currentIndexChanged.connect(self.setMaximum_spinbox)

    '''读文件并且给组件设置默认值'''
    def read_ini(self):
        self.configini = configparser.ConfigParser()
        self.configini.read(os.path.join(BASE_DIR ,'config_luck.ini'))
        sections_line = self.configini.sections()
        print(str(sections_line))
        self.comboBox.clear()
        self.comboBox.addItems(sections_line)
        self.setMaximum_spinbox()

    def setMaximum_spinbox(self):
        setMaximum_spinbox = self.configini.get(self.comboBox.currentText(),"number_of_participants")
        #设置计数器上界,并且默认置计数器为当前阶段最大值
        self.spinBox.setMaximum(int(setMaximum_spinbox))
        self.spinBox.setValue(int(setMaximum_spinbox))
        # 获取抽奖人数
        Ui_Draw.contraler_count = self.spinBox.value()

    def spinBox_value_change(self):
        # 修改value联动修改抽奖人数
        Ui_Draw.contraler_count = self.spinBox.value()

    '''开始抽奖'''
    def begin_in_Lucky(self):
        #恢复线程
        self.my_thread.resume()
        self.call_set_view = True
        self.textEdit.setPlaceholderText("大奖究竟花落谁家,敬请期待!!!")
        self.pushButton.setEnabled(False)
        self.pushButton_3.setEnabled(False)
        self.pushButton_2.setEnabled(True)
        # 线程自定义信号连接的槽函数

    '''由于自定义信号时自动传递一个字符串参数,所以在这个槽函数中要接受一个参数'''
    def set_label_func(self, num):
        self.num_tt = num
        if self.call_set_view:
            self.set_view()

    '''选人动画展示'''
    def set_view(self):
        self.textEdit_2.setPlainText('本轮获奖人员: ' + self.num_tt)
        #self.textEdit_2.append(self.num_tt)

    '''获取奖池人员'''
    def input_in_Lucky(self):
        my_input = xlrd.open_workbook(os.path.join(BASE_DIR ,'data.xlsx'))
        sheet1 = my_input.sheets()[0]
        nun_rows = sheet1.nrows
        print('表格总行数:', nun_rows)
        nun_cols = sheet1.ncols
        print('表格总列数:', nun_cols)
        rows_match = 0
        cols_match = 0
        self.match = []
        for rows_match in range(nun_rows):
            for cols_match in range(nun_cols):
                cell_r_c = sheet1.cell(rows_match, cols_match).value
                self.match.append(cell_r_c)
                cols_match = cols_match+1
            rows_match = rows_match+1
        for i in range(len(self.match)):
            print(self.match[i])
            i = i+1
        return len(self.match)

    '''展示奖池人员'''
    def view_Lucky(self):
        self.textEdit_2.setPlainText(("奖池人员名单:" + str(self.match)))
        self.textEdit_2.moveCursor(QTextCursor.Left)

    '''结束抽奖'''
    def jump_to_success(self):
        #休眠线程
        self.my_thread.pause()
        self.pushButton.setEnabled(True)
        self.pushButton_2.setEnabled(False)
        self.pushButton_3.setEnabled(True)
        print("设定完成"+self.num_tt)
        print("获取测试"+self.textEdit.toPlainText())



    '''跳转设置界面'''
    def jump_to_Luck_logs(self):
        self.lg = Luck_logs()
        #self.from_Dialog.hide()
        form2 = QtWidgets.QDialog()
        ui = self.lg
        ui.setupUi(form2)
        form2.show()
        form2.exec_()
        #self.from_Dialog.show()


'''线程类'''
class MyThread(QThread):
    # 自定义信号对象。参数str就代表这个信号可以传一个字符串
    my_signal = pyqtSignal(str)

    def __init__(self):
        super(MyThread, self).__init__()
        self.count = 0
        self.is_on = True
        self.cond = QWaitCondition()
        self.mutex = QMutex()
        self.draw = Ui_Draw()
        self.draw.input_in_Lucky()
        self.count_list = []
        self.iii = 7



    def run(self): #线程执行函数
            global tester
            while self.count < (len(self.draw.match)):
                while self.is_on:
                    self.mutex.lock()
                    print('次数',self.count+1)
                    list = self.draw.match
                    random.shuffle(list)
                    #self.count = random.randint(0, len(self.draw.match) - 1)
                    #self.my_signal.emit(str(self.draw.match[self.count]))  #释放自定义的信号
                    self.count_list = list[0:Ui_Draw.contraler_count]
                    self.my_signal.emit(str(self.count_list))  #释放自定义的信号

                    #通过自定义信号把str(self.count)传递给槽函数
                    #self.sleep(int(0.8))  ,此处使用usleep,因为sleep只支持整型,不支持小数,强制转型0.8为int就是0,故没起到睡眠效果
                    self.usleep(50000)#本线程睡眠0.05秒【是QThread函数】
                    self.mutex.unlock()

    def pause(self):
        print("线程休眠")
        self.is_on = False

    def resume(self):
        print("线程启动")
        self.is_on = True
        self.cond.wakeAll()
'''抽奖配置界面'''
class Luck_logs(object):

    def __init__(self):
        self.conut = Ui_Draw()

    def setupUi(self, Dialog_1):
        Dialog_1.setObjectName("Dialog_1")
        Dialog_1.resize(558, 395)
        Dialog_1.setWindowIcon(QIcon('3738.png_300.png'))
        self.from_Dialog_1 = Dialog_1
        self.gridLayout = QtWidgets.QGridLayout(Dialog_1)
        self.gridLayout.setObjectName("gridLayout")
        self.label = QtWidgets.QLabel(Dialog_1)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.comboBox = QtWidgets.QTextEdit(Dialog_1)
        self.comboBox.setObjectName("comboBox")
        self.gridLayout.addWidget(self.comboBox, 1, 1, 1, 2)
        self.pushButton_5 = QtWidgets.QPushButton(Dialog_1)
        self.pushButton_5.setObjectName("pushButton_5")
        self.gridLayout.addWidget(self.pushButton_5, 4, 0, 1, 1)
        self.spinBox = QtWidgets.QSpinBox(Dialog_1)
        self.spinBox.setObjectName("spinBox")
        self.spinBox.setMaximum(self.conut.input_in_Lucky())
        self.gridLayout.addWidget(self.spinBox, 0, 1, 1, 2)
        self.label_2 = QtWidgets.QLabel(Dialog_1)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.label_3 = QtWidgets.QLabel(Dialog_1)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 2, 2, 1, 1)
        self.pushButton_6 = QtWidgets.QPushButton(Dialog_1)
        self.pushButton_6.setObjectName("pushButton_6")
        self.gridLayout.addWidget(self.pushButton_6, 4, 1, 1, 1)
        self.pushButton_7 = QtWidgets.QPushButton(Dialog_1)
        self.pushButton_7.setObjectName("pushButton_7")
        self.gridLayout.addWidget(self.pushButton_7, 4, 2, 1, 1)

        self.font = QtGui.QFont()
        self.font.setFamily("Arial")  # 括号里设置字体
        self.font.setPointSize(20)  # 括号里的设置字体大小
        self.comboBox.setFont(self.font)
        self.spinBox.setFont(self.font)
        self.label.setFont(self.font)
        self.label_2.setFont(self.font)
        self.font_2 = QtGui.QFont()
        self.font_2.setFamily("Arial")  # 括号里设置字体
        self.font_2.setPointSize(12)  # 括号里的设置字体大小
        self.label_3.setFont(self.font_2)

        self.retranslateUi(Dialog_1)
        QtCore.QMetaObject.connectSlotsByName(Dialog_1)

    def retranslateUi(self, Dialog_1):
        _translate = QtCore.QCoreApplication.translate
        Dialog_1.setWindowTitle(_translate("Dialog_1", "系统设置"))
        self.label.setText(_translate("Dialog_1", "获奖人数:"))
        self.pushButton_5.setText(_translate("Dialog_1", "获奖历史"))
        self.label_2.setText(_translate("Dialog_1", "获奖级别:"))
        self.label_3.setText(_translate("Dialog_1", "修改配置后需重启生效"))
        self.pushButton_6.setText(_translate("Dialog_1", "确认"))
        self.pushButton_7.setText(_translate("Dialog_1", "取消"))
        #设置计数器默认值
        self.spinBox.setValue(1)
        #设置按钮默认值和文本修改触发器
        self.pushButton_6.setEnabled(False)
        self.comboBox.textChanged.connect(self.set_able)

        self.pushButton_5.clicked.connect(self.back_main)
        self.pushButton_6.clicked.connect(self.save_and_back_main)
        self.pushButton_7.clicked.connect(self.back_main)


    def save_and_back_main(self):
        self.spinBox_value = self.spinBox.value()
        self.config = configparser.ConfigParser()
        host = str(self.comboBox.toPlainText())
        # 获取别名列表
        self.config.read('config_luck.ini')
        sectoons_line = self.config.sections()
        print(self.config.sections())
        # 向配置文件写值
        if host not in sectoons_line:
            self.config.add_section(host)
            self.config.set(host, "number_of_participants", str(self.spinBox.value()))
            self.config.set(host, "award_level", self.comboBox.toPlainText())
            # 此处用w+打开,添加,用w打开会被覆盖
            file_ini = open('config_luck.ini', "w+")
            self.config.write(file_ini)  # 没有新建  存在打开F
            file_ini.close()
            print("存储完成后"+host)
        else:
            self.config.set(host, "number_of_participants", str(self.spinBox.value()))
            file_ini = open('config_luck.ini', "w+")
            self.config.write(file_ini)  # 没有新建  存在打开
            file_ini.close()
            print("存储完成后" + host)


    def set_able(self):
        if self.comboBox.toPlainText() == '':
            self.pushButton_6.setEnabled(False)
        else:
            self.pushButton_6.setEnabled(True)

    def back_main(self):
        self.from_Dialog_1.close()
'''启动方法'''
if __name__ == "__main__":

    # 加载设置好的样式
    qss_button = '''
                    QPushButton#pushButton
                    {
                    font-family:"Arial";
                    text-align:top;
                    background:#6d9eeb;border-radius:6px;
                    border:none;
                    font-size:36px;
                    }
                    QPushButton#pushButton:hover{background:#2b74e9;}

                    QPushButton#pushButton_2
                    {
                    font-family:"Arial";
                    background:#F7D674;border-radius:6px;
                    border:none;
                    font-size:36px;
                    }
                    QPushButton#pushButton_2:hover{background:#f1c232;}

                    QPushButton#pushButton_3
                    {
                    font-family:"Arial";
                    background:#93c47d;border-radius:6px;
                    border:none;
                    font-size:36px;
                    }
                    QPushButton#pushButton_3:hover{background:#74bb54;}

                    QPushButton#pushButton_4
                    {
                    font-family:"Arial";
                    background:#C0C0C0;border-radius:6px;
                    border:none;
                    font-size:36px;
                    }
                    QPushButton#pushButton_4:hover{background:#A9A9A9;}
                    
                    QPushButton#pushButton_5
                    {
                    font-family:"Arial";
                    background:#F7D674;border-radius:6px;
                    border:none;
                    font-size:20px;
                    }
                    QPushButton#pushButton_5:hover{background:#f1c232;}

                    QPushButton#pushButton_6
                    {
                    font-family:"Arial";
                    background:#93c47d;border-radius:6px;
                    border:none;
                    font-size:20px;
                    }
                    QPushButton#pushButton_6:hover{background:#74bb54;}

                    QPushButton#pushButton_7
                    {
                    font-family:"Arial";
                    background:#C0C0C0;border-radius:6px;
                    border:none;
                    font-size:20px;
                    }
                    QPushButton#pushButton_7:hover{background:#A9A9A9;}
                    
                    QTextEdit#textEdit
                    {
                    font-family:"Arial";
                    background:#C0C0C0;border-radius:6px;
                    border:none;
                    font-size:50px;
                    }
                    
                    QTextEdit#textEdit_2
                    {
                    font-family:"Arial";
                    background:#C0C0C0;border-radius:6px;
                    border:none;
                    font-size:50px;
                    }
                    
                    QComboBox::drop-down {border:0px solid gray;width: 40px;background:#C0C0C0;border-radius:6px;}
                    QComboBox {border:0px solid gray;width: 40px;background:#C0C0C0;border-radius:6px;}
                    
                    QSpinBox::drop-down {border:0px solid gray;width: 40px;background:#C0C0C0;border-radius:6px;}
                    QSpinBox {border:0px solid gray;width: 40px;background:#C0C0C0;border-radius:6px;}
                    '''
    app = QApplication(sys.argv)
    app.setStyleSheet(qss_button)
    form = QtWidgets.QWidget()
    window = Ui_Draw()
    window.setupUi(form)
    form.show()
    sys.exit(app.exec_())```