ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [키움 OpenApi]AttributeError: 'QAxWidget' object has no attribute 'OnEventConnect' 해결한 방법
    Python 키움 OpenAPI 2023. 11. 1. 22:20
    반응형
    self.ocx = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")
    self.ocx.dynamicCall("CommConnect()")
    self.ocx.OnEventConnect.connect(self.loginResult)

     

    구글링을 해보니 해당 에러는 API로의 접속을 할 수 없어서 일어난 현상이라고 함.

    그 원인에는 키움API는 python 3버전 32bit를 사용해야 정상적으로 통신을 할 수 있는데

    64bit로 설치한 것이 원인이라 하여 수차례 시도하여 결국 해결하였다.

     

     

    1. 최신버전 아나콘다 64bit 설치를 한다.

    https://www.anaconda.com/download

     

    2. 설치 완료 후 anaconda prompt을 실행한다.

    3. 현재 64비트 상태이므로 32비트로 설정을 변환하고, api용 환경을 추가한다.

    set CONDA_FORCE_32BIT=1 //32비트 설정. 해제는 =0
    
    conda create -n ENV_NAME //ENV_NAME이라는 이름으로 새로운 환경 생성

     

    4. 환경을 추가하였다면 추가한 환경으로 변환하고 python을 설치한다.

    activate ENV_NAME // ENV_NAME 활성화
    
    conda install python

     

    5. 새로 추가한 환경위치로 가서 phthon.exe를 열어 32비트로 설치되었는지 확인하기

     

    6. 필요한 library들을 설치한다.

     

     

     

    이 과정을 반복하다보니 (안되면 제거 후 처음부터 다시)

    어느순간 해결이 되었다.

     

    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QAxContainer import *
    
    class MyWin(QMainWindow):
        def __init__(self):
            super().__init__()
            self.loginEvent()
            self.setWindowTitle("pyStock")
            self.setGeometry(300,300,300,150)
            
            self.text_edit = QTextEdit(self)
            self.text_edit.setGeometry(10,60,280,80)
            self.text_edit.setEnabled(False)
            
            #CommConnect(사용자 호출) -> 로그인창 출력 -> OnEventConnect(이벤트 발생)
            
        def loginEvent(self):
            self.ocx = QAxWidget("KHOPENAPI.KHOpenAPICtrl.1")
            self.ocx.dynamicCall("CommConnect()")
            self.ocx.OnEventConnect.connect(self.loginResult)
            
        def loginResult(self, err_code):
            """
            err_code
            100 : 사용자 정보교환 실패
            101 : 서버접속 실패
            102 : 버전처리 실패
            """
            
            if err_code == 0 :
                self.text_edit.append("로그인 성공")
            elif err_code == 101 :
                self.text_edit.append("정보교환 실패")
            elif err_code == 102 :
                self.text_edit.append("서버접속 실패")
            elif err_code == 103 :
                self.text_edit.append("버전처리 실패")
    
    
    if __name__ == "__main__":  
        app = QApplication(sys.argv)
        window = MyWin()
        window.show()
        app.exec_()

     

     

     

    멀리도 돌아왔다. 여기저기 찾아보며 맨땅헤딩 끝에 해결했다는 만족감을 얻어가며 이만 마칩니다.

    반응형

    댓글

Designed by Tistory.