🎆

001 월급받아 집은 언제 살 수 있을까?

0. 스토리

notion imagenotion image
"성장만이 우리의 목표일까냥?"
대리인 No.1은 직원들이 위니브 월드 최상위층 만큼 차별없이 마땅히 누려야 할 권리와 의무를 수행하면서도, 그 가족과 친구들을 행복하게 해줄 수 있는 방법을 고민했습니다.
"주인이 나를 만든 이유는 무엇일까냥?"
라이캣의 성장, 회사를 키워 빈민가 냥이들을 고용하고, 병원을 세우고, 학교를 세우고, 돈과 무관한 일을 하면서도, 돈 버는 일에도 소흘히 하지 않았던 주인, 주인이라면 지금 어떤 행동을 할지 대리인 No.1은 고민했습니다.
"복지와 연봉을 생각하자냥!"
그리고 대리인 No.1은 복지와 연봉을 더 좋게 하는 것에 결론이 다다르게 됩니다. 물론, 회사의 재정도 생각하지 않을 수 없었어요. 이미 커질대로 커진 회사가 부담해야 하는 월 일정 금액의 임금은 상상을 초월할 만큼 큰 액수였고, 만약 조금이라도 계산이 잘못된다면, 회사가 망할수도 있으니까요.
"1억이다냥!"
대리인 No.1은 생각합니다. 모든 직원이 주 4일, 오전 10시부터 오후 5시까지만 일하고 연봉 1억을 받는 회사를요. 그것이 회사를 키워준 직원들에 대한 보답일테니까요. 그것이 열심히 일해 월급받아 집살 수 있는 사회일테니까요.
"주인이 더 큰 일을 하기 위해, 우선 직원들이 더 큰 냥이로 성장할 수 있는 발판을 만들어주자냥!"
그럼, 일년에 얼마씩을 올려주어야 할까요? 그렇게 했을 때 몇 년 안에 1억을 줄 수 있을까요?

1. 기획

 
notion imagenotion image

2. 디자인

notion imagenotion image

3. 코드

3.1 실습 전 기본 코드

import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QGroupBox, QVBoxLayout, QHBoxLayout, QLineEdit from PyQt5.QtGui import QIcon, QPixmap, QFont from PyQt5.QtCore import QCoreApplication class 대표선출프로그램(QWidget): def __init__(self): super().__init__() self.UI초기화() def UI초기화(self): self.setWindowTitle('재무 보고서를 만들어라!') self.setWindowIcon(QIcon('img/캣네생선.png')) self.setGeometry(800, 300, 400, 630) self.show() 프로그램무한반복 = QApplication(sys.argv) 실행인스턴스 = 대표선출프로그램() 프로그램무한반복.exec_()

3.2 전체 코드

import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QGroupBox, QVBoxLayout, QHBoxLayout, QLineEdit from PyQt5.QtGui import QIcon, QPixmap, QFont from PyQt5.QtCore import QCoreApplication class 월급받아집은언제(QWidget): def __init__(self): super().__init__() self.UI초기화() def UI초기화(self): self.합산 = QLabel('* 5년 월급 합: -원, \n\n* 5년 실수령액 합 : -원\n\n* 실수령액과 집값과의 차 : -원') 버튼 = QPushButton('계산하기') 버튼.clicked.connect(self.btnClick) 가로정렬 = QHBoxLayout() 가로정렬.addWidget(self.사용자입력그룹박스()) 가로정렬.addWidget(self.연봉그룹박스()) 가로정렬.addWidget(self.실수령액그룹박스()) 세로정렬 = QVBoxLayout() 세로정렬.addLayout(가로정렬) 세로정렬.addWidget(self.합산) 세로정렬.addWidget(버튼) self.setLayout(세로정렬) self.setWindowTitle('월급받아 집은 언제 살 수 있을까?') self.setWindowIcon(QIcon('img/캣네생선.png')) self.setGeometry(800, 300, 1000, 540) self.show() def 사용자입력그룹박스(self): self.월급_라벨 = QLabel('월급(만원)') self.월급_라인입력 = QLineEdit(self) self.월급_라인입력.setFixedWidth(200) self.세금_라벨 = QLabel('세금(%)') self.세금_라인입력 = QLineEdit(self) self.세금_라인입력.setFixedWidth(200) self.연인상율_라벨 = QLabel('연인상율(%)') self.연인상율_라인입력 = QLineEdit(self) self.연인상율_라인입력.setFixedWidth(200) self.집값_라벨 = QLabel('집값(억원)') self.집값_라인입력 = QLineEdit(self) self.집값_라인입력.setFixedWidth(200) self.그룹박스_사용자입력 = QGroupBox('사용자 입력 그룹박스') self.세로정렬_사용자입력 = QVBoxLayout() self.세로정렬_사용자입력.addWidget(self.월급_라벨) self.세로정렬_사용자입력.addWidget(self.월급_라인입력) self.세로정렬_사용자입력.addWidget(self.세금_라벨) self.세로정렬_사용자입력.addWidget(self.세금_라인입력) self.세로정렬_사용자입력.addWidget(self.연인상율_라벨) self.세로정렬_사용자입력.addWidget(self.연인상율_라인입력) self.세로정렬_사용자입력.addWidget(self.집값_라벨) self.세로정렬_사용자입력.addWidget(self.집값_라인입력) self.그룹박스_사용자입력.setLayout(self.세로정렬_사용자입력) self.그룹박스_사용자입력.setFixedWidth(330) return self.그룹박스_사용자입력 def 연봉그룹박스(self): self.연봉_라벨하나 = QLabel('1년 : -원') self.연봉_라벨둘 = QLabel('2년 : -원') self.연봉_라벨셋 = QLabel('3년 : -원') self.연봉_라벨넷 = QLabel('4년 : -원') self.연봉_라벨다섯 = QLabel('5년 : -원') self.그룹박스_연봉 = QGroupBox('연봉') self.세로정렬_연봉 = QVBoxLayout() self.세로정렬_연봉.addWidget(self.연봉_라벨하나) self.세로정렬_연봉.addWidget(self.연봉_라벨둘) self.세로정렬_연봉.addWidget(self.연봉_라벨셋) self.세로정렬_연봉.addWidget(self.연봉_라벨넷) self.세로정렬_연봉.addWidget(self.연봉_라벨다섯) self.그룹박스_연봉.setLayout(self.세로정렬_연봉) return self.그룹박스_연봉 def 실수령액그룹박스(self): self.실수령_라벨하나 = QLabel('1년 : -원') self.실수령_라벨둘 = QLabel('2년 : -원') self.실수령_라벨셋 = QLabel('3년 : -원') self.실수령_라벨넷 = QLabel('4년 : -원') self.실수령_라벨다섯 = QLabel('5년 : -원') self.그룹박스_실수령액 = QGroupBox('실수령액') self.세로정렬_실수령액 = QVBoxLayout() self.세로정렬_실수령액.addWidget(self.실수령_라벨하나) self.세로정렬_실수령액.addWidget(self.실수령_라벨둘) self.세로정렬_실수령액.addWidget(self.실수령_라벨셋) self.세로정렬_실수령액.addWidget(self.실수령_라벨넷) self.세로정렬_실수령액.addWidget(self.실수령_라벨다섯) self.그룹박스_실수령액.setLayout(self.세로정렬_실수령액) return self.그룹박스_실수령액 def btnClick(self): 입력값 = [] 입력값.append(float(self.월급_라인입력.text())) 입력값.append(float(self.세금_라인입력.text())) 입력값.append(float(self.연인상율_라인입력.text())) 입력값.append(float(self.집값_라인입력.text())) 일년차_연봉 = 입력값[0]*12 이년차_연봉 = 일년차_연봉*(입력값[2]+100)/100 삼년차_연봉 = 이년차_연봉*(입력값[2]+100)/100 사년차_연봉 = 삼년차_연봉*(입력값[2]+100)/100 오년차_연봉 = 사년차_연봉*(입력값[2]+100)/100 self.연봉_라벨하나.setText(f'1년 : {일년차_연봉}만원') self.연봉_라벨둘.setText(f'2년 : {이년차_연봉}만원') self.연봉_라벨셋.setText(f'3년 : {삼년차_연봉}만원') self.연봉_라벨넷.setText(f'4년 : {사년차_연봉}만원') self.연봉_라벨다섯.setText(f'5년 : {오년차_연봉}만원') self.실수령_라벨하나.setText(f'1년 : {format(일년차_연봉-일년차_연봉*입력값[1]/100,".2f")}만원') self.실수령_라벨둘.setText(f'2년 : {format(이년차_연봉-이년차_연봉*입력값[1]/100,".2f")}만원') self.실수령_라벨셋.setText(f'3년 : {format(삼년차_연봉-삼년차_연봉*입력값[1]/100,".2f")}만원') self.실수령_라벨넷.setText(f'4년 : {format(사년차_연봉-사년차_연봉*입력값[1]/100,".2f")}만원') self.실수령_라벨다섯.setText(f'5년 : {format(오년차_연봉-오년차_연봉*입력값[1]/100,".2f")}만원') 월급합 = 일년차_연봉 + 이년차_연봉 + 삼년차_연봉 + 사년차_연봉 + 오년차_연봉 실수령합 = 월급합 - 월급합*입력값[1]/100 집값차 = float(format(입력값[3]*10000-실수령합, ".0f")) if 집값차 >= 10000: self.합산.setText(f'* 5년 월급 합: {format(월급합,".0f")}만원 \n\n* 5년 실수령액 합 : {format(실수령합,".0f")}만원\n\n* 실수령액과 집값과의 차 : {int(집값차//10000)}억{int(집값차%10000)}만원') else: self.합산.setText(f'* 5년 월급 합: {format(월급합,".0f")}만원 \n\n* 5년 실수령액 합 : {format(실수령합,".0f")}만원\n\n* 실수령액과 집값과의 차 : {format(입력값[3]*10000-실수령합,".0f")}만원') 프로그램무한반복 = QApplication(sys.argv) 실행인스턴스 = 월급받아집은언제() 프로그램무한반복.exec_()
 

4. 상세 내용

Ch.1에서 이 챕터로 바로 오신 분들은 모든 코드를 다 이해하실 수 없을 것입니다. 처음에 말씀드렸던 것처럼, 일단 모든 예제를 타이핑 해보신다 생각하시고, 끝까지 따라 작성하신 다음, 모르는 부분은 상세 페이지로 들어가서 확인해보세요!
아래 코드는 이 프로그램의 핵심인 사용자 입력값을 받아오는 코드입니다.
 
버튼 = QPushButton('계산하기') 버튼.clicked.connect(self.btnClick)
def btnClick(self, text): #사용자입력그룹박스에서 받아온 값들을 리스트로 정리함 입력값 = [] 입력값.append(float(self.월급_라인입력.text())) 입력값.append(float(self.세금_라인입력.text())) 입력값.append(float(self.연인상율_라인입력.text())) 입력값.append(float(self.집값_라인입력.text()))
  • 사용자 입력 그룹박스에서 값을 받아옵니다.
  • 버튼을 클릭했을 경우 값을 받아와야 하므로 버튼 초기화 시 클릭 이벤트를 같이 정의해줍니다. 이 버튼의 클릭 이벤트는 'btnClick'이라는 함수에 정의되어 있군요.
  • 사용자가 입력하는 값들은 총 4개입니다. 1개일 경우에는 lambda함수를 사용해서 값을 받아올 수도 있지만(생선가게 POS기 만들기 - 2 참고) 값이 여러개이므로 '입력값'이라는 리스트를 통해 값을 받아옵니다.
  • 세금과 같은 경우에는 소숫점일수도 있으니 float형으로 형 변환해주었습니다.
 
#월급그룹박스 라벨 값 변경부분 일년차_연봉 = 입력값[0] 이년차_연봉 = 일년차_연봉*(입력값[2]+100)/100 삼년차_연봉 = 이년차_연봉*(입력값[2]+100)/100 사년차_연봉 = 삼년차_연봉*(입력값[2]+100)/100 오년차_연봉 = 사년차_연봉*(입력값[2]+100)/100 self.월급_라벨하나.setText(f'1년 : {일년차_연봉}만원') self.월급_라벨둘.setText(f'2년 : {이년차_연봉}만원') self.월급_라벨셋.setText(f'3년 : {삼년차_연봉}만원') self.월급_라벨넷.setText(f'4년 : {사년차_연봉}만원') self.월급_라벨다섯.setText(f'5년 : {오년차_연봉}만원') #실수령액그룹박스 라벨 값 변경부분 self.실수령_라벨하나.setText(f'1년:{format(일년차_연봉-일년차_연봉*입력값[1]/100,".2f")}만원') self.실수령_라벨둘.setText(f'2년:{format(이년차_연봉-이년차_연봉*입력값[1]/100,".2f")}만원') self.실수령_라벨셋.setText(f'3년:{format(삼년차_연봉-삼년차_연봉*입력값[1]/100,".2f")}만원') self.실수령_라벨넷.setText(f'4년:{format(사년차_연봉-사년차_연봉*입력값[1]/100,".2f")}만원') self.실수령_라벨다섯.setText(f'5년:{format(오년차_연봉-오년차_연봉*입력값[1]/100,".2f")}만원')
  • 이렇게 가져온 값은 setText로 각각 라벨에 입력해줍니다.
  • 연봉 계산 방법 : n년차 연봉 * (연인상률 + 100) / 100
  • 실수령액 계산 방법 : n년차 연봉 - n년차 연봉 * 세금 / 100
 

5. 실행 화면

 
notion imagenotion image
 
notion imagenotion image