Appia의 IT세상

파이썬[Python GUI, PyQt5 Tutorial 009]버튼(QPushButton), 라벨(QLabel)을 이용한 특정 번호 포함된 로또 번호 생성기 본문

Python/Python PyQt5 (GUI)

파이썬[Python GUI, PyQt5 Tutorial 009]버튼(QPushButton), 라벨(QLabel)을 이용한 특정 번호 포함된 로또 번호 생성기

Appia 2020. 6. 21. 07:02
반응형

파이썬[Python GUI, PyQt5 Tutorial 009]

버튼(QPushButton),라벨(QLabel)을 이용한 특정번호 포함된 로또번호 생성기

 

이번 포스팅은 앞선 포스팅에 조금 개선된 버전을 한번 만들어봤습니다. 최근에 로또 번호 생성기 관련된 부분을 지인에게 전달하니, 이 번호는 반드시 포함된 숫자 번호를 생성했으면 좋겠다는 요구사항을 받았습니다. 그래서 이번에는 관련된 요구사항이 포함된, 선택된 번호가 포함된 로또 번호를 생성하는 부분을 기존 코드와 PyQt5를 활용하여 작성해봤습니다. 먼저, 전체 코드를 한번 검토해보겠습니다. ( 하단 관련 코드 파일 첨부)

import sys
 
from random import *
 
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton
 
 
class QtGUI(QWidget):
 
 
    def __init__(self):
    
        super().__init__()
        
        self.setWindowTitle("Lotto Number Generator")
        
        self.resize(360400)
        
        self.intialL1 = 'Recommend Lotto Number'
        
        # 추천 숫자 표시 
        
        self.intialL2 = 'None, None, None, None, None, None'
 
        # 사전 선택된 번호가 저장될 리스트
        
        self.selected_num= []
 
        #숫자 버튼에 사용될 부분
        
        self.index = 1
        
        self.but_list=[]
    
        label1 = QLabel(self.intialL1 , self)
        
        label1.move(10,10)
 
        label2 = QLabel(self.intialL2, self)
        
        label2.move(1050)
 
        # 숫자 버튼 생성 
        
        for i in range(1,46):
        
            self.make_button_num(self.index)
            
            self.index = self.index+ 1
        
        # 로또 번호 생성 버튼 생성 
        
        button = QPushButton('Generate', self)
        
        button.move(20350)
        
        button.clicked.connect(lambda: self.print_label(label2))
        
        # 선택 번호 초기화 
        
        button1 = QPushButton('refresh', self)
        
        button1.move(100350)
        
        button1.clicked.connect(self.refresh_but)
 
        self.show()
 
 
    def Make_Number(self):
    
        Number = []
        
        Number.extend(self.selected_num)
 
        while len(Number) < 6:
        
            v=randint(145)
            
            if v not in Number :
            
                Number.append(v)
 
        return Number
 
 
    def make_button_num(self, index):
    
        button = QPushButton(str(index), self)
        
        button.resize(30,30)
        
        w = 0
        
        v = 0
        
        if index < 11 :
        
            w = 100
            
            v = index
            
        elif index < 21 :
        
            w = 150
            
            v = index - 10
            
        elif index < 31 :
        
            w = 200
            
            v = index - 20
            
        elif index < 41 :
        
            w = 250
            
            v = index - 30
            
        else :
        
            w = 300
            
            v = index - 40
 
        button.move(v*30,w )
        
        self.but_list.append(button)
        
        button.clicked.connect(lambda :self.inputnum(button))
 
 
    def print_label(self,label):
    
        Number = self.Make_Number()
        
        Number.sort()
        
        label.setText(str(Number))
 
 
    def inputnum(self,button):
    
        if len(self.selected_num) < 5:
        
            self.selected_num.append(int(button.text()))
            
            button.setEnabled(False)
 
 
    def refresh_but(self):
    
        self.selected_num =[]
        
        for i in self.but_list:
        
            i.setEnabled(True)
 
 
if __name__ == '__main__':
 
    app = QApplication(sys.argv)
    
    ex = QtGUI()
    
    app.exec_()
cs

 

위의 코드를 실행하면 먼저 다음과 같은 GUI가 나타납니다. 

위의 예제 실행 화면 

먼저, 각 숫자를 5개 까지 선택할 수 있습니다. 6개까지는 선택이 안되게 하였습니다. 0개에서부터 5개 까지 선택하시고, Generate 버튼을 누르시면 관련된 숫자들이 포함된 추천 번호들이 상단에 표시됩니다. 그리고, refresh 버튼을 클릭하시면, 선택된 숫자들이 초기화 됩니다. 참고로 숫자를 한번 선택하시면 해제가 안됩니다. 해제시 refresh버튼 이용하시길 바랍니다. 

 

그럼 관련 코드에 대해서 간단히 설명 해드리도록 하겠습니다. 먼저 가장 공수가 많이들 수 있는 숫자 버튼을 생성할 때 버튼을 하나씩 생성하는 것을 고려하다가, 너무나 많은 숫자들이 존재하여 여기에서 반복문을 통해서 생성하였습니다. 

 

숫자 버튼 생성 관련 함수 / 숫자 버튼 클릭시 동작 함수 

    def make_button_num(self, index):
    
        button = QPushButton(str(index), self)
        
        button.resize(30,30)
        
        w = 0
        
        v = 0
        
        if index < 11 :
        
            w = 100
            
            v = index
            
        elif index < 21 :
        
            w = 150
            
            v = index - 10
            
        elif index < 31 :
        
            w = 200
            
            v = index - 20
            
        elif index < 41 :
        
            w = 250
            
            v = index - 30
            
        else :
        
            w = 300
            
            v = index - 40
 
        button.move(v*30,w )
        
        self.but_list.append(button)
        
        button.clicked.connect(lambda :self.inputnum(button))
 
 
    def inputnum(self,button):
    
        if len(self.selected_num) < 5:
        
            self.selected_num.append(int(button.text()))
            
            button.setEnabled(False)
cs

 

먼저 위에서는 Index를 통해서 각 버튼의 숫자를 생성하였습니다. 또한 관련된 Index를 통해서 각 숫자들에 맞게 위치하게 작업을 하엿씁니다. 그런 후에 각 버튼들을 __init__ 부분에 위치한 버튼 관련 리스트에 추가하였습니다. (향후 refresh를 위해서 접근이 가능해야 합니다.) 

 

또한, 숫자가 눌러지면, 각 숫자들은 2번 눌려지게 하지 않게 하기 위해서 별도의 함수를 통해서 버튼의 text를 int형으로 선택된 숫자관련 리스트에 추가하였습니다. 그런 후에 버튼은 비활성화 하게 작성하였습니다. 단, 6개의 숫자가 선택된다면 무의미 하기 때문에 5개의 숫자만 선택이 가능하게 if문을 통해서 버튼이 선택되면 저장되는 리스트의 갯수를 보고 그 다음 행동을 하게 하였습니다. 

 

refresh 버튼 클릭시 동작 함수

    def refresh_but(self):
    
        self.selected_num =[]
        
        for i in self.but_list:
        
            i.setEnabled(True)
cs

위의 코드에서 보시는 바와 같이 refresh 버튼을 눌렸을 때 기존에 저장된 리스트를 초기화 하지 않으면, 아무런 의미가 없이 버튼만 클릭할 수 있게 됩니다. 따라서 처음 보이는 self.selected_num=[] 부분을 반드시 추가해주셔야 합니다. 그런후에 기존에 버튼들이 저장된 리스트를 슬라이싱하면서 setEnabled(True)로 활성화 해줍니다. 위의 코드 관련된 파일은 다음과 같이 첨부하였습니다. 

QT_Tutorial_009.py
0.00MB

파이썬[Python GUI, PyQt5 Tutorial 008] PyQt5 버튼(QPushButton)과 라벨(QLabel)을 이용한 로또 번호 생성기

 

이번 포스팅은 파이썬[Python GUI, PyQt5 Tutorial 009]버튼(QPushButton), 라벨(QLabel)을 이용한 특정 번호 포함된 로또 번호 생성기 라는 주제로 이전에 포스팅했던 부분에 몇가지 기능을 추가해봤습니다. 혹시 궁금하신 점이나 문의 사항이 있으시면 언제든지 댓글 및 방명록에 글 남겨주기실 바랍니다. 감사합니다. 

반응형
Comments