好久没更新了,有段时间没事帮同学做了几个小软件,很简单的所以分享给大家,代码相对比较简单但是并不一定是最优解,可以给大家提供一下思路哈哈,图侵删。
工程及软件下载链接:
代码+可执行文件:https://download.csdn.net/download/VCA821/13204417
仅可执行文件(软件):https://download.csdn.net/download/VCA821/13204425
首先上效果图吧!软件名称:Lucky_Dog
实现功能:
功能十分简单,在一个EXCEL的A列里写下名单(人数不作限制),然后保存后,在软件界面按绿色开始按键后开始抽人,采用的是随机显示和抽取,然后名字会显示到“那个谁”的位置处,功能结束
使用软件和库版本:
pycharm2019.3+eric6+Qt designer (并不是全部要装的,因为做了其他软件,大家可以参考版本)
代码实现:
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow,QApplication
import openpyxl
from Ui_Lucky_Draw import Ui_Luckydog
from random import choice
wb = openpyxl.load_workbook(r'..\Lucky_Draw\namelist.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
namelist = []
for i in range(1,int(sheet.max_row)+1):
if sheet.cell(row = i,column = 1).value == '':
pass
else:
namelist.append(str(sheet.cell(row = i,column = 1).value))
print(namelist)
class Luckydog(QMainWindow, Ui_Luckydog):
"""
Class documentation goes here.
"""
def __init__(self, parent=None):
"""
Constructor
@param parent reference to the parent widget
@type QWidget
"""
super(Luckydog, self).__init__(parent)
self.setupUi(self)
self.stopflag = 0
@pyqtSlot()
def on_pushButton_clicked(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
try:
self.stopflag = 0
while True:
if self.stopflag == 0:
for name in namelist:
if self.stopflag == 1:
break
else:
for i in range(0,30000):
self.label.setText(choice(namelist))
QApplication.processEvents()
else:
choicename = choice(namelist)
self.label.setText(choicename)
QApplication.processEvents()
break
except:
pass
@pyqtSlot()
def on_pushButton_2_clicked(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
self.stopflag = 1
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
ui = Luckydog()
ui.show()
sys.exit(app.exec_())
代码详解:
上面就是所有代码了,是不是十分的简单,在最一开始,我们先将预置EXCEL文件中的A列所有值都读出来生成一个list,有个比较重要的信号就是stop_flag,当stop_flag==0的时候,我们的软件显示上会一直刷新名字,当stop_flag==1的时候就会停止在一个名字上,我们先抛开pushButton2(停止按键)不说,程序开始到while函数里,name是一直轮询list里的名单(感觉多此一举,主要是如果大家想顺序显示的话方便改动),如果没有按停止按键,我我们将 self.label.setText(choice(namelist))这句话执行30000次,这里其实就是重复抽取了30000次,而QApplication.processEvents()同样重要,这个函数会在每次执行到的时候跳出pushButton事件检查是否有其他事件,如果没有这行代码,函数在while里无线循环是无法响应pushButton2的事件的,同时显示上也无法更新,这也就是为什么30000次我都在刷名单但是显示上是把一个名字显示了30000个时钟(这里不好想明白,就是只有执行这句话,我们的显示才会刷新一次,所以每次刷新的名字是地第30000次随机出来的名字,然后等到下一次第30000次的名字再刷新,如此反复),当我们按到停止按键,stopflag置1后回到while函数里,我们进入else显示一个随机名字后跳出循环。
优点:
代码简单,相对好理解,没有过多的参数
缺点:
当把刷新时间设置过长时,如10S,20S,那名单可能就无法实时停下来了,从上面实现角度分析也很好理解,因为我必须执行到30000次,才会出来检测一下事件同时刷新参数,如果你是100000次,你按了后要等100000次执行完才会变化,有很大的延迟,不过对我们这次设计的软件不用太担心这个问题,10S那不成作弊了哈哈