기본 위젯 응용

Siwoo Pak·2024년 2월 29일
0

1.UI 파일 생성

  • 이번에 만들어 볼 UI

    1-1) 레이아웃과 위젯 배치
  • 이름, 나이, 클릭버튼 부분 horizontal layout으로 배치
  • 이름, 나이 레이아웃 부분에 Text Label, Line Edit 배치
  • 클릭 버튼 레이아웃엔 Push Button 배치
  • 클릭 버튼 레이아웃 아래 부분에 Text Label 배치
    1-2) 속성 편집
  • 해당 Text Label에 '이름', '나이', '결과'로 변경하고 Push Button도 'Click'으로 변경
  • 해당 부분을 더블 클릭해서 변경하거나 속성편집기에서 변경가능
  • 각 속성에 나온 대로 변경
  • 변경 후 UI
  • 크기 조정시 자동으로 조정되기 위해 central widget을
    Vertical Layout으로 변경 후 최종 UI

    1-3) 소스
import sys
import os
import re
from PySide6 import QtUiTools, QtGui
from PySide6.QtWidgets import QApplication, QMainWindow

loader = QtUiTools.QUiLoader()


class MainView(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()

    def setupUI(self):
        global UI_MAIN
        UI_MAIN = loader.load(resource_path("btnTest.ui"))
        # 이름 라인에디트를 입력했을때 이벤트
        UI_MAIN.lineEdit_name.textChanged.connect(checkName)
        # 나이 라인에디트를 입력했을 이벤트
        UI_MAIN.lineEdit_age.textChanged.connect(checkAge)
        # Click 버튼을 클릭했을때
        UI_MAIN.pushButton_click.clicked.connect(getResult)

        self.setCentralWidget(UI_MAIN)
        self.setWindowTitle("BUTTON_TEST")
        self.setWindowIcon(QtGui.QPixmap(resource_path("ani.jpg")))
        self.resize(500, 300)
        self.show()


# 라인 에디터의 내용을 가져와서 결과라벨에 출력
def getResult():
    user_name = UI_MAIN.lineEdit_name.text()
    user_age = UI_MAIN.lineEdit_age.text()

    result = user_name + "님의 나이는 " + user_age + "살입니다."
    UI_MAIN.label_result.setText(result)


# 이름 라인에디트의 글자만 입력하게 체크하는 함수
def checkName(data):
    name = data if data.isalpha() else data[:-1]
	UI_MAIN.lineEdit_name.setText(name)


# 나이 라인 에디트의 숫자만 입력하게 체크하는 함수
def checkAge(data):
    # 매개변수 input_age가 숫자인 경우 age 변수에 대입, 숫자가 아닌 경우 입력된 문자를 제거
    try:
        int(data)
        age = data
    except:
        # 변경시마다 발생하는 이벤트이기에, 숫자 외에 다른 문자가나 기호가 입력될시 실행되는 부분
        age = data[:-1]
    
    UI_MAIN.lineEdit_age.setText(age)
    

# 파일경로
# pyinstaller로 원파일로 압축할때 경로 필요함
def resource_path(rel_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, rel_path)
    return os.path.join(os.path.abspath("."), rel_path)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainView()
    # main.show()
    sys.exit(app.exec())
  • checkName 함수의 경우 isalpha()가 특수 문자도 문자로 포함하기에 정규식을 통해서 더 간단하게 수정, checkAge 함수도 같이 변경
def checkName(data):    
    # 정규 표현식을 사용해서 한글과 영어만 들어오게
    # \uAC00-\uD7A3 : 한글, a-zA-Z: 영어 대소문자
	name = re.sub(r"[^\uAC00-\uD7A3a-zA-Z\s]", "", data)
    UI_MAIN.lineEdit_name.setText(name)
    

def checkAge(data):
    age = re.sub(r"[^0-9]", "", data)
    UI_MAIN.lineEdit_age.setText(age)
  • 여기서 좀 더 간단하게 공통적인 부분을 빼서 코드를 작성
def checkName(data):
    check(data, "name")


def checkAge(data):
    check(data, "age")


def check(data, types):
    if types == "name":
        name = re.sub(r"[^\uAC00-\uD7A3a-zA-Z\s]", "", data)
        UI_MAIN.lineEdit_name.setText(name)
    else:
        age = re.sub(r"[^0-9]", "", data)
        UI_MAIN.lineEdit_age.setText(age)
  • 여기서 클로저 함수를 쓰면 함수 3개를 함수 1개로 줄일 수 있다.
# 위의 코드부분도 변경
# 이름 라인에디트를 입력했을때 이벤트
UI_MAIN.lineEdit_name.textChanged.connect(check("name"))
# 나이 라인에디트를 입력했을 이벤트   
UI_MAIN.lineEdit_age.textChanged.connect(check("age"))


def check(send_type):
    def check_type(data):
        if send_type == "name":
            chk_name = re.sub(r"[^\uAC00-\uD7A3a-zA-Z\s]", "", data)
            UI_MAIN.lineEdit_name.setText(chk_name)
        else:
            chk_age = re.sub(r"[^0-9]", "", data)
            UI_MAIN.lineEdit_age.setText(chk_age)
    return check_type
  • main.py 실행 화면
profile
'하루를 참고 인내하면 열흘을 벌 수 있고 사흘을 참고 견디면 30일을, 30일을 견디면 3년을 벌 수 있다.'

0개의 댓글