抽奖工具
如何在主进程中强制结束子线程 全部代码路径:Git / lottery
import queue
import random
import threading
import time,json
from itertools import cycle
import PySimpleGUI as pg
import globalvar as gl
gl._init()
gl.set_value('stop_threads', False)
def to_base64(file):
import base64
with open(file, "rb") as f: # 转为二进制格式
base64_data = str(base64.b64encode(f.read()), 'utf-8') # 使用base64进行加密
return base64_data
menu_def = [['选项', ['Open', 'Save', 'Exit', ]],]
layout = [[pg.Menu(menu_def, size=(100, 100))],
[pg.Text('优快云是全球知名中文IT技术交流平台', key='-content-',background_color='#ffffff',text_color='#000000',font=('微软雅黑', 20)), ],
[pg.Text(size=(19,20),background_color='#ffffff'),
pg.Button('', pad=(10),size=(130,30),font=('微软雅黑', 20),
key='-btnLottery-',
button_color=('#ffffff','#ffffff'),
border_width=0,
image_data=to_base64('img/start.png'))],
]
wd = pg.PySimpleGUI.Window("抽奖小程序", layout, grab_anywhere=True,size=(500,300),use_default_focus=False,background_color='#ffffff')
def actionStart(gui_queue,wd,myList,removeValue):
result_List = myList[:]
result_List.remove(removeValue)
for _ in cycle(myList):
if gl.get_value('stop_threads'):
result = random.choice(result_List)
wd['-content-'].update(value=result)
break
else:
time.sleep(0.1)
wd['-content-'].update(value=_)
lotteryStatus = False #按钮状态
myListInit = [] #文本中提供的参与抽选的内容
removeValue = None #永远不被抽到的内容
def getFile(fileName):
with open(f'file/{fileName}.txt', encoding='utf-8') as f:
_string = f.read().replace('\n', '').split(",")
return _string
def mainFunc():
gui_queue = queue.Queue() # Queue是python标准库中的线程安全的队列
while True:
event,values = wd.read()
if event is None:
wd.close()
break
global myListInit,removeValue
if event=='Open':
myListInit = getFile('部门')
removeValue = '人力资源'
elif event=='Save':
myListInit = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
removeValue = 11
if event=='-btnLottery-':
if len(myListInit)==0:
pg.popup_ok('请先选择抽取类型')
continue
global lotteryStatus
lotteryStatus = not lotteryStatus
myList = myListInit[:]
if lotteryStatus:
# 开始抽奖
# 1.将“抽奖”文字修改为“停止”
# 2.将线程停止状态更新为False
wd['-btnLottery-'].update(text='',image_data=to_base64('img/stop.png'))
gl.set_value('stop_threads', False)
th = threading.Thread(target=actionStart,args=(gui_queue,wd,myList,removeValue),daemon=True)
th.start()
#print('开始', event, values, lotteryStatus)
else:
# 停止抽奖#
# 1.将“抽奖”文字修改为“开始”
# 2.将线程停止状态更新为True
wd['-btnLottery-'].update(text='',image_data=to_base64('img/start.png'))
gl.set_value('stop_threads',True)
if __name__ == '__main__':
mainFunc()