PyQt5와 pywin32를 이용하여 QtWidget안에 외부 프로그램 가져오는 방법이 뭐가 있을까요?

조회수 1947회

안녕하세요.
PyQt5를 이용하여 GUI프로그램 개발을 하고 있습니다.

외부 프로그램을 종속시켜 따라다니게끔 만드는 기능을 구현하고 싶습니다.

검색해보니 C#에서는 setParent 함수를 호출하면 된다고 하여 win32gui.SetParent를 호출하니 에러가 납니다.
에러 내용은 pywintypes.error: (87, 'SetParent', '매개 변수가 틀립니다.')입니다.
따라서 ctypes를 이용하여 ctypes.windll.user32.SetParent()를 사용하였는데, 에러는 발생하지 않았지만 제대로 작동하지 않았습니다.

어제 저녁부터 시작해 새벽까지 검색해보았는데 해결방법을 잘 모르겠습니다..

혹시 PyQt로 작성한 윈도우에 다른 윈도우를 붙이는 방법이나 제가 간과하고 있는 부분을 알고 계시다면 도와주시면 감사하겠습니다

SetParent관련하여 제가 작성한 코드는 아래와 같습니다.

if __name__ == '__main__':
    # pywin32 라이브러리를 이용해 제작한 클래스
    wh = WindowHelper()

    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()

    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.setWindowFlag(QtCore.Qt.WindowMinimizeButtonHint)
    Dialog.show()

    # SetParent
    main = Dialog.winId()
    hWnd = wh.getWindow(None, "계산기")

    # main 윈도우를 따라 계산기가 움직이지 않음
    ctypes.windll.user32.SetParent(hWnd, int(main))
    # 에러
    win32gui.SetParent(int(main), hWnd)
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 아래 코드 참고해보세요.

    import sys
    from PyQt5.QtWidgets import QApplication, QWidget
    from ctypes import *
    
    class App(QWidget):
        def __init__(self):
            super().__init__()
            self.left=50
            self.top=50
            self.width=1200
            self.height=800
            self.initUI()
    
        def initUI(self):
            self.setGeometry(self.left,self.top,self.width,self.height)
            self.show()
    
    if __name__=='__main__':
        FindWindow = windll.user32.FindWindowW
        SetParent = windll.user32.SetParent
        SetWindowPos = windll.user32.SetWindowPos
    
        notepad_handle = FindWindow(0, "제목 없음 - Windows 메모장")
    
        app = QApplication(sys.argv)
        ex = App()
        SetParent(notepad_handle, int(ex.winId()))
        SetWindowPos(notepad_handle, 0, 100, 100, 400, 600, 0)
    
        sys.exit(app.exec_())
    
    • 먼저 메모장을 실행한 뒤 파이썬 스크립트를 실행하세요. 정영훈 2019.11.10 18:48
    • 답변 감사합니다. 계산기는 제대로 따라오지가 않네요 ㅎㅎ.. ㅠㅠ 혼자 개발하다보니 우선 다른기능부터 개발하고 있었는데, 답변 달린 것을 보고 해보았더니 잘 됩니다! 제가 짠 코드와 다른 점이 무엇인지, 왜 안됐는지 알아보려해도 아직은 잘 모르겠네요 ㅎㅎ.. 답변 참고하여 꼭 알아보겠습니다. 다시한번 감사드립니다 알 수 없는 사용자 2019.11.13 02:46
    • 이유를 상세히 적지 않은 것은 파이썬이 아닌 윈도우 시스템 프로그래밍 영역이라 적지 않았습니다. 윈도우 api 인 FindWindow, SetParent, SetWindowPos 대해서 선학습이 되어야 합니다. 정영훈 2019.11.13 03:03

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)