파이썬 실전/로또 번호 생성기

파이썬 실전) 로또 번호 생성기 2. GUI화

마리사라 2021. 2. 4. 15:30
반응형

이번 강의는 이전에 만든 번호 생성 프로그램을 GUI로 만들어서 사용하기 편리하게 만드는 방법입니다.


1. 코드

파이썬 GUI를 만들기 위해서 wxPython을 사용할 예정입니다. 혹시 wxPython을 모르시는 분들은 wxPython에 대한 강의를 먼저 보고 오시는 걸 추천드립니다.

2021/01/03 - [파이썬 강의/wx] - 파이썬 GUI(wxPython) 1. 기초(Frame과 실행)

 

파이썬 GUI(wxPython) 1. 기초(Frame과 실행)

이번 강의는 wxPython의 기초인 프레임과 실행방법을 알려드리려고 합니다. 1. frame frame은 프로그램의 기본적인 틀이라고 할 수 있습니다. 프레임을 만들어준 후, 그 위에 여러 가지 기능을 넣는 형

marisara.tistory.com

 

우선 wxPython을 import합니다.

import wx

 

그 후 기본적인 Mainframe을 생성합니다.

class Mainframe(wx.Frame):
    def __init__(self, parent, id, title):

 

프레임의 크기는 마음대로 하실 수 있지만, 저는 300, 450으로 설정했습니다.

wx.Frame.__init__(self, parent, id, title, size=(300, 450))

 

이제 프레임에 여러 가지 위젯을 넣어야 합니다. 이때 sizer를 사용할 수도 있고, panel을 만들어서 고정된 위치에 넣을 수도 있습니다. 저는 panel에 넣는 형식으로 하겠습니다.

panel = wx.Panel(self)

 

이번 시간에는 시행 횟수를 입력하는 TextCtrl, 시행을 명령하는 Button, 시행 결과를 보여주는 ListBox가 필요합니다.

self.count = wx.TextCtrl(panel, id=1, pos=(5, 5))
self.count.SetHint("시행 횟수 입력")
self.generate_button = wx.Button(panel, id=2, label='생성', pos=(5, 50))
self.output = wx.ListBox(panel, id=3, choices=[], pos=(120, 5), size=(150, 400))

sizer가 아닌 panel에 넣는 경우에는 pos를 통해 위치를 지정해 주지 않으면, (0, 0)의 위치에 모두 생성되므로, 위치를 지정해 주어야 합니다.

 

이제 이전 시간에 만들었던 lotto함수를 변형할 차례입니다. 해당 함수는 원래 외부에서 입력받은 만큼 호출되었지만, 이번에는 내부에서 반복문을 통해 반복하도록 하겠습니다.

for i in range(int(self.count.GetValue())):

위의 코드로 count의 Value값(입력값)만큼 반복 시행합니다.

number = set()
while len(number) < 6:
    number.add(random.randint(1, 45))
number = list(number)
number.sort()
self.output.Append(str(number))

이때 맨 마지막 줄의 print문을 ListBox인 output에 추가(Append)하는 코드를 삽입합니다. 삽입할 때에는 문자열의 형태로만 삽입이 가능합니다.

 

Bind를 통해 버튼을 lotto함수에 연결시켜주면 버튼을 통해 시행이 가능합니다.

self.Bind(wx.EVT_BUTTON, self.lotto, id=2)

 

이제 해당 프레임을 실행하기 위한 함수를 작성해주면 실행이 가능해집니다.

def run():
    app = wx.App()
    frame = Mainframe(None, -1, 'Lotto Number Generator')
    frame.Show()
    app.MainLoop()

 

이제 실행화면입니다.

초기 실행화면

실행 화면이 칙칙해 보이실 수도 있지만, 이것은 나중에 고쳐 나가도록 하겠습니다. 또한 위치나 크기 등이 마음에 드시지 않는다면 직접 고쳐서 사용하실 수도 있습니다.

 

이제 이것이 잘 작동되는지 5번 시행하도록 입력하고 버튼을 눌러보겠습니다.

5회 생성

총 5종류의 번호가 생성됐음을 확일할 수 있습니다.


2. 마치며

이번 시간에는 로또 번호 생성기를 GUI로 만들어 보았습니다. 다음 시간부터는 프로그램에 여러 기능을 추가하는 방법을 알려 드리겠습니다.

import random
import wx


class Mainframe(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(300, 450))
        panel = wx.Panel(self)
        self.count = wx.TextCtrl(panel, id=1, pos=(5, 5))
        self.count.SetHint("시행 횟수 입력")
        self.generate_button = wx.Button(panel, id=2, label='생성', pos=(5, 50))
        self.output = wx.ListBox(panel, id=3, choices=[], pos=(120, 5), size=(150, 400))

        self.Bind(wx.EVT_BUTTON, self.lotto, id=2)

    def lotto(self, event):
        for i in range(int(self.count.GetValue())):
            number = set()
            while len(number) < 6:
                number.add(random.randint(1, 45))
            number = list(number)
            number.sort()
            self.output.Append(str(number))


def run():
    app = wx.App()
    frame = Mainframe(None, -1, 'Lotto Number Generator')
    frame.Show()
    app.MainLoop()
반응형