效果图:随即变红

python + PyQt5+ QThread  实现抽奖效果_编程

代码如下 ,

 

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

from PyQt5.QtWidgets import QApplication, QMainWindow
import PyQt5.QtWidgets as widgets
import sys
import random
import time
import math
from PyQt5.QtCore import QThread, pyqtSignal


class Cj(QMainWindow):
    def __init__(self):
        super().__init__()
        self.__initUI__()
        # self.grid_layout()

    def __initUI__(self):
        # 窗口大小
        self.setGeometry(200, 200, 1000, 600)
        self.setWindowTitle('抽奖')
        # self.Left_Mid_layout = widgets.QHBoxLayout(self)
        self.Left_Mid_layout1 = widgets.QGridLayout(self)
        self.Left_Mid_widget = widgets.QWidget()  # 创建部件
        self.Left_Mid_widget.setLayout(self.Left_Mid_layout1)
        # self.Left_Mid_layout.setSpacing(10)
        self.button1 = []
        # 根据自己的要求自己设置按钮上的字---这里很重要,这些字将会做为传递参数的依据
        self.userList = ["龙狗", "凯哥", "欧总", "何总", "云儿", "长清", "老王", "茂茂", "茂茂"]
        self.beginbutt = widgets.QPushButton(self)
        self.beginbutt.setFixedSize(100, 50)
        self.beginbutt.setStyleSheet(
            '''QPushButton{background:white;border-radius:5px;}QPushButton:hover{background:red;}''')
        self.beginbutt.setText("开始")
        self.beginbuttend = widgets.QPushButton(self)
        self.beginbuttend.setFixedSize(100, 50)
        self.beginbuttend.setStyleSheet(
            '''QPushButton{background:white;border-radius:5px;}QPushButton:hover{background:red;}''')
        self.beginbuttend.setText("结束")
        self.Left_Mid_layout1.addWidget(self.Left_Mid_widget, 0, 0, 12, 4)
        self.Left_Mid_layout1.addWidget(self.beginbutt, 0, 0, 1, 1)
        self.Left_Mid_layout1.addWidget(self.beginbuttend, 0, 1, 1, 1)
        # 传达参数--重要,这里sender将接收你点击的字并传入函数
        self.beginbutt.clicked.connect(lambda: self.slot_btn_start())
        self.beginbuttend.clicked.connect(lambda: self.slot_btn_end())

        Cols = 4
        Rows = math.ceil(len(self.userList) / Cols)
        self.XYList = []
        for i in range(1, Rows + 1, 1):
            for j in range(0, Cols, 1):
                self.XYList.append([i, j])
        print(self.XYList)
        for x in range(0, len(self.userList), 1):
            # 将数字j加进button
            self.button1.append(x)
            self.button1[x] = widgets.QPushButton(self)
            self.button1[x].setFixedSize(50, 50)
            self.button1[x].setStyleSheet(
                '''QPushButton{background:white;border-radius:5px;}QPushButton:hover{background:red;}''')
            # 此处将字放到按钮上
            self.button1[x].setText(self.userList[x])
            self.Left_Mid_layout1.addWidget(self.button1[x], self.XYList[x][0], self.XYList[x][1])
            # # 传达参数--重要,这里sender将接收你点击的字并传入函数
            # self.button1[x].clicked.connect(lambda: self.slot_btn_start())

        # 因为我这使用的是QMainWindow,所以要创建一个Widget,才能显示所有的按钮

        self.widget = widgets.QWidget()
        self.widget.setLayout(self.Left_Mid_layout1)
        self.setCentralWidget(self.widget)

    # 开始
    def slot_btn_start(self):
        self.thread_1 = ThreadDemo(self.button1)  # 初始化线程把 button1 按钮集合传到线程中
        self.thread_1.trigger.connect(self.changeBGColor)
        self.thread_1.start()

    def changeBGColor(self, msg):
        print(msg)
        for x in self.button1:
            x.setStyleSheet('''QPushButton{background:white;border-radius:5px;}QPushButton:hover{background:red;}''')
        random.choice(self.button1).setStyleSheet(
            '''QPushButton{background:red;border-radius:5px;}QPushButton:hover{background:red;}''')

    # 结束
    def slot_btn_end(self):
        self.thread_1.disconnect()


# 线程类
class ThreadDemo(QThread):
    trigger = pyqtSignal(str)

    def __init__(self, buttons):
        self.buttons = buttons
        super(ThreadDemo, self).__init__()

    def run(self):
        bt_len = len(self.buttons)
        print("传入的按钮长度为=", bt_len)
        while True:
            # print(i)
            self.trigger.emit(str(random.randint(0, bt_len)))
            time.sleep(0.1)


if __name__ == "__main__":
    app = widgets.QApplication(sys.argv)
    window = Cj()
    window.show()
    sys.exit(app.exec_())