Python 랜 덤 추첨 도구 만 들 기
오늘 은 이 작은 공구 의 제작 과정 을 소개 하 러 왔 습 니 다!
먼저 효과 보기:
1.핵심 기능 설계
무 작위 추첨 의 작은 도구 에 대해 서 는 추첨 에 참여 하 는 인원 명단 을 가 져 온 다음 에 서로 다른 보상 유형 을 선택 하여 무 작위 로 수상 명단 을 뽑 아 내 보 낼 수 있어 야 한다.
그러면 수요 분 해 를 간단하게 하고 다음 과 같은 핵심 기능 을 대체적으로 정리한다.
명단 가 져 오기
이름 이 바 뀌 는 상황 을 피하 기 위해 다음 과 같은 몇 가 지 를 약속 합 니 다.
① 추첨 참여 자 명단 파일 가 져 오기
xlsx
형식 파일 가 져 오기)② 데이터 1 열 은 ID 이 고 2 열 은 name
참고 형식 사례
상 유형 선택
상 유형 은 1 등 상,2 등 상 이라는 표지 어 를 말 하 는데 여기 서 우 리 는 특등 상-6 등 상 총 7 개의 옵션 을 내장 하여 선택 할 수 있다.
이번 라운드 인원수
이번 라운드 인원 은 추첨 할 때마다 한꺼번에 뽑 는 수상자 수 를 말 하 며,기본 값 은 5 이다.
① 채 워 진 숫자 가 나머지 미 수상자 수 를 초과 할 경우 미 수상자 수 를 안내 하고 표시
② 채 워 진 숫자 가 0 이면 윤공 을 표시 하고 수 동 으로 끝내 야 합 니 다.
③ 채 워 진 숫자 가 마이너스 일 때 추첨 을 클릭 하여 응답 하지 않 음
④ 숫자 가 아 닌 숫자 를 입력 했 을 때 정확 한 숫자 를 입력 해 야 한 다 는 힌트 를 준다.
추첨 시 라운드 방송 구역
추첨 중 무 작위 로 이번 추첨 에 참여 한 인원 명단 을 표시 합 니 다.
인원 명단
정확 한 인원 명단 파일 을 선택 하면 자동 으로 인원 정보 목록 이 표 시 됩 니 다.
당 첨 기록
매번 뽑 는 상 유형 및 수상자 명단 기록
추첨 을 시작 하 다
① 추첨 을 시작 할 때 추첨 설정 이 조건 을 충족 하 는 지 여 부 를 판단 하고 그렇지 않 으 면 관련 안내 가 있 습 니 다.
② 추첨 중 추첨 시작 을 누 르 면 추첨 중 알림 을 드 립 니 다
끝나다
① 비 추첨 상태 에서 클릭 종료 시 응답 없 음
② 추첨 중 종료 클릭 하면 이번 추첨 결과 가 표 시 됩 니 다
리 셋
① 리 셋 하면 과거 추첨 기록 을 지 웁 니 다(로 컬 파일 포함,당 첨 자 명단 에 대한 기록 을 남 기 는 것 을 권장 합 니 다)
② 추첨 중 리 셋 을 누 르 면 추첨 중 알림 이 표 시 됩 니 다
③ 추첨 하지 않 은 상태 에서 리 셋 을 누 르 면 이 동작 이 과거 기록 을 삭제 하고 확인 여 부 를 알려 줍 니 다.
기본 기능 점 을 확인 하고 GUI 디자인 을 시작 하 겠 습 니 다.
2.GUI 디자인 과 구현
기능 점 을 바탕 으로 우 리 는
axure
으로 간단하게UI
한 다음 에GUI
개발 고 를 통 해 디자인 을 한다.여기 서 여전히pysimplegui
를 사용 하 는데 주로 간단 하고 편리 하 다.GUI 디자인 을 기반 으로 다음 과 같이 인 코딩 합 니 다.
nameList_column = [
[sg.Text(' :')],
[sg.Listbox(values=[], size=(20, 10), key='nameList')],
]
result_column = [
[sg.Text(' :')],
[sg.Multiline('', size=(48, 10), key='result', text_color='DeepPink')],
]
#
sg.theme('SystemDefaultForReal')
#
layout = [[sg.Text(' :', font=(' ', 12)), sg.InputText('', key='_file', size=(50, 1), font=(' ', 10), enable_events=True), sg.FileBrowse(' ', file_types=(('Text Files', '*.xlsx'),), size=(10, 1), font=(' ', 11))],
[sg.Frame(layout=[
[sg.Text(' :', font=(' ', 12)), sg.Combo([' ', ' ', ' ', ' ', ' ', ' ', ' '], font=(' ', 10), default_value=' ', size=(15, 5), key='_type'),
sg.Text(' :', font=(' ', 12)), sg.InputText('5', key='_num', size=(38, 1), font=(' ', 10))],
],
title=' ', title_color='red', relief=sg.RELIEF_SUNKEN, tooltip=' ')],
[sg.Multiline(size=(48, 5), font=(
' ', 18), text_color='Blue', key='luckyName', justification='center')],
[sg.Column(nameList_column), sg.Column(result_column)],
[sg.Text(' :', font=(' ', 12))],
[sg.Text('① xlsx , ID name
② , ', font=(' ', 10)),
sg.Text('', font=(' ', 12), size=(5, 1)),
sg.Button(' ', font=(' ', 12), button_color='Orange'),
sg.Button(' ', font=(' ', 12), button_color='red'),
sg.Button(' ', font=(' ', 12), button_color='red'), ],
]
#
window = sg.Window(' , @ : ', layout,
font=(' ', 12), default_element_size=(50, 1))
포 함 된 컨트롤 은 다음 과 같 습 니 다.3.기능 실현
본 사례 에서 세 가지 기능 을 실현 해 야 한다.그것 이 바로 인원 명단 읽 기,무 작위 추첨 및 당 첨 명단 저장 이다.
3.1 인원 명단 읽 기
여기 서 사용 하 는 것 은
openpyxl
표 데 이 터 를 읽 고 특정한 열 의 값 을 얻 는 것 입 니 다.표 머리 가 존재 하기 때문에 마지막 으로 표 머리 가 필요 하지 않 습 니 다.
def nameList(window):
fileName = values['_file']
try:
wb = openpyxl.load_workbook(fileName)
active_sheet = wb.active
names = [cell_object.value for cell_object in list(active_sheet.columns)[1]][1:]
ids = [cell_object.value for cell_object in list(active_sheet.columns)[0]][1:]
names = [name+'_'+str(id_) for name, id_ in zip(names, ids)]
window['nameList'].update(names)
return names
except:
sg.popup(' ', title=' ',)
3.2 랜 덤 추첨한 번 에 무 작위 로 뽑 아야 할 인원 이 여러 개 있 기 때문에 여기 서 사용 하 는 것 은
random.sample()
입 니 다.들 어 오 는 매개 변수 중 names 는 당 첨 된 명단 을 제거 해 야 합 니 다.
def Result(window, names):
global is_run, luckyNames
_type = values['_type'] #
_num = int(values['_num']) #
while True:
randomName = random.sample(names, k=_num)
luckyName = ' '.join(randomName)
window['luckyName'].update(luckyName)
if not is_run:
headers = [' ', ' ']
toCsv(headers, [_type]*len(randomName), randomName, lucky)
luckyNames = luckyNames + _type+' : '+luckyName+'
'
window['result'].update(luckyNames)
return
time.sleep(0.088)
3.3 당 첨 자 명단 저장여기 서 우리 가 사용 하 는 것 은
csv
라 이브 러 리 의 방법 으로 추가 저장 하 는 것 이다.
def toCsv(headers, col1, col2, file):
# ,
if os.path.exists(lucky):
with open(lucky, 'a', encoding='utf_8_sig', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerows(zip(col1, col2))
else:
with open(lucky, 'w', encoding='utf_8_sig', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(headers)
writer.writerows(zip(col1, col2))
핵심 기능 함 수 를 완성 한 후에 우 리 는 GUI 상호작용 논리의 실현 을 진행한다.3.4.GUI 상호작용 논리
여기 에는 두 개의 전역 변수 가 있 는데 그 중 하 나 는 현재 추첨 상 태 를 기록 하 는 데 사용 되 고 다른 하 나 는 현재 수상 한 인원 정 보 를 저장 하 는 데 사용 된다.상호작용 논리 에 대한 상세 한 정 보 는 모두 핵심 기능 수요 와 아래 코드 를 결합 하여 이해 할 수 있다.
#
is_run = False
luckyNames = ''
#
while True:
event, values = window.read()
if event in (None, ' '):
break
if event == '_file':
nameList(window)
if event == ' ':
if is_run:
sg.popup(' , ......', title=' ')
continue
try:
names = nameList(window) #
_num = int(values['_num']) #
lucky = ' .csv' #
if os.path.exists(lucky):
with open(' .csv', 'r', encoding='utf_8_sig') as f:
reader = csv.reader(f)
selectedNames = set([i[1] for i in reader][1:])
names_set = set(names)-selectedNames
else:
names_set = set(names)
if len(names_set) >= _num:
is_run = True
_thread.start_new_thread(Result, (window, names_set))
else:
sg.popup(
f' ( {len(names_set)} )', title=' ')
except:
sg.popup(' ( )', title=' ')
elif event == ' ':
is_run = False
elif event == ' ':
if is_run:
sg.popup(' , ...', title=' ')
continue
yes_no = sg.popup_yes_no(
' , ??', text_color='red', title=' ')
if yes_no == 'Yes':
try:
os.remove(lucky)
luckyNames = ''
window['result'].update(luckyNames)
window['luckyName'].update(luckyNames)
sg.popup(' ......', title=' ')
except:
sg.popup(' ......', title=' ')
window.close()
이에 따라 우 리 는 무 작위 추첨 도구 제작 을 마 쳤 다.시작 페이지 는 다음 과 같 습 니 다:
마지막 으로 여러분 이 관심 이 있 으 면 코드 를 exe 실행 가능 한 파일 로 포장 할 수 있 습 니 다.제 가 포장 한 곳 은 약 10MB 정도 입 니 다.
파 이 썬 이 랜 덤 추첨 도 구 를 만 드 는 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 랜 덤 추첨 도구 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.