윈도우를 사용하면 마우스로 버튼도 누르고 이름이나 전화번호도 누를 수 있는 프로그램들을 우리는 사용합니다. 화면에 화려하게 사용자와 마우스 및 키보드로 소통을 하는 방식의 프로그램을 그래픽 유저 인터페이스(Graphic User Interface), GUI 프로그램이라고 합니다.
그래서 드디어 화면에 무엇인가를 띄워 볼 수 있는 프로그램을 만들어 보려고 합니다. GUI를 가진 프로그램을 만들기 위해서 사용할 수 있는 패키지는 수십여 가지가 있다고 합니다. 그 중에서 tkInter, PyQt라는 대표적인 패키지가 있습니다. 요즘들어서는 tkInter보다 PyQt의 GUI가 좀 더 예쁘기 때문에 PyQt를 사용하는 분들이 많은 것 같습니다. 어떤 패키지를 사용하는 것이 좋을까요? 앞서 말씀 드렸었는데요. 인터넷에서 검색을 해 보면 어떤 것이 많이 나오는지 보면 됩니다. 많이 등장하는 것이 그만큼 사용자가 많다는 증거이니 우리가 활용을 할 수 있는 다양한 정보의 양도 많겠죠. 인터넷에서 ‘파이썬 GUI 추천’이라 해 보시면 많은 정보를 얻을 수 있습니다. 그런데 저는 인터넷에서 추천하지 않는 다른 패키지를 선택했습니다. PySide라는 패키지입니다. 최신 버전은 PySide6입니다. 이런 선택을 한 가장 큰 이유는 라이선스 문제였습니다. PyQt는 상용 프로그램을 만들 때, 라이선스 비용을 지불해야 한다고 합니다. 그에 비해서 PySide는 어떤 프로그램을 만들어 배포를 해도 무료입니다. 항상 상용 프로그램을 만들 때에는 어떤 라이선스를 가지고 있는지 꼭 확인을 해야 합니다. 나중에 오픈소스 라이선스에 대해서 살펴볼 기회를 만들어 보겠습니다.
어쨌거나 다른 패키지들에 비해서 PySide는 공짜란 얘깁니다. 그래서 PySide를 택했습니다. 자료를 찾는데 가끔은 아쉬울 때가 있긴 합니다만 조금만 익숙해지면 크게 어려운 부분은 없습니다. 한가지 정보를 추가하자면 우리가 배우고 있는 파이썬은 Qt라는 언어를 기반으로 만들어졌습니다. 그런데 이 Qt를 만든 곳에서 PySide를 만들었다고 하네요. 자! 이젠 PySide6를 설치해 줍니다. 터미널에서
pip install pyside6
설치가 되었다면 코딩을 해 보시죠.
008_pyside6.py
한가지 짚고 넘어가겠습니다. 앞의 코드를 보면 class와 if는 첫 칸부터 코딩이 시작되고, class 안에 있는 __init__ 함수는 def 부터 들여쓰기를 했습니다. super()로 시작하는 문장은 def로 시작하는 함수보다 또 들여쓰기를 했습니다.
이와 같이 class나 def로 시작하는 함수들은 첫 칸 부터 코딩이 되어 있어도 누군가가 불러주기 전에는 실행이 되지 않습니다. 하지만 8번째 라인의 if는 바로 시작이 됩니다. if 문이 참이라면 그 안에 있는 내용도 바로 실행이 되겠죠? 그래서 이 프로그램의 시작점은 바로 이 if문이 됩니다.
if __name__ == "__main__":
__name__은 파이썬이 내부적으로 사용하고 있는 변수입니다. 그래서 일반적으로 사용하는 변수와 좀 다르게 생겼습니다. 어떤 정보를 담고 있는 변수일까요? 바로 파이썬이 실행하는 파일들의 이름을 갖고 있습니다.
파이썬으로 만든 프로그램들은 한 개의 py 파일로 만들수도 있고 여러 개의 파이썬 파일로 이루어질 수도 있습니다. 예를들어 python test.py라고 test.py를 실행했다고 가정해 봅시다. 그리고 test.py에서 test2.py라는 파일에 있는 다른 함수나 클래스를 사용했다고 가정을 해 봅시다. 이런 경우 test.py의 __name__은 __main__이라는 값을 갖게 되고, test2.py의 __name__은 test2라는 값을 갖습니다. 즉, python이 처음 실행하는 py 파일만 __name__ 변수에 __main__을 줘서 이 파일이 바로 처음 시작하는 파일이라고 알 수 있도록 __name__이라는 변수에 그 정보를 넣어 주는 것입니다.
그럼 프로그램을 실행을 해 볼까요?
app = QApplication(sys.argv)
QApplication()은 어플리케이션 하나를 만들라는 클래스입니다. 매개변수로 sys.argv를 넘기고 있습니다. sys.argv에 어떤 값이 들어 있는지 궁금하다면 다음 줄에 print() 함수를 이용해서 sys.argv를 찍어 보시기 바랍니다. 이 변수는 우리가 코딩을 하고 있는 py 파일의 경로가 넘어갑니다. 이 프로그램에서는 큰 의미가 없는 매개변수 입니다. QApplication이라는 클래스가 사용되고 있는데 이는 우리가 import한 패키지에서 찾아볼 수 있습니다.
from PySide6.QtWidgets import QApplication, QMainWindow
QApplication과 QMainWindow를 import 했는데 PySide6.QtWidgets의 모든 패키지들을 import 한 것이 아니고 필요한 일부만 import 해서 사용을 하고 있습니다. import를 달리 하는 두 가지 경우를 잠시 보겠습니다. 다음의 두 가지 예를 보시면 왜 위와 같이 from을 사용하는지 확인하실 수 있습니다. 첫번째는 PySide6.QtWidgets를 import하는 방법이고 두번째는 PySide6.QtWidgets를 import하는데 qw라는 약어를 사용하겠다는 의미입니다. import 방법에 따라서 4, 9번째 줄의 코딩이 달라집니다. 처음에 사용한 방법으로 import 했을 때 코딩이 가장 간결하고 읽기가 좋습니다. 그래서 위와 같이 코딩을 하는 것이 일반적입니다. 하지만 정답은 없습니다. 다음의 두 가지 중에서 앞쪽 보다 더 편하다고 생각되는 방법이 있다면 편한대로 사용을 하면 됩니다.
mainWindow = MainWindow()
app이라는 어플리케이션을 만들었고, 이번에는 화면에 보이게 만들려는 우리가 만들고 있는 클래스 MainWindow를 호출하고 있습니다. 4번째 줄에 MainWindow 클래스가 선언이 되어 있죠. 클래스가 호출이 되면 자동적으로 호출이 되는 함수가 있는데 그것이 바로 __ini__함수입니다.
__init__함수는 다시 super().__init__()을 호출하고 있는데요. 이 super().__init__()는 MainWindow를 만들 때, 매개변수로 전달이 된 QMainWindow에 있는 __init__함수를 호출하라는 의미입니다. QMainWindow.__init__(self)과 같은 의미라고 할 수 있습니다.
그런데 QMainWindow 자리에 다른 클래스가 올 경우 일일이 QMainWindow.__init__(self)를 새로운 클래스 이름으로 바꿔줘야 하는 번거로움이 생깁니다. 그렇기 때문에 파이썬에서 제공해 주는 super().__init__()라는 함수를 써서 대체하고 있습니다. 코딩을 효율적으로 하기 위한 방법입니다. MainWindow()를 호출하는 부분을 설명하다가 간단하게 MainWindw 클래스의 내용까지 살펴봤습니다.
mainWindow.show()
show() 함수는 QMainWindow 클래스에 정의된 내용들을 화면에 그리라고 명령을 주는 함수입니다. 프로그램을 실행시켰을 때, 프로그램 윈도우가 보여지는 것이 바로 이 show() 함수에 의해서입니다. 여기까지만 하면 프로그램이 보여질까요? 다음의 코드까지 보시죠.
sys.exit(app.exec())
보여준다고 해서 계속 화면에 남아 있지 않습니다. 우리가 보는 윈도우 화면은 가만히 있으면 아무것도 하고 있는 것 같지 않지만 실제로는 우리의 눈보다 빠르게 화면을 다시 그리고 있는 부분이 많습니다. 그래서 프로그램을 지속적으로 실행시키도록 하는 것이 app.exec() 입니다. sys.exit() 함수의 매개변수로 들어 있죠. 프로그램을 app.exec()에 의해서 실행을 하게 되면 모든 동작들은 MainWindow() 클래스에 들어 있는 내용대로 움직이게 됩니다. 프로그램의 x 버튼을 눌러 종료하거나 파이썬참에서 종료를 시키기 직전까지는 말입니다. MainWindow 클래스에서는 아무것도 하지 않는다구요? 우리가 코딩을 __init__ 함수만 만들어줬기 때문에 그리고 실행을 해 보니 텅빈 조그만 윈도우만 보이기 때문에 아무것도 정의가 안된 것이 아닙니다. super().__init__()을 통해서 QMainWindow도 시작을 시켰죠? 그러면 자동으로 QMainWindow에서 실행이 되는 내용들이 모두 수행이 되고 있는 것입니다. 화면 크기도 조정을 할 수 있고 x를 눌러 프로그램을 종료할 수도 있죠. 이런 기본적인 기능들이 모두 들어 있는 것입니다. 그리고 해당 앱을 종료시켰을 때, 비로소 sys.exit()에 의해서 프로그램이 종료가 되는 것입니다.
아무것도 없는 윈도우 밖에 없으니 심심합니다. 그림도 출력을 해 보고 싶기도 하고 키보드로 입력을 할 수 있는 입력창이나 종료라고 씌여있는 버튼도 만들어 보고 싶습니다. 그렇죠?
이렇게 화면에 무엇인가를 그리기 위해서는 생산성이 높은 방법과 하나하나 일일이 코딩을 하는 두 가지 방법이 있습니다. 저는 한줄 한줄 일일이 코딩을 해서 지금까지 프로그램을 만들어 왔습니다만, 처음 접하는 분들에게는 보다 효율적인 방법을 소개시켜 드리고자 합니다. 마우스로 파워포인트에서 또는 한글에서 네모도 그리고 박스도 그리는 것처럼 마우스를 이용하는 방법이 있습니다. 하지만 세세한 동작들은 모두 손으로 코딩을 해 주셔야 합니다. 한 번 해 놓은 코딩은 다음부터는 복사를 해서 사용을 해도 됩니다. 모두 기억을 해서 타이핑을 치는 것도 좋지만 내가 했던 코딩을 참고하거나 인터넷에서 검색을 통해서 할 수도 있습니다. 앞서 배운대로 챗GPT를 사용하는 것도 좋은 방법 중의 하나가 되겠네요.
'IT' 카테고리의 다른 글
내가 선택한 프로그래밍 언어 - 왜 파이썬일까? (1) | 2025.01.30 |
---|---|
파이썬 - Qt 디자이너를 이용한 프로그램 만들기 (0) | 2025.01.30 |
파이썬 - 파워포인트는 어떻게 만들까요? (0) | 2025.01.30 |
파이썬 - 엑셀의 내용을 출력해 봅시다 (0) | 2025.01.30 |
자가 출판 부크크 (1) | 2025.01.21 |
댓글