- 전체
- Python 일반
- Python 수학
- Python 그래픽
- Python 자료구조
- Python 인공지능
- Python 인터넷
- Python SAGE
- wxPython
- TkInter
- iPython
- wxPython
- pyQT
- Jython
- django
- flask
- blender python scripting
- python for minecraft
- Python 데이터 분석
- Python RPA
- cython
- PyCharm
- pySide
- kivy (python)
pySide [pySide] [번역] PySide6로 첫 번째 앱 만들기 !
2023.12.27 05:46
[pySide] [번역] PySide6로 첫 번째 앱 만들기 !
이 게시글은 공부를 목적으로 https://www.pythonguis.com 의 PySide6 시리즈를 한글로 번역한 것 입니다. 원문의 주소는 포스트 하단에 남겨놓았습니다. 오역, 오타 지적은 언제나 환영 합니다!
이 튜토리얼에선 PySide를 이용해 데스크탑 앱을 만드는 것을 배우게 될 것 입니다. 가장 먼저 PySide가 제대로 되긴 하는지 알아야겠죠? 그리고 기본적인 개념을 익히기 위해 아주 간단한 몇 가지 화면을 만들어 보겠습니다. 그리고나서 이벤트 루프와 이벤트 루프가 파이썬의 GUI 프로그래밍과 어떤 연관이 있는지 알아보도록 하겠습니다. 마지막으로 Qt에서 제공하는 유용한 공용 인터페이스 요소(예를들어, 툴바 혹은 메뉴 등)들을 QMainWindow를 통해 알아보도록 하겠습니다.
애플리케이션 만들기
우리의 첫 번째 앱을 만들어 보도록 합시다. 여러분의 마음에드는 어떤 이름이라도 좋습니다.(e.g. app.py) 파이썬 파일을 만들어 접근 가능한 곳에 저장하도록 합시다.
소스 코드는 보시는 바와 같습니다. 똑같이 타이핑을 해보세요. 실수 했다면, 파이썬이 어디가 틀렸는지 알려줄 것 입니다.
from PySide6.QtWidgets import QApplication, QWidget
# CLI 환경에서 매개변수를 사용하기 위해 필요합니다.
import sys
# 앱 한 개당 오직 하나의 QApplication만 필요합니다.
# sys.argv를 적용하면 CLI 환경에서 매개변수를 허용할 수 있습니다.
# Command Line의 매개변수가 필요 없다면, QApplication([]) 이렇게 사용하셔도 좋습니다.
app = QApplication(sys.argv)
# 우리의 Window가 되어 줄 Qt 위젯을 만들어 봅시다.
window = Qwidget()
window.show() # 주의!!! window는 숨김(hidden) 상태가 디폴트 입니다.
# 이벤트 루프를 시작합니다.
app.exec_()
# 앱을 종료하고 이벤트 루프가 멈추기 전엔 이 밑의 어떤 코드도 실행되지 않을 것 입니다.
자, 먼저 앱을 실행시켜 봅시다. 다음과 같이 CLI을 통해 실행 시킬 수 있습니다.
python3 app.py
실행시키면 window 보일 겁니다. Qt는 자동으로 마우스로 끌 수 있고 크기도 조절 할 수 있는 적당한 모양의 윈도우를 만들어 줍니다.
어떤 플랫폼을 쓰는지에 따라 다르게 보입니다. 아래의 이미지는 윈도우, 맥 OS, 리눅스(우분투)에서 실행한 결과 입니다.

코드를 살펴볼까?
코드를 한 줄씩 뜯어보며 무슨 일이 일어나는지 살펴봅시다.
먼저, 우리는 앱에 필요한 PySide 클래스들을 Import 했습니다. 앱을 핸들링하는 QApplication, 기본적인 텅빈 화면을 위한 QWidget 말이죠. 두가지 모두 QWidgets 모듈 출신입니다.
from Pyside6.QtWidgets import QApplication, QWidget
QT의 메인 모듈은 QtWidgets, QtGui와 QtCore 입니다.
'from <module> import * ' 이런 식으로 사용 할 수도 있지만, 파이썬에선 일반적으로 꺼려지는 방식이므로 여기서도 사용하지 않습니다.
다음으로, QApplication의 인스턴스를 생성하며 sys.argv를 넘겨줍니다. 이는 커맨드 라인의 입력 값을 앱에 전달해주는 파이썬의 List 자료형 매개변수 입니다.
app = QApplication(sys.argv)
커맨드 라인 매개변수를 사용할 생각이 없으면 다음과 같이 빈 list를 사용해도 좋습니다.
> app = QApplication([])
다음으로 window라는 변수에 Qwidget 인스턴스를 할당해 줍니다.
window = QWidget()
window.show()
Qt에서, 모든 상위 Widget들은 window 입니다. 이것은 window가 parent나 다른 widget혹은 layout에 속해있지 않다는 것을 의미합니다. 기술적으로 봤을 떄 당신은 마음에 드는 어떤 widget이던지 window 만들 수 있다는 말 입니다.
parent가 없는 Widget은 기본적으로 보이지 않는 상태 입니다. 그렇기 때문에 window 객체를 만들고 나서 반드시 .show()를 호출해야 합니다. .show() 호출 없이 앱을 실행 시킬 수도 있지만, 종료 할 수 있는 방법이 없을 겁니다!
야호!
마지막으로, app.exec_()를 호출해서 이벤트 루프를 시작합니다.
이벤트 루프가 뭔가요?
window를 화면에 불러오기 전에, Qt world에서 어떻게 앱이 이루어지는지 알 수 있는 몇가지 핵심 개념을 소개해 드리겠습니다. 만약 이벤트 루프에 대해 이미 알고 계신다면 이 구간을 스킵하셔도 좋습니다.
Qt Application의 핵심은 QApplication 클래스 입니다. 모든 앱은 하나의 -오직 하나의- QApplication 객체를 필요로 합니다. 이 객체는 당신의 앱을 위한 이벤트 루프를 포함하고 있습니다. 이벤트 루프는 유저가 GUI와 하는 모든 상호작용을 다룹니다.

앱과 상호작용을 할 때 마다 - 키 누르기, 마우스 클릭, 마우스 움직이기 같은 - 이벤트가 생성되고 이는 이벤트 큐에 위치하게 됩니다. 이벤트 루프가 반복 될 때 마다 이벤트 큐에서 대기 중인 이벤트를 찾게 됩니다. 대기 중인 이벤트를 발견하면 해당 이벤트와 컨트롤이 특정한 이벤트 핸들러에게 전달됩니다. 이벤트 핸들러는 이벤트를 처리하고 처리된 이벤트와 컨트롤을 이벤트 루프에 반환합니다. 하나의 앱에는 오직 하나의 이벤트 루프만 실행 됩니다.
QApplication 클래스는 이벤트 루프를 포함하고 있으며 오직 하나의 인스턴스만 있으면 됩니다. 당신의 앱은 이벤트 루프에서 특정 액션이 일어 날때까지 대기하고 있습니다. 이벤트 루프는 시기에 상관 없이 오직 하나만 있습니다.
언더스코어(_)가 있는 이유는 exec가 파이썬 2.7의 예약어이기 때문입니다. PySide는 이에 대응하기 위해 Qt 라이브러리에 언더스코어를 붙였습니다. 당신은 print() 같은 메서드를 통해서도 그 흔적을 볼 수 있습니다.
QMainWindow
위에서 언급 했듯이, Qt에선 어떤 Widget이라도 Window가 될 수 있습니다. 아래의 예시처럼 QtWidget을 QPushtton으로 바꿔 넣게 되면, 버튼 하나 밖에 없는 window를 볼 수 있을 겁니다.
import sys
from PySide6.QtWidgets import QApplication, QPushButton
app = QApplication(sys.argv)
window = QPushButton("Push me")
window.show()
app.exec_()
이건 꽤 멋지긴 해도 유용하진 않습니다.버튼 하나밖에 없는 UI가 필요한 경우는 매우 드물겠지요? 나중에 다시 다루겠지만, 비어있는 QWidget에 다른 Widget과 Layouts를 넣어 복합적인 UI를 만들 수도 있습니다.
그러나, Qt는 이미 QMainWindow라는 해결책을 가지고 있습니다. 이것은 기본적인 당신의 앱에 기본적인 window 기능을 사용할 수 있도록 미리 만들어진 Widget 입니다. 툴바, 메뉴들, 상태바, dock에 넣을 수 있는(dockable) widget 등등의 다양한 기능이 준비되어 있습니다. 이러한 기능은 차차 살펴보기로 하고, 우선 간단한 비어있는 QMainWindow를 앱에 포함 시켜 보도록 합시다.
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
app = QApplication(sys.argv)
window = QMainWindow()
window.show()
# 이벤트 루프 시작 하기
app.exec_()
실행해 보세요 ! main window가 보일 겁니다. 예전이랑 똑같이 생겼죠?
아직까진 QMainWindow 그렇게 흥미롭게 보이진 않을겁니다. 몇 가지를 좀 더해보면 달라지겠죠. custom window를 만들기 위해 가장 효과적인 방법은 QMainWindow의 서브 클래스를 만들고 init 블럭에 설정을 추가하는 겁니다. 이렇게 한다면 window에 여러가지를 포함할 수 있습니다. 우리만의 QMainWindow 서브 클래스를 만들어 봅시다. - 이 서브 클래스는 간단하게 Main Window라고 하겠습니다.
import sys
from PySide6.QtCore import QSize, Qt
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton
# QmainWindow를 상속 받아 앱의 Main Window를 커스텀 합시다!
class MainWindow(QMainWindow):
def __init__(self) -> None:
super().__init__()
self.setWindowTitle("My App")
button = QPushButton("Press Me! for god sake.")
# 윈도우 중앙에 위치할 Widget 설정
self.setCentralWidget(button)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
이번 예시에서는 QPushButton을 사용했습니다. QMainWindow나 QApplication 클래스 같은 핵심 Qt Widget들은 항상 QtWidgets 네임스페이스로 부터 Import 합니다. QMainWindow를 사용할 때, .setCentralWidget을 사용해 widget(여기서는 QPushButton)을 QMainWindow의 가운데로 위치시켰습니다. 이렇게 했을 때 기본 설정은 해당 Widget이 window를 가득 채우게 됩니다. 여러개의 widget을 window에 추가하는 방법은 앞으로 layouts tutorial에서 배우게 될 겁니다.
Qt class의 subclass를 만들 때, 항상 super().init()을 호출 하도록 합시다. 이렇게 하면 Qt가 object에 대한 설정을 할 수 있게 됩니다.
init 블럭에서 첫 번째로 setWindowTitle()를 호출하여 main window의 제목을 설정하고 있습니다. 그 다음 첫 번째 위젯 - QPushButton - window 한가운데에 추가했죠. 이것은 Qt에서 사용 가능한 기본적인 위젯 가운데 하나 입니다. 버튼을 만들 때는, 표시되길 원하는 텍스트도 함께 매개변수로 넘겨 줄 수 있습니다.
마지막으로, .setCentralWidget()을 호출 했습니다. 이건 widget을 window의 가운데 정렬하기 위한 QMainWindow의 메서드 입니다.
실행 해보세요 ! 똑같이 Window가 보이겠지만, 이번엔 버튼이 가운데에 위치해 있을 겁니다. 버튼을 눌러도 아무 동작을 하지 않지요? 이건 다음에 정리해 보도록 합시다.

곧 다른 widget들도 살펴보겠지만, 궁금하신 분들은 QWidget documentation을 참고해서 다른 Widget들도 window에 추가해보세요!
window와 widgets의 사이즈 조절하기
지금은 window의 크기를 자유롭게 조절 할 수 있습니다. 모서리에 마우스를 가져간 후 드래그하면 원하는 어떤 사이즈로도 바꿀 수 있습니다. 유저들이 앱의 크기를 자유롭게 바꾸도록 하는 것도 좋지만, 가끔은 window의 최대, 최소 크기를 설정 정해두거나, 아예 고정 크기를 써야 할 때도 있습니다.
Qt에서 크기는 QSize 객체를 이용해 정의합니다. 순서대로 너비와 높이를 매개변수로 전달 받습니다. 예를 들어 다음의 코드는 400 x 300 크기의 고정된 window를 만들어 줄 것 입니다.
from curses import window
import sys
from PySide6.QtCore import QSize, Qt
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton
# QmainWindow를 상속 받아 앱의 Main Window를 커스텀 합시다!
class MainWindow(QMainWindow):
def __init__(self) -> None:
super().__init__()
self.setWindowTitle("My App")
button = QPushButton("Press Me!")
self.setFixedSize(QSize(400, 300))
# 윈도우 중앙에 위치할 Widget 설정
self.setCentralWidget(button)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
실행 해보세요! 크기 조절을 할 수 없는 Window가 보일 겁니다.
고정 크기의 window는 최대화 버튼도 비활성화 되어있습니다.
.setFixedSize()와 마찬가지로 .setMinimumSize()로 최소 사이즈를, .setMaximumSize()로 최대 사이즈를 설정 할 수 있습니다. 다양한 설정을 시도해보세요!
사이즈를 설정하는 메서드는 아무 Widget에서나 사용 할 수 있습니다.
이 섹션에서는 QApplication 클래스, QMainWindow 클래스, 이벤트 루프, 간단한 widget 추가하기 등을 알아봤습니다. 다음에는 Qt가 widget들을 제공하는 메커니즘과 window가 당신의 코드와 상호작용하는 방식을 알아보겠습니다.
원문: https://www.pythonguis.com/tutorials/pyside6-creating-your-first-window/
[출처] https://velog.io/@kne666/%EB%B2%88%EC%97%AD-PySide6%EB%A1%9C-%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 2 | (Python) Jupyter Notebook 내에서만 환경 변수 설정 방법 | 졸리운_곰 | 2023.07.06 | 646 |
| 1 |
주피터 노트북(Jupyter Notebook) 시작 폴더 변경
| 졸리운_곰 | 2020.05.09 | 2512 |

