3. main 분리하기

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 생성 후 적용하기
더보기









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에서 인자 처리, 설정 파일 로드, 로깅 초기화 등
- “앱 전체”에 관련된 초기화 코드를 넣기 쉬움