Python 랜 덤 추첨 도구 만 들 기

최근 에 업무 중 에 사회 유 저 를 대상 으로 행 사 를 조직 하여 무 작위 추첨 을 해 야 한다.예전 에 샤 오 밍 사내 의 사례 를 참고 하여 자신의 수 요 를 결합 시 켜 간단 한 무 작위 추첨 도 구 를 만 들 었 다.
오늘 은 이 작은 공구 의 제작 과정 을 소개 하 러 왔 습 니 다!
먼저 효과 보기:

1.핵심 기능 설계
무 작위 추첨 의 작은 도구 에 대해 서 는 추첨 에 참여 하 는 인원 명단 을 가 져 온 다음 에 서로 다른 보상 유형 을 선택 하여 무 작위 로 수상 명단 을 뽑 아 내 보 낼 수 있어 야 한다.
그러면 수요 분 해 를 간단하게 하고 다음 과 같은 핵심 기능 을 대체적으로 정리한다.
명단 가 져 오기
이름 이 바 뀌 는 상황 을 피하 기 위해 다음 과 같은 몇 가 지 를 약속 합 니 다.
① 추첨 참여 자 명단 파일 가 져 오기xlsx형식 파일 가 져 오기)
② 데이터 1 열 은 ID 이 고 2 열 은 name
참고 형식 사례
案例
상 유형 선택
상 유형 은 1 등 상,2 등 상 이라는 표지 어 를 말 하 는데 여기 서 우 리 는 특등 상-6 등 상 총 7 개의 옵션 을 내장 하여 선택 할 수 있다.
이번 라운드 인원수
이번 라운드 인원 은 추첨 할 때마다 한꺼번에 뽑 는 수상자 수 를 말 하 며,기본 값 은 5 이다.
① 채 워 진 숫자 가 나머지 미 수상자 수 를 초과 할 경우 미 수상자 수 를 안내 하고 표시
② 채 워 진 숫자 가 0 이면 윤공 을 표시 하고 수 동 으로 끝내 야 합 니 다.
③ 채 워 진 숫자 가 마이너스 일 때 추첨 을 클릭 하여 응답 하지 않 음
④ 숫자 가 아 닌 숫자 를 입력 했 을 때 정확 한 숫자 를 입력 해 야 한 다 는 힌트 를 준다.
추첨 시 라운드 방송 구역
추첨 중 무 작위 로 이번 추첨 에 참여 한 인원 명단 을 표시 합 니 다.
인원 명단
정확 한 인원 명단 파일 을 선택 하면 자동 으로 인원 정보 목록 이 표 시 됩 니 다.
당 첨 기록
매번 뽑 는 상 유형 및 수상자 명단 기록
추첨 을 시작 하 다
① 추첨 을 시작 할 때 추첨 설정 이 조건 을 충족 하 는 지 여 부 를 판단 하고 그렇지 않 으 면 관련 안내 가 있 습 니 다.
② 추첨 중 추첨 시작 을 누 르 면 추첨 중 알림 을 드 립 니 다
끝나다
① 비 추첨 상태 에서 클릭 종료 시 응답 없 음
② 추첨 중 종료 클릭 하면 이번 추첨 결과 가 표 시 됩 니 다
리 셋
① 리 셋 하면 과거 추첨 기록 을 지 웁 니 다(로 컬 파일 포함,당 첨 자 명단 에 대한 기록 을 남 기 는 것 을 권장 합 니 다)
② 추첨 중 리 셋 을 누 르 면 추첨 중 알림 이 표 시 됩 니 다
③ 추첨 하지 않 은 상태 에서 리 셋 을 누 르 면 이 동작 이 과거 기록 을 삭제 하고 확인 여 부 를 알려 줍 니 다.
기본 기능 점 을 확인 하고 GUI 디자인 을 시작 하 겠 습 니 다.
2.GUI 디자인 과 구현
기능 점 을 바탕 으로 우 리 는axure으로 간단하게UI 한 다음 에GUI개발 고 를 통 해 디자인 을 한다.여기 서 여전히pysimplegui를 사용 하 는데 주로 간단 하고 편리 하 다.
UI布局设计-axure
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))
포 함 된 컨트롤 은 다음 과 같 습 니 다.
  • 텍스트 텍스트
  • InputText 입력 텍스트 상자
  • FileBrowse 파일 탐색
  • 다 중 줄 텍스트 상자
  • 콤 보 드 롭 다운 상자
  • Listbox 리스트
  • 버튼
  • 주의해 야 할 것 은 여기에 Frame 구성 요소 가 있 습 니 다.layot 내장 에 사용 되 며 UI 레이아웃 을 잘 모듈 화 할 수 있 습 니 다.
    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 정도 입 니 다.
    파 이 썬 이 랜 덤 추첨 도 구 를 만 드 는 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 랜 덤 추첨 도구 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기