안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.
코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.
업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.
PyQt를 사용하기 위해서는 클래스(class)에 대한 이해가 선행되어야 합니다.
2021.05.02 - [파이썬 기초/중급 문법] - [파이썬 중급 문법] 클래스(class) 총정리 1편_객체,속성,메소드,인스턴스
2021.05.03 - [파이썬 기초/중급 문법] - [파이썬 중급 문법] 클래스(class) 총정리 2편_ 초기화, 상속, 메소드 오버라이딩, 클래스 변수, 인스턴스 변수
<파이썬 GUI 프로그래밍 관련 지난 글>
2021.05.08 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_2강.위젯의 종류, 시그널과 슬롯, 이벤트 루프
2021.05.10 - [파이썬 패키지/GUI 프로그램] - [파이썬 GUI 프로그래밍] PyQt5 기초_3강.Qt Designer로 내마음대로 GUI 구성하기
1. PyQt란?
PyQt는 Python + Qt를 합쳐서 지은 이름으로, C++ 기반의 GUI Framework인 Qt를 Python에서 사용할 수 있게 만든 패키지입니다.
Python에는 기본적으로 내장되어있는 Tkinter라는 GUI 모듈이 있지만, 오로지 코딩으로 우리가 만들 GUI를 구현해야하는 불편하다는 단점과 무엇보다 시각적으로 예쁘지 않다는 치명적인 단점이 있습니다. 그냥 고민없이 PyQt를 사용하시면 되겠습니다.
추후 배울 Qt Designer라는 프로그램을 이용하면, 드래그 앤 드롭 방식으로 너무나도 쉽게 GUI를 구성할 수 있습니다.
우리가 할 일은 GUI의 위젯(버튼, 슬라이드 등)을 조작했을 때, 우리가 코딩해놓은 함수가 작동하도록 연결만 해주기만 하면 되는 것입니다.
궁극적으로는 내가 만든 파이썬 프로그램을 파이썬을 모르는 사람도 쉽게 조작할 수 있는 말그대로 어플리케이션을 만들 수 있습니다.
2. PyQt 기초
가장 처음 말씀드렸듯이 PyQt를 사용하려면 클래스(class)의 개념을 조금 알고 계셔야합니다.
추천드린 지난 글을 보고 오셨다면 더 이해가 쉽겠지만 안보셨더라도 이해하실 수 있도록 최대한 쉽게 설명드려 보겠습니다.
참고로 클래스는 도면이고, 객체는 도면으로 만든 어떤 실체, 메소드는 클래스 안에 정의된 함수(도면의 내용)라고 생각하시면 됩니다.
PyQt5를 사용하여 아주아주 간단한 GUI 프로그램을 만들어보았습니다.
참고로 Anaconda를 설치하셨다면 pyqt 패키지는 이미 설치되어 있으니, 따로 설치하지 않으셔도 PyQt5 패키지가 import 됩니다.
<전체 코드>
import sys
from PyQt5.QtWidgets import *
app = QApplication(sys.argv)
window = QWidget()
window.show()
app.exec_()
<코드 설명>
1) 관련 패키지 import
import sys
from PyQt5.QtWidgets import *
가장 먼저 파이썬 내장 라이브러리에 존재하는 sys모듈을 import합니다.
sys 모듈은 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈입니다. (점프 투 파이썬 sys 모듈 설명 참고)
PyQt5 패키지의 QtWidgets 모듈에서 전체를 가져오는 코드입니다. import *의 *는 모듈을 전부 가져온다는 의미입니다.
2) PyQt 필수 객체 생성 - QApplication(sys.argv)
app = QApplication(sys.argv)
QApplication( ) 클래스로 app이란 이름의 객체를 생성하는 코드입니다.
QApplication는 QtWidgets 모듈 안에 존재하는 여러 메소드(함수) 중의 하나이며, PyQt를 사용하면 무조건 써야하는 클래스입니다.
이때 현재 소스코드 파일에 대한 경로를 담고 있는 리스트(sys.argv)를 클래스의 생성자(초기화 메서드, __init__)로 전달해주어야 합니다.
궁금하신분은 print(sys.argv)로 안에 무엇이 들었는지 확인해보세요.
참고로, argv는 가변적인 개수의 문자열(arguments vector)을 의미한다고 합니다.
3) 기능없는 창(window) 만들어보기
window = Qwidget( )
window.show( )
Qwidget( )은 실제로 화면에 보여지는 윈도우를 생성하는 클래스입니다.
이를 이용해 window라는 이름으로 객체를 생성한 후에 show 메소드로 창을 띄워줍니다.
여기서 Qwidget( )는 그냥 창의 껍데기만 만드는 것이라고만 이해하고 넘어가도록 합시다.
4) 닫기 버튼 누를 때 까지 계속 실행하는 코드
app.exec_()
위의 소제목과 같이 닫기 버튼을 누를 때 까지, 루프를 돌며 GUI 창을 계속 띄워놓는 코드입니다.이 부분은 다음 강의에서 자세히 설명드릴테니, 이정도로 이해하고 넘어가겠습니다.
3. 나만의 윈도우 만들기
아래와 같이 아이콘과 창 이름을 넣어주고, 원하는 위치에 원하는 크기로 창을 띄우는 실습을 통해서 PyQt에 대해서 알아보도록 하겠습니다.
1) 윈도우 생성
PyQt에서 모든 위젯의 가장 기초가 되는 위젯을 윈도우라고 부릅니다. GUI를 만드는 것을 그림 그리는 것이라 생각하면 윈도우를 생성하는 것은 도화지를 준비하는 것입니다.
<도화지 코드>
import sys
from PyQt5.QtWidgets import *
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
app = QApplication(sys.argv)
window = MyWindow()
# 위의 기본 코드와 다른 점
# QMainWindow 클래스를 상속받은 MyWindow 클래스를 선언
# 그 후 부모클래스를 의미하는 super()메소드와 그 클래스의 속성을 불러오는 __init__ 초기화 메소드 사용
# QMainWindow의 속성이 무엇인지는 모르겠음
window.show()
app.exec_()
아까 처음 본 코드와의 차이점은 class MyWindow 부분과 window = MyWindow( ) 부분 입니다.
나만의 윈도우 클래스를 만들어서 사용하기 위해 PyQt가 제공하는 QMainWindow를 상속 받아서 MyWindow라는 클래스를 정의해주어야 합니다.
한마디로 MyWindow라는 클래스의 역할은 객체를 생성했을 때, 부모 클래스인 QMainWindow의 def __init__의 속성과 메소드를 불러오거나 실행시켜주는 역할이라고 생각하면 됩니다.
2) 윈도우 타이틀 변경
원하는 창의 이름을 넣어 주고 싶을 땐 아래와 같이 setWindowTitle( ) 메소드를 사용합니다.
def __init__(self) 메소드 안에 self.setWindowTitle("원하는 창 이름")을 넣으주면 됩니다.
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
# 도화지 코드의 이 위치에 아래 코드 한 줄을 추가할 것
self.setWindowTitle("코딩유치원 GUI")
3) 윈도우 크기 변경
QMainWindow 클래스에는 윈도우의 출력 위치 및 크기를 변경하는 메서드인 setGeometry( )가 정의되어 있습니다.
아래의 코드는 setGeometry( ) 메서드를 사용해서 창의 좌측상단 꼭지점의 좌표가 300, 300이며 창의 크기가 400x400이 되도록 윈도우를 셋팅하는 코드입니다.
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
# 도화지 코드의 이 위치에 아래 코드 한 줄을 추가할 것
self.setGeometry(300, 300, 400, 400) # 차례대로 창위치 x,y, 창크기 x,y
4) 윈도우에 예쁜 아이콘 넣기
구글에서 icon-icons 사이트를 검색하거나 아래의 링크에서 아이콘 이미지 다운로드합니다. 테스트 해보니, 이미지 사이즈는 상관 없습니다.
다운로드한 아이콘 파일을 파이썬 코드와 동일 디렉터리로 이동시킵니다.
다음으로는 코드로 돌아와서, QIcon( ) 클래스를 사용하기 위하여 from PyQt5.QtGui import * 를 추가해 줍니다.
윈도우에서 아이콘의 설정은 setWindowIcon() 메서드를 사용하며, QIcon 클래스의 인스턴스를 인자로 받습니다.
QIcon 클래스의 인스턴스를 생성할 때는 인자로 아이콘 파일의 경로를 문자열로 넘겨주면 됩니다.
현재 예에서는 소스코드와 아이콘 파일이 같은 디렉터리에 있기 때문에 파일 이름만 적어주면 됩니다.
# 아이콘 삽입 클래스(QIcon) 사용을 위한 PyQt5 패키지의 QtGui 모듈 import
from PyQt5.QtGui import *
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
# 해당 위치에 아래 코드 추가
self.setWindowIcon(QIcon("pie-chart.png"))
오늘은 아주 PyQt의 아주 기초적인 창만들기에 대해서 배워보았습니다.
다음 시간에는 위젯과 이벤트에 대한 내용을 공부해보겠습니다.
'파이썬 패키지 > GUI 프로그램' 카테고리의 다른 글
PyQt를 상업적으로 사용하고 싶다면? 정답은 PySide6 (0) | 2022.01.05 |
---|---|
[Python/Pyqt5] QWidget, QMainWindow, Qdialog 차이 총정리 (ft. Modal과 Modeless) (0) | 2021.12.06 |
[파이썬 GUI 프로그래밍] 잡플래닛 리뷰 정보 크롤링 GUI 프로그램 (2) | 2021.05.22 |
[파이썬 GUI 프로그래밍] PyQt5 기초_3강.Qt Designer로 내마음대로 GUI 구성하기 (0) | 2021.05.10 |
[파이썬 GUI 프로그래밍] PyQt5 기초_2강.위젯의 종류, 시그널과 슬롯, 이벤트 루프 (0) | 2021.05.08 |