본문 바로가기
파이썬-PySide6(PyQt6)

[3/?] PySide6에서 가장 기초가 되는 QApplication과 QWidget

by 회사원코딩 2021. 3. 19.

PySide6에서 가장 기초가 되는 두 가지 클래스, QApplication과 QWidget

안녕하세요? 회사원코딩입니다.

이번 포스팅에서 설명드릴 코드는 가장 단순한 창만들기입니다. 임포트문을 제외하면 네 줄밖에 아닌데요. 라인별로 설명드리고 포스팅을 마치겠습니다.

import sys
from PySide6.QtWidgets impor QApplication, QWidget

app = QApplication(sys.argv)
window = QWidget()
window.show()
app.exec_()

위의 코드를 실행해보겠습니다.

가장 단순한 Qt 코드. 빈 창을 생성합니다.

라인별로 설명드리겠습니다.


[1] import sys

파이썬 내장모듈인 sys 를 임포트합니다. sys가 쓰이는 곳은 딱 하나인데, QApplication클래스로 app 인스턴스를 생성할 때 파라미터로 사용했습니다.

sys.argv가 뭔지 모르시는 분들도 많을 거라고 생각합니다. 아래 예제를 보면 쉽게 이해하실 겁니다.

프로그램 실행시 뒤에 인자값을 붙이고, sys.argv로 프로그래밍 내에서 전달받는 방법([0]은 파일명임)

이런 식으로 커맨드프롬프트상에서 프로그램을 실행할 때 파일명 뒤에 붙인 인자들을 프로그램 내부에서 활용할 수 있습니다. 순전히 이 용도일 뿐이어서, import sys 구문을 빼고 app = QApplication()처럼 괄호 안에 아무것도 넣지 않아도 실행이 됩니다. 다음에 sys.argv를 활용하는 코드를 보여드리겠습니다.


[2] from PySide6.QtWidgets import QApplication, QWidget

Qt GUI를 구성하는 다양한 부품(위젯)들은 모두 QtWidgets 모듈 안에 들어 있습니다. 우리는 그 중에 QApplication과 QWidget 등 두 개의 클래스를 사용할 것입니다. 단순한 임포트 구문입니다.

[3] app = QApplication(sys.argv)

QApplication은 우리가 제작한 GUI를 움직이게 해주는 클래스라고 생각합시다. 좀 더 직관적으로는 exec_()라는 메서드(C++에서는 exec)를 실행해서 Qt의 시그널과 슬롯이 상호작용하게끔 이벤트루프를 시작하는 클래스입니다. 프로그램 내에서 꼭 한 번 실행되어야 하며, 한 개의 인스턴스만 존재할 수 있습니다. (singleton이기 때문에 두 번 이상 인스턴스화를 하려고 하면 런타임에러가 발생합니다.)

일반적으로 app = QApplication()이라는 컨벤션으로 인스턴스를 생성합니다. 안에 있는 sys.argv에 대해서는 나중에 sys.argv를 사용하는 GUI 튜토리얼로 상세히 설명드리겠습니다.


[4] window = QWidget()

우리의 GUI창이 되는 Qt위젯을 만들었습니다. 이 QWidget은 그냥 제목줄이 하나 있는 빈 창 위젯을 생성합니다. 이 안에다 이것저것 다른 위젯이나 레이아웃을 넣을 수도 있고, 심지어 아무 것도 안 넣어도 실행됩니다. 지금처럼요. 제목을 설정하지 않으면 "python"이 입력되어 있습니다. 당분간은 이 QWidget 안에다가 이것저것 다른 위젯을 넣는 방식으로 튜토리얼을 진행해볼 예정입니다. 이와 비슷한 위젯으로는 QMainWindow라는 게 있는데 제목줄 아래로 메뉴바나 아이콘탭을 추가한다든지 하단에 정보표시줄을 추가한다든지 하는 각종 요소를 추가할 수 있습니다. 단순한 프로그램을 짤 때는 QWidget, 좀 더 체계적으로 여러 기능이 들어가는 프로그램의 GUI를 짤 때는 QMainWindow를 쓰시면 되겠습니다. 당분간은 QWidget만 써도 충분할 것 같네요. 하여튼 window라는 변수명으로 QWidget 클래스의 인스턴스를 생성했습니다. 3번라인의 QApplication은 싱글턴이지만 QWidget은 아니므로, 한 개의 Qt 프로그램 안에 여러 개의 QWidget 윈도우를 생성하는 건 가능합니다.

여러 개의 QWidget 인스턴스를 생성하는 것은 가능합니다.


[5] window.show()

QWidget이든 MainWindow든 기본적으로 백그라운드에서 실행되며, 창을 나타나게 하려면 무조건 show() 메서드를 실행해야 합니다. 여기까지만 실행하면 아래와 같은 창이 나타나며, 응답없음 상태입니다. 창 크기를 

창은 나타났는데, 아직 응답없음 상태입니다. app.exec_()를 실행해야 이벤트루프가 시작됩니다.


[6] app.exec_()

이 명령어를 실행하는 시점에서 우리가 만든 GUI 윈도우가 반응하고 움직이기 시작합니다. 대부분 이 라인이 코드의 마지막입니다. 창을 닫고 이벤트루프가 종료된 이후에 추가로 실행하고 싶은 내용이 있다면 이 뒤로 코드를 작성하시면 됩니다.


마무리

이번 예제 설명은 여기서 마치겠습니다. 거창하게 시작했는데 만들어진 창 안에 아무 것도 없어서 다소 실망하셨을지도 모르겠습니다. 단순한 위젯 하나씩 만들어보는 작업을 통해서, QApplication이나 기타 QtWidgets 안의 여러가지 요소들에 익숙해지는 과정을 같이 따라하시다 보면 코드의 뼈대가 어떤 식으로 잡히는지, 또 나아가 어떤 방식으로 코드를 짜야 할지 감이 올 겁니다. 내공을 쌓는 작업이라고 생각하시고, 마음을 넉넉하게 가지시면 좋겠습니다.

다음 시간에는 상호작용의 가장 기본이 되는 버튼, 바로 PushButton 위젯에 대해 소개하겠습니다.

다음 포스팅에서 뵙겠습니다^^

 

 


donaricano-btn

728x90
반응형

댓글4

  • 수뼈 2022.03.09 11:03 신고

    import sys
    print(f"Hello {sys.argv[1]} & {sys.argv[2]}")

    이렇게 코드를 입력하고 실행했더니 이런 에러가 뜨네요.
    IndexError: list index out of range

    제가 지금 지난달에 파이썬 처음 배우기 시작했고, 이제 막 위키독스의 점프 투 파이썬(https://wikidocs.net/book/1) 완독하고 바로 이쪽으로 넘어온 상태입니다. 그래서 그런지, 아직 기초가 제대로 안 닦여 있어서 그런지는 몰라도 import sys 설명부터 이해가 안 되는 부분이 많습니다.

    1. sys라는 클래스를 불러와 그 요소인 argv라는 리스트를 출력하는 작업인 건 알겠는데, 그럼 어째서 input 함수도 없는데 어째서 사용자 입력을 필요로 하는 거죠?
    2. 에러가 날 때까지 제가 튜토리얼대로 안 한 게 경로 설정 딱 하나입나다. 대학교 필기자료 모으듯이 프로그래밍 공부 자료도 모으고 싶어서 D드라이브에 저장하고 있는데, 이것 때문에 오류가 발생한 걸까요?
    3. 설령 2번이 원인이 아니라 해도, 이런 식으로 코드를 작성하거나 프로그램을 개발하는 것이 괜찮은 방법인지, 부적절하다면 왜 그런지 궁금합니다.
    4. 지금 튜토리얼을 따라가는 과정에서 모르는 개념이나 헷갈리는 개념들이 너무 많다면, 분명 기초를 더 공부하고 와야 하지 않을까 싶습니다. 파이썬 기초 문법을 한 번 정도 훑어보고서, 자신감이 넘쳐서 프로젝트를 해 보려 했다가 좌절을 맛본 저와 같은 사람들이 기초를 갈고닦기 좋은 적절한 방법이 있을까요?
    답글

    • 회사원코딩 2022.03.09 12:10 신고

      수뼈님 안녕하세요ㅎ
      차근차근 간략히만 설명드리겠습니다.

      #### sys모듈
      sys는 운영체제나 인터프리터 등 다소 저수준(?)의 변수나 기능들을 사용하게 해 주는 파이썬 내장모듈입니다. Qt를 배우시면서 sys모듈을 구체적으로 사용할 확률은 거의 없을 것입니다. 제가 괜히 설명에 넣어놓았네요ㅜ

      하여튼
      sys.argv는 터미널(커맨드프롬프트)에서 아래와 같은 서식으로 실행한다고 가정하면

      c:\>python abc.py var1 var2

      abc.py 소스 안에서 sys를 임포트하고
      sys.argv를 들여다보면

      sys.argv[1]에는 var1 값이 들어가 있고
      sys.argv[2]에는 var2 값이 들어가 있게 됩니다.

      IndexError가 나타난 이유는
      sys.argv[2]를 요청했는데
      사실 커맨드프롬프트에서 파라미터 입력이 되지 않았기 때문입니다. sys.argv를 사용하는 파이썬 프로그램을 실행할 때에는

      c:\>python abc.py var1 var2

      이런 식으로 필요한 파라미터를 붙여야만 실행됩니다. (이 때 오류메시지를 추가해서 "두 개의 파라미터가 필수입니다." 등을 출력해 준다든지 하면 좋았겠네요.)

      #### 1번질문 답변

      사용자입력을 필요로 한다(?)기보다는 사용자입력을 터미널에서 받을 것을 가정하고 만든 파이썬 프로그램입니다. 커맨드프롬프트의 copy 명령어나 move 명령어를 생각하면 익숙할 수도 있겠습니다.

      파이썬에서 사용자의 별도입력을 받는 대표적인 방법은 크게 세 가지입니다.
      ①sys.argv로 터미널에서 미리 입력받거나 ②input함수를 써서 프로그램 런타임(실행 중)에 입력받거나 ③GUI를 실행해서 사용자 관점에서 보기좋게 입력받거나.

      그냥 sys.argv는 프로그램을 실행하는 여러 방법들 중 하나입니다.

      #### 질문2
      저장경로는 d드라이브도 괜찮고 usb라도 괜찮습니다. 다만, 수뼈님이 관리자권한을 가지고 있어야만, 어느 폴더나 파일이든 접근할 권한이 있는데, 일반사용자나 guest계정일 경우에는 PC설정에 따라서 오류가 나기도 합니다.

      대신 위의 오류는 단순히
      python ex1.py "var1" "var2"
      방식으로 두 개의 파라미터를 입력하지 않으셔서 발생한 오류인 것 같습니다.

      #### 질문3

      괜찮습니다. 조금만 더 추가하면, 대부분의 IDE에는 "폴더"와는 조금 다른 "프로젝트"라는 개념이 있고, 한 개의 프로젝트 안에 있는 파이썬 파일들을 모두 백그라운드에서 읽어서 일종의 내비게이션을 자동으로 해 주기 때문에,
      모든 파이썬 파일을 한 군데 모아두시면 나중엔 다소 느려지거나, 서로 중복되는 코드가 있을 때 수정을 권장한다든지 하는 번거로움이 생길 수 있습니다.

      한 개의 폴더에 모아놓고 열지는 마시고, 목적별로 프로젝트를 만들어 폴더를 나눠놓으시고, 프로젝트별로도 가상환경을 하나씩 만들어 두시는 걸 추천드립니다. 예를 들면 Qt를 공부할 때는 Qt공부용 가상환경 인터프리터를 만들어 두고 그 안에만 pyside6를 설치하는 방식입니다.

      #### 4번
      파이썬 기초서적을 쓰는 분들 대부분의 마음은 아래와 같다고 생각합니다.

      "초반부터 너무 두껍고 어려우면 아무도 이 책을 사거나 파이썬을 배우려고도 하지 않을 거다."

      "이걸로 맛보기만 보여주고 실무 프로젝트를 시작할 때에는 알아서 중고급 파이썬 서적들을 구매하겠지."

      그런 맥락에서 입문서로 읽기 좋은 책은 딱 입문서로만 좋은 책입니다. 다소 설명이 길어지고 이해하기 어렵거나 복잡한 문법은 입문서에는 거의 들어있지 않습니다.

      수뼈님처럼 어느 정도 입문 후 파이썬 문법에 조금 익숙해진 분들은,

      ① 다른 입문서를 몇 권 더 읽으면서 느긋하게 학습량을 늘리시거나

      ② 개별 프로젝트에 특화된 튜토리얼 형식의 서적을 몇 권 읽어보시거나

      ③ 두꺼운 파이썬 문법서나 온라인 파이썬 공식문서 등을 읽으면서 스스로 학습루트를 찾아가시거나

      가장 추천드리는 방법은 조금 모호하게 들리실 수 있지만 "레벨에 맞게 단계적으로" 배우시는 방법입니다.

      아직 우리가 "뭘 모르는지 모르는 단계"이기 때문에, 어쩔 수 없이 또다른 책이나 인강을 접해서 모르는 부분을 조금씩 보완해 가는 것이 좋습니다.

      그럼에도 많은 사람들이 추천하는 좋은 파이썬 문법책들이 있는데,

      점프투파이썬-박응용
      깐깐하게 배우는 파이썬-제드A쇼
      혼자공부하는파이썬-윤인성
      슬기로운 파이썬 트릭-댄 베이더
      파이썬 코딩의 기술-브렛 슬라킨
      파이썬완벽가이드-데이비드M비즐리

      등입니다. (나름 난이도 순으로 정렬을 해보았습니다.)
      대부분 특정 모듈이나 패키지에 치우치지 않고 파이썬 기본문법을 탄탄히 다져줄 수 있는 책들입니다.

      종종 읽어보시면 좋겠습니다. 처음 보는 내용이 나올 때마다 맥락을 이해할 수 있게 구글링도 병행하시고 하다 보면.. 두어 달 정도면 충분히 파이썬 중급자 정도 되실 겁니다.

      제가 성의가 없어 댓글이 너무 길어졌습니다.. 선거일인데 꼭 거시기 하시고
      행복한 하루 되시기 바랍니다^^

    • 수뼈 2022.03.09 14:22 신고

      허걱... 이렇게 친절하고 또 자세히 답변해 주셨는데 뭘 더 바라겠어요ㅠㅠ 이미 충분하고도 남으니, 너무 걱정하지 말아 주세요!

      제가 이전에 vs code로 공부하다가 파이참을 처음 사용해 보기도 했고, '커맨드프롬프트'라는 단어를 아예 처음 들어서 무작정 실행부터 했던 것 같아요. 해결되었으니 계속 진행해 보겠습니다!

  • 수뼈 2022.03.09 15:25 신고

    이건 제보인데, 맨 처음 코드 예제 라인2애 오타가 있습니다! 이거 보시면 댓삭할게요!
    답글