본문 바로가기
코딩 연습/코딩배우기

숫자 뽑기 게임 - 파이썬 Tkinter로 구현

by good4me 2022. 4. 11.

goodthings4me.tistory.com

수업이나 강의 시 발표 주제가 여러 개(예로, 10개) 있을 때 그중 임의로 주제를 배정(개인별 3개)하기 위해 뽑기를 한다고 가정하고, 파이썬으로 뽑기 기능이 있는 프로그램을 간단하게 만들어 보았다.

 

 

파이썬 tkinter와 pyinstaller로 만든 미니 뽑기 프로그램

간단한 프로그램이지만 만들게 된 배경은 이렇다.

위에서도 언급했듯이 학생들이 발표를 하는 수업을 진행해야하는데, 주제는 10개이고 이 중에서 개인별로 주제 3개씩을 즉석에서 배정하고 그 주제를 가지고 발표를 한다고 했다.

 

문제는 코로나 시국에 뽑기를 해야 하는 도구를 사용할 경우 자칫 공용 사용으로 인한 전염 문제가 우려된다고 하여 프로그램을 만들어서 선생님이나 강사가 직접 랜덤 하게, 공평하게 주제를 배정해주면 어떨지 제안을 하여 만들게 되었다.

 

프로그램 로직 자체는 간단하고, 파이썬 Tkinter 모듈로 UI를 만들어서 모수와 추출할 수를 입력하고 random.sample() 함수를 사용하여 추출수만큼 숫자를 선정하여 표시해주면 기능은 끝난다.

 

파이썬 소스 코드

from tkinter import *
from tkinter import messagebox
import random


def extract_num():
    mosu_v = mosu_entry.get()
    extract_v = extract_entry.get()

    if mosu_v == '' or extract_v == '':
        messagebox.showinfo(title='어허..', message='모수와 추출수 넣으랑께!!')
        
    ext_num = random.sample(range(1, int(mosu_v)), int(extract_v))
    result_num = ''
    for n in ext_num:
        result_num += str(n) + ' / '
    result.config(text=result_num[:-2])


def set_default():
    result.config(text='')


root = Tk()
root.title('미니 뽑기')
root.geometry('400x300+500+100')
root.resizable(False, False)
root.option_add('*Font','맑은고딕 12')

## 타이틀
title_lbl = Label(root, text='미니 뽑기', font=('맑은고딕', 20, 'bold'))
title_lbl.grid(row=1, column=0, columnspan=5, pady=20)

## 숫자 입력 프레임
lbl_frame = LabelFrame(root, text='뽑기 모수 및 추출수 설정')
lbl_frame.grid(row=2, column=0, columnspan=5, padx=20)

## 모수
mosu = Label(lbl_frame, text='모수', width=6, height=2, font=('맑은고딕', 13))
mosu.grid(row=2, column=0, padx=0, pady=5, ipady=3)

mosu_entry = Entry(lbl_frame, width=8, bg='powderblue', justify='center')
mosu_entry.grid(row=2, column=1, sticky='w', padx=10, ipady=3)

## 추출수
extract = Label(lbl_frame, text='추출수', width=6, height=2, font=('맑은고딕', 13))
extract.grid(row=2, column=2, padx=10, pady=5, ipady=3)

extract_entry = Entry(lbl_frame, width=8, bg='powderblue', justify='center')
extract_entry.grid(row=2, column=3, sticky='w', padx=0, ipady=3)

## 비고
etc1 = Label(lbl_frame, text='', width=6, height=2, font=('맑은고딕', 13))
etc1.grid(row=2, column=4, padx=0, pady=5, ipady=3)

## 결과
result = Label(root, text='', width=28, height=2, font=('맑은고딕', 14, 'bold'), bg='white')
result.grid(row=3, column=0, columnspan=5, padx=0, pady=10, ipady=3)

## 버튼
btn_frame1 = Frame(root)
btn_frame1.grid(row=4, column=0, columnspan=5, padx=10)

btn_save1 = Button(btn_frame1, text='추출하기', width=10, font=('나눔바른펜', 13), bg='lightpink', command=extract_num)
btn_save1.grid(row=4, column=0, pady=15, padx=5)

btn_set_default = Button(btn_frame1, text='초기화', width=10, font=('나눔바른펜', 13), bg='lightpink', command=set_default)
btn_set_default.grid(row=4, column=1, pady=15, padx=5)

mainloop()

- 모수를 입력하면 1부터 모수(예로, 10)까지의 정수가 추출 대상 숫자가 됨

- 추출수는 이 숫자 범위에서 추출할 개수를 말함 (예로, 3이면 3개의 숫자가 추출됨)

- 추출된 숫자를 표시해 줄 때 슬래시(/)로 구분하여 표시한다.

- 초기화 버튼 클릭시 추출 숫자 표시 부분만 초기화시키며, 초기화하지 않고 추출하기 버튼을 계속 눌러도 추출이 계속된다.

 

프로그램 다운로드

 

good4me.co.kr

 

프로그램 이미지

미니 뽑기
미니 뽑기

 

미니 뽑기 추출 결과
미니 뽑기 추출 결과

내기 뽑기, 당번 뽑기 등의 게임도 가능

 

 

댓글