주식자동매매 7강. 파이썬을 이용해 GUI 화면 띄우기[코드 제공]
본문 바로가기

주식 자동매매 강의/기초반(모든 코딩의 뿌리)

주식자동매매 7강. 파이썬을 이용해 GUI 화면 띄우기[코드 제공]

반응형

주식자동매매를 이용해 파이썬으로 제작한 코드를 GUI로 실행하거나 결과값을 GUI에 입력합니다. 가독성이 높아지고 직관적이여서 기타 사용자나 개발자 본인에게도 상당히 효율적이기에 그 방법을 아래와 같이 알려드립니다.

 

[유튜브 강의, 링크]와 같이 보시면 많은 도움이 되실 겁니다.

1. 코드 분석

아래는 GUI화면을 띄우기 위해 제작된 코드로 하나씩 의미를 알아 보겠습니다. 최종 코드는 글 마지막에 있습니다.

이해가 어려우시면/아 모르겠다! 하시면 그냥 코드를 그대로 작성하고 실행하신 후 요약만 보십시요. 한번에 이해하기 어려우니 천천히 하시다 보면 차차 이해되실 겁니다. 

 

(1) 파이썬 함수 불러오기

  우리가 모든 함수를 다 제작하는 것은 상당히 비효율 적입니다. 저같은 현업자들도 특수한 상황(사업/논문/특허 등)이 아니면 공유된 함수를 사용하고 있습니다. 예를들어 누군가가 유리컵 만드는 법을 공유하고 있는데 우리가 유리컵 만드는 법을 처음부터 개발할 필요가 없겠죠? 단지 유리컵 만드는 법을 우리에게 맞게 튜닝하고 발전시키는 것이 요즘의 코딩입니다.

파이썬 함수 불러오기
파이썬 함수 불러오기

함수를 가져올 때는 어구가 있습니다. [from 어디에서 import 이것을 가져 오겠다 입니다.]

그러면 가장 기본적인 함수먼저 가져오도록 하겠습니다.[앞으로 더 많은 함수를 가져올 것입니다.]

 

 ◈import sys : system specific parameter and functions를 가져오겠다는 의미 입니다.

 - 파이썬 스크립트(메모장)를 관리하는 역할을 하고 있습니다. 지금 여러분들이 글을 적는 공간을 관리하는 것입니다. 조금 어렵게 말하면 파이썬에 인터프리터가 제공하는 변수와 함수를 제어한다는 것입니다.

 ◈from PyQt5.Qwidgets import * : *의 의미는 PyQt5.Qwidgets이라는 폴더안의 모든 함수를 가져오겠다는 것입니다.

  - 위젯이란 여러분들이 사용하는 프로그램의 클릭 버튼/표/진행바 등을 제어 하는 요소들을 통합적으로 부르는 말입니다. 이것을 가져와야 여러분들이 원하는 그래픽적인 기능을 수행할 수 있습니다.

 ◈from PyQt5 import uic : 여러분들이 제작한 ui를 class 형태로 변환하기 위한 함수입니다. class 형태로 변환해야 컴퓨터에서는 ui라는 그림을 이해할 수 있습니다. 

  - 앞으로 class라는 단어를 많이 쓸텐데 간단히 요약하면 아래와 같습니다.

  - class : 과일

  - function(함수) : 딸기, 포도, 바나나....

  - 즉, 클래스는 상위 개념이고 함수는 하위개념을 기능별로 나열한 것입니다.

 

처음이라 조금 상세하게 설명 드렸습니다. 혹시 이해안가시면 물어보시거나 검색해 보시기 바랍니다.

 

(2) ui 불러오기

아래 코드를 보시면 uic.loadUiType이라는 함수를 하용하는데 앞서 정의한 uic 함수의 loadUiTpye이라는 기능을 사용하는 것입니다. 그리고 ( )안에 우리가 6강에서 만든 ui 이름을 집어 넣으시고 [0]을 넣습니다. 0은 우리가 앞으로 만들 UI_MainWindow 클래입니다. 1은 위젯의 MainWindow인데, 우리는 0을 사용한다는것만 기억하십시요.

 

ui 불러오는 코드
ui 불러오는 코드

(3) 클레스 및 프로그램 실행 : 클래스 이름의 첫 문자는 무조건 대문자로 작성하셔야 됩니다.

아래 코드에서는 크게 class와 def 그리고 if 구문이 있습니다. class는 우리가 작성할 그리고 실행할 값입니다(주식자동매매). def는 class내부에서 각 기능을 담당하는 갑입니다(주문/검색 등등을 담당).

 

클레스 및 실행 파일 입력
클레스 및 실행 파일 입력

그러면 코드를 하나씩 이해해 볼까요?

 

 ◈ class Login_Machine(QMainwindow, QWidget, form_class)

  - Login_Machine이라는 클래스에 사용될 QMainwindow(윈도우 생성), QWidget(버튼), form_class(ui)를 상속시킵니다. 이렇게 하면 위의 기능들을 사용할 수 있습니다.

 

 ◈ def __init__(self, *args, **kwargs): 이해가 되지 않으시면 넘어 가십시요. 우리는 자동매매 프로그램 만들어야죠?

 

  - __init__ : 아래에 사용할 self가 붙은 다양한 변수들을 초기화 하는 역할 입니다. 초기화를 해야 컴퓨터가 준비를 하겠죠?

  - *args, **kwargs :  앞의 중요한 것인 별표와 쌍별표 입니다. 뒤에 적힌 단어는 아무 의미 없습니다. 즉, *A, **AA라 적으셔도 무방합니다. 그러면 별과 쌍별표만 어떤 의미 인지 아시면 되겠죠?

  - 별표(*) : 여러분들이 정의하지 않은 일반 인자를 함수 def에 보낼때 사용하니다. 프로그래밍 하다보면 모든 인자를 다 정의할 수 없습니다. 그때그때 사용해야 하는 경우도 생기겠죠? 이때 편의를 위해 *를 사용하면 궂이 정의하지 않아도 여러 인자들을 사용할 수 있습니다. 한 예로 1, 2, 3을 *arg에 넣으면 1, 2, 3이 출력되게 합니다. 이 때 1, 2, 3은 정의되지 않았습니다.

  - 쌍별표(**) : 위와 동일하나 키워드파라메터 인자를 def에 보낼 때 사용합니다. 키워드 파라메터는 x = 1, b = 2, c = 3와 같은 형태이고 출력은 (x, 1), (y, 2), (c, 3)과 같습니다.

 

요약하면, sefl를 이용할 일반인자든 키워드파라메터 인자든 초기화 하겠다는 말입니다.

 

 ◈ print("입력할 내용") : 입력할 내용을 단순히 개발자가 확인하기 위해 적는것입니다.

 

 ◈ super(Login_Machine, self).__init__(*args, **kwargs)

 super는 우리가 만든 class(Login_Machinie), 즉 superior class의 부모 class를 찾는 과정이라 생각하시면 됩니다. 단순히 말하면 우리가 상속받은 QMainwindow, QWidget, form_class를 사용하기 위해 적는 코드입니다. 그리고 QMainwindow에는 1~100까지 숫자를 넣을 수 있다고 할 때 그 숫자를 일반 인자/키워드파라메터 인자로 넣고자 한다면 *args, **kwargs라고 넣는 것이겠죠.

 

 ◈ form_class.__init__(self)

 이제 딱 보시면 아시겠죠? 상속 받은 form_class를 사용하기 위해 초기화 하는 작업니다.

 

 ◈ setup_ui

  파이썬 내장 함수로써, 만들어진 ui와 코드간 연결될 수 있도록 해주는 기능을 합니다.

 

(4) 클레스 및 프로그램 실행

  앞으로 우리는 여러가지 클래스나 함수들을 import할텐데 아래 코드를 입력하지 않으면 그냥 다 실행됩니다. 우리가 원할 때만 써야 될 것들이 그냥 실행되면? 일도 제대로 안되고 뒤죽박이게 됩니다. 이를 해결하기 위해 아래의 코드가 반드시 필요합니다.

 

프로그램 실행을 위한 최종 코드
프로그램 실행을 위한 최종 코드

 

 ◈ if __name__=='__main__':

  만약 이름이 main이라면 아래의 코드들을 직접 실행하겠다라는 의미이다. 이때 main은 파이썬 고유 내장함수인데 현재 여러분들이 보고 있는 스크립트(메모장)을 main이라 생각하고 그 메모장에 적혀 있는 것들만 사용하겠다는 의미입니다. 즉 위에서 설명하였듯이, import한 다양한 함수들을 불필요하게 실행하지 않겠다는 의미와 동일합니다.

 

 ◈ app = QApplication(sys.argv)

  컴퓨터에게 무엇을 실행시켜야 하는지 알려주는 코드이다. sys.argv는 현재 작업중의 파이썬 스크립트의 절대 경로(주소) 입니다. 이 주소를 QApplication이라는 객체가 실행하라고 하는 명령입니다.

 

 ◈ CH = Login_Machnine(), CH.show()

  무엇을 실행해야하는지 알려주는 코드다. 앞서 설명한 Login_Machine()이라는 코드를 실행하고 그 코드를 보여달라는 뜻입니다.

 

 ◈ app.exec_()

  exec_()함수는 프로그램이 종료되지 않게 무한반복 시키는 함수이다. 장시작 9시부터 3시 30분까지는 프로그램이 절대 꺼지면 안되기 때문에 이러한 명령을 넣습니다. 차 후에 원하는 시간에 꺼지게 하는 기능도 있으니 일단 여기 까지만 이해하시면 됩니다.

 

QApplication(sys.argv)와 app.exec_()는 이벤트 루프(event loop)를 만드는 함수로써 이 사이에 넣는 코드는 무한히 반복되어 실행됩니다.

2. 프로그램 실행 화면

  프로젝트 아래에 반드시 만드신 ui와 생성한 스크립트가 있어야 합니다.

프로그램 실행 화면
프로그램 실행 화면

3. 요약

 (1) 코딩을 효율적으로 하기 위해 특정 함수들을(import sys 등) 불러왔습니다.

 (2) 제작한 ui도(uic.loadUiType) 불러왔습니다.

 (3) 저희가 코딩할 주요 클래스 Login_Machine를 만들었습니다.

 (4) Login_Machine에 부모클래스 QMainwindow, QWidget, form_class을 상속시켰습니다.

 (5) 부모 클래스 초기화를(super(Login_Machine, self).__init__(*args, **kwargs) 등) 하였습니다.

 (6) 프로그램이 실행될 때마다 파이썬 내장함수가 가동되는 것을 막기위해 if __name__=='__main__'을 사용하여 현재 스크립트(메모장)에 명시된것만 돌아가게 했습니다. 

 (7) 주식 장중에는 프로그램이 꺼지면 안되니 QApplication(sys.argv)와 app.exec_()를 사용해 무한루프를 만들었습니다. 이 문구만 있으면 계속 반복합니다.

 (8)  QApplication(sys.argv)와 app.exec_()사이에 Login_Machine()에 있는 GUI를 보여주는 코드도 삽입하여 GUI가 계속 돌아갈 수 있는 환경을 만들었습니다.(CH = Login_Machnine(), CH.show())

 

  아래는 설명한 코드들의 전체 코드이며, 실행 시 그림과 같이 본인이 제작한 GUI 화면이 나타날 것입니다. 이해하신다고 수고 많으셨습니다. 이제 절반은 성공하습니다.! 잘 모르겠으면 질문하십시요. 감사합니다.

 

8강 바로가기 : 모든 코드들이 통신할 수 있게 하는 마법의 언어를 알아 봅시다.

 


import sys                        # system specific parameters and functions : 파이썬 스크립트 관리
from PyQt5.QtWidgets import *     # GUI의 그래픽적 요소를 제어       하단의 terminal 선택, activate py37_32,  pip install pyqt5,   전부다 y
from PyQt5 import uic             # ui 파일을 가져오기위한 함수


#=================== 프로그램 실행 프로그램 =========================#

form_class = uic.loadUiType("ALBA.ui")[0]             # 만들어 놓은 ui 불러오기


class Login_Machnine(QMainWindow, QWidget, form_class):       # QMainWindow : PyQt5에서 윈도우 생성시 필요한 함수

    def __init__(self, *args, **kwargs):                      # Main class의 self를 초기화 한다.

        print("Login Machine 실행합니다.")
        super(Login_Machnine, self).__init__(*args, **kwargs)
        form_class.__init__(self)                            # 상속 받은 from_class를 실행하기 위한 초기값(초기화)
        self.setUI()                                         # UI 초기값 셋업 반드시 필요

    def setUI(self):
        self.setupUi(self)                # UI 초기값 셋업

if __name__=='__main__':             # import된 것들을 실행시키지 않고 __main__에서 실행하는 것만 실행 시킨다.
                                     # 즉 import된 다른 함수의 코드를 이 화면에서 실행시키지 않겠다는 의미이다.

    app = QApplication(sys.argv)     # PyQt5로 실행할 파일명을 자동으로 설정, PyQt5에서 자동으로 프로그램 실행
    CH = Login_Machnine()            # Main 클래스 myApp으로 인스턴스화
    CH.show()                        # myApp에 있는 ui를 실행한다.
    app.exec_()                      # 이벤트 루프
반응형

.link_tit