20211201-2 man PyQt

abraxas·2021년 12월 1일
0

tamagotchi

목록 보기
4/21

PyQt 패키지의 기초를 공부한다.

아래 WikiDocs를 공부했다.

https://wikidocs.net/4234

키움 Open API+는 OCX (Object Linking and Embedding Custom Control) 방식을 사용한다. 이 방식은 Python에서 사용하기 쉽지 않다고 한다. 따라서 PyQt 패키지의 QAxContainer 모듈을 이용한다.

PyQt는 Qt라는 GUI 프로그램 개발에 쓰이는 cross platform framework의 Python binding이다. 운영체제와 상관없이 동작하는 프로그램 개발을 지원한다.

M1 맥 conda-forge 환경에서 conda나 pip을 이용해서 PyQt 설치가 되지 않았다. 빠른 진행을 위해서 굳이 이 문제를 해결하려고 하지 않고 Parallels 윈도우 환경에서 바로 설치를 진행했다. Anaconda Prompt에서 전에 만든 py32bit 환경에 다음과 같이 PyQt5를 설치했다.

conda install pip
pip install pyqt5

이후 위 WikiDocs에 나온 예제 코드를 실행했다.

import sys
from PyQt5.QtWidgets import *

app = QApplication(sys.argv)
label = QLabel("Hello PyQt")
label.show()
app.exec_()

app.exec_() method가 event loop에 진입시킨다. 이 method는 사용자가 프로그램 윈도우를 종료시키기 전까지 프로그램을 실행 상태로 남아있게 해준다. 참고로 sys.argv는 현재 코드에 대한 절대 경로이다.

QApplication class의 instance인 app이 GUI 프로그램을 전반적으로 제어하고 exec_() method 이전까지의 부분이 UI 구성을 한다.

위의 코드를 아래와 같이 수정하면 "Hello PyQt"라는 메시지 대신 "Quit"이라는 버튼이 생긴다. 물론 이 상태로는 버튼을 클릭해도 아무 일이 일어나지 않는다.

import sys
from PyQt5.QtWidgets import *

app = QApplication(sys.argv)
label = QPushButton("Quit")
label.show()
app.exec_()

PyQt widget은 UI를 구성하는 가장 기본적인 부품이다. 하나의 widget은 다른 widget에 포함될 수 있다. 다른 widget에 포함되지 않는 최상위 widget을 window라고 부른다. 일반적으로 QMainWindow나 QDialog class가 window로 사용된다.

QMainWindow class를 이용해 window를 생성했다. (코드는 위 WikiDocs를 참조한 것이다.)

import sys
from PyQt5.QtWidgets import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyStock")
        self.setGeometry(300, 300, 300, 400)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mywindow = MyWindow()
    mywindow.show()
    app.exec_()

먼저 MyWindow class는 QMainWindow class를 상속한다. 이후 QMainWindow class 생성자를 호출한다 (super().__init__()). 부모 class 생성자를 호출하면 부모 class의 class variable뿐만 아니라 instance variable까지 상속한다.

setWindowTitle()은 타이틀 창의 텍스트를 설정한다. setGeometry()는 창의 위치 및 크기를 조절한다.

사용자의 event를 처리하는 코드를 작성해보자.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyStock")
        self.setGeometry(300, 300, 300, 400)

        btn1 = QPushButton("Click me", self)
        btn1.move(20, 20)
        btn1.clicked.connect(self.btn1_clicked)

    def btn1_clicked(self):
        QMessageBox.about(self, "message", "clicked")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()
    app.exec_()

QPushButton class의 instance btn1을 만든다. 이후 move() method를 이용해 버튼의 위치를 조절한다. 사용자가 이 버튼을 클릭하면 clicked라는 event가 발생하는데 이것을 처리할 btn1_clicked() method를 만든다. (connect라는 method가 clicked라는 event와 btn_clicked()라는 method를 연결한다.) 클릭하면 QMessageBox widget이 생성되고 "message"를 타이틀 창의 텍스트로 지정, "clicked"를 메시지 창의 텍스트로 지정한다.

오늘은 여기까지.

다음은 키움 Open API+의 기초를 공부할 것이다.

0개의 댓글