Appia의 IT세상

파이썬[Python GUI, PyQt5 Tutorial 015] 체크박스(QCheckBox)활용 - ToDo(To-Do) 리스트 어플 만들기 본문

Python/Python PyQt5 (GUI)

파이썬[Python GUI, PyQt5 Tutorial 015] 체크박스(QCheckBox)활용 - ToDo(To-Do) 리스트 어플 만들기

Appia 2020. 6. 29. 07:12
반응형

파이썬[Python GUI, PyQt5 Tutorial 015] 

체크박스(QCheckBox)활용 - ToDo(To-Do) 리스트 어플 만들기

 

이번 포스팅에서는 앞선 배운 부분을 활용해서 ToDo 리스트 ToDo(To-Do) 리스트 어플 만들기를 한번 해볼까 합니다.  일단 코딩을 하기 전에 간단히 GUI디자인을 해봤습니다. 

To-Do List 샘플 

일단 위젯은 총 3가지를 사용할 예정입니다. 

QPushButton

QLineEdit

QCheckBox

그리고, QLineEdit를 통해서 ToDoList 항목을 입력하고, Add Item(QPushButton)을 통해서 QCheckBox에 하나씩 추가할 예정입니다. 그리고 추가된 To-Do List는 우측에 있는 Del(QPushButton)을 통해서 QCheckBox)을 삭제할 수 있습니다. 이 부분을 조금 정리해보겠습니다. 

 

이벤트 처리 

Add Item - QLineEdit에 입력된 텍스트를 바탕으로 QCheckBox 생성 

Del - 그 열에 있는 QCheckBox를 삭제 

 

위와 같은 형태로 2가지 이벤트를 연결할 예정입니다. 먼저 전체 코드를 한번 살펴보겠습니다. 

import sys
 
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QCheckBox,QGridLayout
 
 
class QtGUI(QWidget):
 
 
    def __init__(self):
 
        super().__init__()
 
        self.num = 0
 
        self.setWindowTitle("Appia Qt GUI")
 
        self.resize(300500)
 
        self.qclist = []
 
        self.position = 0
 
        self.Lgrid = QGridLayout()
 
        self.setLayout(self.Lgrid)
 
        self.lineedit = QLineEdit(self)
 
        self.Lgrid.addWidget(self.lineedit,10,0)
 
        addbutton = QPushButton('Add Item',self)
 
        self.Lgrid.addWidget(addbutton,10,1)
 
        addbutton.clicked.connect( self.add_item)
 
        self.show()
 
 
    def add_item(self):
    
        if self.position < 10 :
 
            print(self.lineedit.text())
            
            qc1 = QCheckBox(self.lineedit.text(), self)
            
            qcb = QPushButton("Del..",self)
            
            self.Lgrid.addWidget(qc1,self.position,0)
            
            self.Lgrid.addWidget(qcb,self.position,1)
            
            self.position = self.position + 1
 
            qcb.clicked.connect(lambda:self.del_qcbox(qc1,qcb))
 
 
    def del_qcbox(self,qc,qb):
    
        qc.deleteLater()
        
        qb.deleteLater()
        
        self.position = self.position - 1
 
 
if __name__ == '__main__':
 
    app = QApplication(sys.argv)
 
    ex = QtGUI()
 
    app.exec_()
cs

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

예제 코드 실행화면 

 

위에 보이는 Add Item 버튼을 클릭시 동작하는 이벤트 부터 살펴보겠습니다. 

class QtGUI(QWidget):
 
    def __init__(self):
 
        super().__init__()
 
        self.num = 0
 
        self.setWindowTitle("Appia Qt GUI")
 
        self.resize(300500)
 
        self.qclist = []
 
        self.position = 0
        
    .... 중략 ....
    
        addbutton.clicked.connect( self.add_item)
 
    .... 중략 ....
 
 
    def add_item(self):
    
        if self.position < 10 :
 
            print(self.lineedit.text())
            
            qc1 = QCheckBox(self.lineedit.text(), self)
            
            qcb = QPushButton("Del..",self)
            
            self.Lgrid.addWidget(qc1,self.position,0)
            
            self.Lgrid.addWidget(qcb,self.position,1)
            
            self.position = self.position + 1
 
            qcb.clicked.connect(lambda:self.del_qcbox(qc1,qcb))
cs

먼저 버튼을 클리시에 add_item함수가 실행되도록 하였습니다. 여기에서 살펴보면, 체크 박스와 Del.. 버튼을 하나씩 생성합니다. 생성시에 position이라는 변수에 저장된 값을 통해서 그리드 레이아웃에 맞게 위치하게 합니다.  그리고 postion이라는 부분에 1씩을 더해줍니다. 그럼, 위의 예제 코드에 하나를 QLineEdit에 입력하고 실행한 부분을 살펴보겠습니다. 그리고 제가 윈도우 창을 생각해서 ToDoList 아이템 생성을 10개로만 제약을 두었습니다. 

제가 'Upload BlogPost'라는 내용을 Add Item을 했더니, 체크 박스와 Del... 버튼이 생성되었습니다. 그럼 여기에서 Del.. 버튼의 이벤트에 대해서 한번 살펴보겠습니다. 

    def del_qcbox(self,qc,qb):
    
        qc.deleteLater()
        
        qb.deleteLater()
        
        self.position = self.position - 1
cs

위에서 버튼을 생성할 때 연결된 이벤트를 보면, 버튼과 체크박스를 인자로 받습니다. 그리고 두가지 다 삭제를 합니다. 여기에서 반드시 position 부분에 수치를 조정해주셔야 합니다. 이 부분만 해주시면 간단합니다. 

 

만약에 이와 같이 위젯을 추가하실 경우 절대 위치는 안됩니다. 그래서 저의 경우도 그리드 레이아웃을 활용했습니다. 전체 코드는 다음과 같이 첨부드리니, 참조하시길 바랍니다. 

QT_Tutorial_015_TODO.py
0.00MB

 

오늘은 파이썬[Python GUI, PyQt5 Tutorial 015] 체크박스(QCheckBox)활용 - ToDo(To-Do) 리스트 어플 만들기라는 주제로 간단한 TO-DO List를 생성해봤습니다. 혹시 궁금하신 점이나 문의 사항이 있으시면 언제든지 댓글 및 방명록에 글 남겨주시길 바랍니다. 감사합니다. 

반응형
Comments