8강. main 분리하기

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

1.2. 첫번째 예제(링크)의 소스 코드를, main.py 에 복사합니다.
main.py
import sys
from PySide6.QtWidgets import QApplication, QWidget
app = QApplication(sys.argv)
widget = QWidget()
widget.show()
sys.exit(app.exec())

1.3. QWidget 에 세부 설정 2가지 추가해보기
main.py
import sys
from PySide6.QtWidgets import QApplication, QWidget
app = QApplication(sys.argv)
widget = QWidget()
widget.setWindowTitle("QWidget 예시") # 추가 1
widget.resize(300, 200) # 추가 2
widget.show()
app.exec()

| 코드 | 설명 |
| setWindowTitle() | 창 제목을 설정합니다. |
| resize(300, 200) | 창 크기를 가로 300, 세로 200으로 설정합니다. |
창 제목과 창 크기 지정 디자인을 소스 코드에서 직접 수동으로 구현해야 함을 기억합니다.
이 방식은 창을 직접 만들고, 그 창의 크기와 제목과 같은 속성을 코드에서 하나씩 설정하는 방식입니다.
문제는, 프로그램이 커지면 이런 속성 지정 코드가 계속 늘어나고, 실행 코드와 함께 작성하면 가독성이 떨어집니다.
1.4. "widget 디자인" 로직 → 사용자 정의 디자인 클래스로 분리하기
이제 QWidget 을 main.py 에서 직접 구현하는 대신,
QWidget 관련 로직을 별도의 파일에 분할해 보겠습니다.
새 파이썬 파일을 만들고, 이름을 widget_test.py로 지정합니다.
widget_test.py
from PySide6.QtWidgets import QWidget
class MyWidget(QWidget): # 사용자 정의 클래스
def __init__(self):
super().__init__()
self.setWindowTitle("사용자 정의 클래스 예시")
self.resize(300, 200)

1.5. main.py 파일에서 작성한 widget 부분을, widget_test.py 의 MyWidget 으로 대체합니다.
main.py
import sys
from PySide6.QtWidgets import QApplication, QWidget
from mainwindow import MyWidget
app = QApplication(sys.argv)
widget = MyWidget()
# widget.setWindowTitle("QWidget 예시") # 추가 1 제거, MyWidget 에 구현
# widget.resize(300, 200) # 추가 2 제거, MyWidget 에 구현
widget.show()
sys.exit(app.exec())


1.6. main.py 실행합니다.

widget_test.py 파일의 크기, 제목을 수정하면서, main에서 실행된 위젯에 반영되는지 확인합니다.
2. main.py 로 만들기
2.1. 왜 main.py를 분리할까?
PySide6 프로그램은 크게 두 가지 역할로 나누어 생각할 수 있습니다.
| 구분 | 역할 | 비유 |
|---|---|---|
main.py |
프로그램을 시작하고 실행 흐름을 관리하는 파일 | 프로그램의 시작 버튼 |
widget_test.py |
화면에 표시될 창 클래스를 정의하는 파일 | 창의 설계도 |
핵심 포인트widget_test.py는 화면을 어떻게 만들지 적어 둔 파일입니다.
실제로 실행해야 하는 파일은 main.py입니다.
2.2. 프로젝트 파일 구조
프로그램에서는 보통 역할에 따라 파일을 나눕니다.
main.py
→ 프로그램을 시작하는 파일
widget_test.py
→ 화면 클래스를 정의하는 파일
project/
├── main.py
└── widget_test.py
2.3. widget_test.py 는 화면을 만드는 파일입니다.
from PySide6.QtWidgets import QWidget
class MyWidget(QWidget): # 사용자 정의 클래스
def __init__(self):
super().__init__()
self.setWindowTitle("사용자 정의 클래스 예시")
self.resize(300, 200)
2.4. main.py 만들기
main.py 파일에서는 프로그램 실행 코드 역할을 하도록 정리합니다.
import sys
from PySide6.QtWidgets import QApplication, QWidget
from mainwindow import MyWidget
app = QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec())
2.5. 더 좋은 main 구조 만들기
메인 함수는 프로그램의 시작 흐름을 한곳에 모으기 위해 사용합니다.
import sys
from PySide6.QtWidgets import QApplication
from widget_test import MyWidget
if __name__ == "__main__":
app = QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec())

또는 아래와 같이 main() 역할을 별도의 함수로 묶을 수 있습니다.
import sys
from PySide6.QtWidgets import QApplication
from mainwindow import MyWidget
def main():
app = QApplication(sys.argv)
widget = MyWidget()
widget.show()
return app.exec()
if __name__ == "__main__":
sys.exit(main())
2.6. if __name__ == "__main__": 의미
if __name__ == "__main__":
sys.exit(main())
이 파일이 직접 실행될 때만 main() 함수를 실행하라.
예를 들어 터미널에서 이렇게 실행하면:
python main.py
main() 함수가 실행됩니다.
하지만 다른 파일에서 main.py를 import 할 때는 자동 실행되지 않습니다.
프로그램이 작을 때는 한 파일에 모든 소스코드를 작성해도 됩니다.
하지만 프로그램이 커질수록 화면 코드와 실행 코드를 분리해야 관리하기 쉽고, 협업하기 쉽습습니다.
그래서 widget_test.py 와 같이 화면 클래스를 별도로 작성하고, main.py에서는 실행 관련 로직만 작성합니다.
핵심 정리
main.py는 프로그램의 시작점입니다.
widget_test py는 화면 클래스를 정의하는 파일입니다.
프로그램이 커질수록 실행 코드와 화면 코드를 분리하는 습관이 중요합니다.
3. 파이참 시작 파일 설정
3.4. 파이참 시작 파일 설정
Run/debug configurations | PyCharm Documentation Run/debug configurations | PyCharm www.jetbrains.com
basiclike.tistory.com
파일을 여러개의 파일로 분할하여 개발 한 뒤에는
PyCharm에서 실행시 시작 파일을 잘못 선택하는 경우가 많습니다.
예를 들어 widget_test.py를 실행하면 창이 뜨지 않거나, 원하는 결과가 나오지 않을 수 있습니다.
위 링크와 같이 설정하면, PyCharm에서 항상 main.py를 기준으로 프로그램을 실행할 수 있습니다.