새로운 프로그래밍 언어를 시작할 때
Hello World 를 출력해보는 것은
커니핸과 리치의 'C 프로그래밍 언어' 이후
전통과도 같습니다.
그냥 의미없이 하는 전통이 아니라
테스트를 완료함으로써
프레임워크의 기본 구조에 대한
인사이트를 얻을 수 있습니다.
Hello World 테스트는 파이썬 같이
5초만에 시작할 수 있는 언어가 있는 반면
어떤 프레임워크는 세팅 시간만
몇시간 걸리는 경우도 있습니다.
최근의 GUI 프레임워크들도
그렇게 세팅이 어렵지는 않지만
그렇다고 이해가 아주 쉽지는 않습니다.
이럴 때 Hello World 예제를 테스트
해보는 것이 도움이 됩니다.
가장 기본이 되는 예제입니다.
QWidget 을 상속한
클래스로 윈도우를 만들어서
메인 루프에 돌립니다.
GUI니까 레이블을 붙여서
Hello World 를 출력할 수 있습니다.
이 때 사용한 레이아웃은
QGridLayout 으로 바둑판같은 레이아웃입니다
아래에는 if __name__ == "__main__":
구문이 있는데요. 이 파이썬 파일에서
시작하는 경우 __main__ 이 됩니다.
앱에서 여러개의 파일을 사용하는 경우
main 이 아닌 경우 실행을 하지 않도록 하기 위함입니다.
from PyQt5.QtWidgets import *
import sys
class PyApp(QWidget):
def __init__(self):
QWidget.__init__(self)
self.setWindowTitle("Hello PyQt5")
self.resize(400, 300)
grid = QGridLayout()
self.setLayout(grid)
label1 = QLabel("Hello World!")
grid.addWidget(label1, 0, 0)
label2 = QLabel("Welcome to PyQt5")
grid.addWidget(label2, 0, 1)
self.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
screen = PyApp()
sys.exit(app.exec_())
클래스가 이해하는데 거슬리면
클래스 없이 윈도우를 만들 수도 있습니다.
__name__ 체크하는 내용도 빼도 되지만
이것은 좋은 습관이기 때문에
그냥 내버려 두는게 좋습니다.
클래스 없이 보면 잘 보이는게 있습니다.
우선 QApplication 에 시스템 변수를 넣는 부분
어떻게 동작하는지 사용자는 알 수 없지만
운영체제에 현재 디렉토리를
인수로 전달하는 것을 알 수 있습니다.
다음 QWidget 은 위짓 인스턴스입니다.
여기서 윈도우라는 객체를 정의합니다.
프레임, 레이블, 버튼 등은 모두
이 객체와 관련되 있습니다.
다음 레이블을 생성하는데
QWidget 인스턴스를 받습니다.
윈도우에 레이블을 추가함을 의미합니다.
항상 screen.show() 처럼
보이도록 설정을 해야 윈도우가 보입니다.
sys.exit 는 프로세스를 종료하는 call 입니다.
이 안의 인수는 app.exec_() 로
QApplication 의 인스턴스를 실행합니다.
PyQt5를 구성하는 것은
QApplication 과 QWidget 의
두 개로 나누어져 있다는 부분에 주의합니다.
아직은 QApplication 에 신경쓸 필요는 없습니다.
대부분 시간에 QWidget 부분을 코딩 하게 될 겁니다.
from PyQt5 import QtWidgets
import sys
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
screen = QtWidgets.QWidget()
screen.resize(320, 240)
label = QtWidgets.QLabel(screen)
label.setText("Hello World")
label.move(100, 50)
screen.show()
sys.exit(app.exec_())
윈도우 프레임을 생성하기 위해서
자체 레이아웃이 있는 QMainWindow 을
QWidget 대신 사용하기도 합니다.
QWindow 도 사용할 수 있고요.
프레임워크 안에서도
윈도우를 생성하는 방법은 여러가지가 있습니다.
결과는 윈도우를 생성하는 것 이겠지만
코딩 방식은 약간씩 달라질 수 있습니다.