Qt/PyQt5 강좌

정수를 읽어서 한글로 변환해주는 pyQt5 예제

webnautes 2024. 8. 18. 22:45
반응형

정수를 읽어서 한글로 변환해주는 pyQt5 예제입니다.



2024. 8. 13  최초작성







import sys 
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit, QLabel
from PyQt5.QtGui import QValidator 
from PyQt5.QtCore import Qt 

def num_to_korean(num):
    units = ['', '일', '이', '삼', '사', '오', '육', '칠', '팔', '구'# 1~9 한글 표현
    tens = ['', '십', '백', '천'# 십, 백, 천 단위
    large_units = ['', '만', '억', '조'# 만, 억, 조 단위
   
    if num == 0:
        return '영'  # 0일 경우 '영' 반환
   
    result = ''  # 결과 문자열 초기화
    unit_count = 0  # 큰 단위(만, 억, 조) 카운터 초기화
   
    while num > 0:
        block = num % 10000  # 4자리씩 블록 나누기
        block_result = ''  # 현재 블록의 결과 문자열 초기화
       
        for i in range(4):
            digit = block % 10  # 현재 자릿수 추출
            if digit != 0:
                if i > 0:
                    block_result = tens[i] + block_result  # 십, 백, 천 단위 추가
                if digit != 1 or i == 0:
                    block_result = units[digit] + block_result  # 1~9 한글 표현 추가
            block //= 10  # 다음 자릿수로 이동
       
        if block_result:
            if unit_count > 0:
                block_result += large_units[unit_count]  # 만, 억, 조 단위 추가
            result = block_result + result  # 전체 결과에 현재 블록 결과 추가
       
        unit_count += 1  # 다음 큰 단위로 이동
        num //= 10000  # 다음 4자리 블록으로 이동
   
    return result  # 최종 변환 결과 반환

class NumberValidator(QValidator):
    def validate(self, string, position):
        if string == "":
            return (QValidator.Acceptable, string, position)  # 빈 문자열 허용
        try:
            num = int(string)
            if 0 <= num <= 9999_9999_9999_9999:  # 0부터 9999999999999999까지 허용
                return (QValidator.Acceptable, string, position)
        except ValueError:
            pass
        return (QValidator.Invalid, string, position)  # 유효하지 않은 입력 거부

class NumberToKoreanConverter(QWidget):
    def __init__(self):
        super().__init__() 
        self.initUI() 
       
    def initUI(self):
       
        layout = QVBoxLayout()  # 수직 레이아웃 생성
       
        self.number_input = QLineEdit()  # 입력 필드 생성
        self.number_input.setPlaceholderText('0부터 999999999999까지의 정수를 입력하세요'# 빈칸에 보여지는 플레이스 홀더 설정
        self.number_input.setValidator(NumberValidator())  # 유효성 검사기 설정
        self.number_input.textChanged.connect(self.updateLabel)  # 텍스트 변경 시 updateLabel 메서드 연결
        layout.addWidget(self.number_input)  # 레이아웃에 입력 필드 추가
       
        self.result_label = QLabel('결과가 여기에 표시됩니다'# 결과 표시 라벨 생성
        layout.addWidget(self.result_label)  # 레이아웃에 결과 라벨 추가
       
        self.setLayout(layout)  # 위젯에 레이아웃 설정
        self.setWindowTitle('숫자를 한글로 변환'# 윈도우 제목 설정
        self.setGeometry(300, 300, 500, 150# 윈도우 위치와 크기 설정
       
    def updateLabel(self, text):
        if text:
            num = int(text)  # 입력된 텍스트를 정수로 변환
            korean = num_to_korean(num)  # 숫자를 한글로 변환
            self.result_label.setText(korean)  # 결과 라벨에 한글 표현 설정
        else:
            self.result_label.setText('숫자를 입력하세요'# 입력이 없을 경우 안내 메시지 표시

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Period or event.key() == Qt.Key_Minus:
            return  # 소수점(.)이나 마이너스(-) 키 입력 무시
        super().keyPressEvent(event)  # 다른 키 입력은 부모 클래스의 이벤트 처리기로 전달

if __name__ == '__main__':
    app = QApplication(sys.argv)  # QApplication 인스턴스 생성
    converter = NumberToKoreanConverter()  # NumberToKoreanConverter 인스턴스 생성
    converter.show()  # 윈도우 표시
    sys.exit(app.exec_())  # 이벤트 루프 시작





반응형