1. widget.py 기본 템플릿 문제 확인

더보기

1.1. 현재 상황

qt for python 프로젝트를 실행하면 main.py가 아니라 widget.py가 시작 파일로 설정되어 있습니다.

구조와 유지보수, 교육 측면에서는 main.py를 시작 파일로 두는 쪽이 더 합당합니다.

 

 

 

1.2. 구조상 아쉬운 점

  • PyCharm 실습 확인
  • 역할 분리(SRP)” 측면
    • Widget 클래스는 UI(화면) 를 정의하는 역할
    • QApplication 생성, 프로그램 시작/종료 관리 등은 앱 실행부 역할
    • 이 둘을 한 파일에 섞어 놓으면 프로젝트가 조금만 커져도 “UI + 실행부 + 로직” 이 한 파일에 엉키는 구조가 되기 쉽습니다.
  • 확장/리팩터링 시 제약
    • 나중에 QMainWindow로 바꾸거나
    • 여러 화면, 여러 위젯, 여러 탭, 서브 윈도우들을 만들고 싶을 때
      → widget.py가 실행 파일이면 구조를 다시 뜯어고치는 일이 생기기 쉽습니다.

 

 

1.3. 권장 구조

  • 권장 패턴: main.py + widget.py 역할 분리

2. main.py 생성 후 적용하기

더보기

PyCharm main 분리하기 자료, 참고합니다.

 

1.8 main 분리하기

이번 단계에서는 PySide6 프로그램을 한 파일에서 작성하는 방식에서 벗어나, 실행 코드와 화면 코드를 나누는 방법을 학습합니다.1. 이전 단계 코드 분리하기더보기1.1 두번째 디렉토리를 생성하

basiclike.tistory.com

 

 

 

# widget.py

from PySide6.QtWidgets import QWidget
from ui_form import Ui_Widget

class Widget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_Widget()
        self.ui.setupUi(self)
# main.py

import sys
from PySide6.QtWidgets import QApplication

from widget import Widget

if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = Widget()
    widget.show()
    sys.exit(app.exec())

3. 권장 구조

더보기

3.1. widget.py

# widget.py
from PySide6.QtWidgets import QWidget, QVBoxLayout, QPushButton, QLabel

class Widget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle("QTabWidget 데모")
        self.resize(300, 100)

        self.label = QLabel("메인 위젯입니다.")
        self.btn = QPushButton("클릭")

        self.layout = QVBoxLayout(self)
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.btn)
  • 여기에는 QApplication, app.exec() 같은 실행 코드 없음
  • 그냥 “화면이 어떤 모양인지”만 정의

 

3.2. main.py

# main.py
import sys
from PySide6.QtWidgets import QApplication

from widget import Widget

if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = Widget()
    widget.show()
    sys.exit(app.exec())

이렇게 하면:

  • “프로그램의 시작은 항상 main.py” 라는 규칙이 생깁니다.
  • UI 관련 코드는 widget.py로 분리 → 구조가 훨씬 깔끔
  • 나중에:
    • main.py에서 인자 처리, 설정 파일 로드, 로깅 초기화 등
    • “앱 전체”에 관련된 초기화 코드를 넣기 쉬움