PyQt 예제 3.2.1

이번 글에서는 메뉴에 아이콘을 추가하는 것에 대해서 알아보겠다.


일단, 아이콘을 추가하는 방법 자체는 매우 간단하다. 원하는 액션인자에 QIcon(파일경로)를 추가해주면 된다.

예를 들어, simpleDialogAction = QAction("단순 대화상자", self) 에 아이콘을 추가한다면,

QAction(QIcon("/home/image/icon.png"), "단순 대화상자", self) # 절대 경로 방법
QAction(QIcon("./image/icon.png"), "단순 대화상자", self) # 상대 경로 방법

와 같이 변경해주면 된다.

그런데 문제는 위와 같이 하게 되면 프로그램이 어디서 실행 되느냐에 따라서 아이콘이 제대로 작동할 수도 있고, 안할 수도 있다. 일단, 절대 경로는 프로그램 자체의 실행 위치는 상관이 없다. 그러나 아이콘과 함께 프로그램을 다른 위치로 이동하게 되면 아이콘을 불러오지 못한다. 따라서 제대로 나오게 하려면 위 경로를 일일이 변경을 해주어야 한다.

만약, 다른 위치 변경에 대한 문제를 해결한다면 상대 경로를 쓰는 방법도 있을 수 있다. 이렇게 하면 프로그램과 아이콘 경로가 함께 이동하더라도 그 상대적 위치는 동일하므로 문제는 없을 것이다.

다만, 파이썬이 프로그램을 실행시킬 때 어디서 실행을 하느냐에 따라서 아이콘이 나올 수도, 안 나올 수도 있다. 파이썬은 윈도우즈에서는 c:\pythonXX 위치에서 구동이 되고, 리눅스는 /usr/bin/python 과 비슷한 위치에서 실행이 된다. 그런데 프로그램을 구동시키면, 프로그램은 정상적인 위치에 있더라도 파이썬은 앞에서 말한 위치에 존재하기 때문에 아이콘의 제대로된 경로를 알지 못한다.
(단, 파이썬을 프로그램이 있는 폴더에서 직접 실행시키면 잘 나올 것이다.)

이를 단순히 해결한다면, 실행 시에 현재 파일의 위치만 정확히 알면 되므로 os.path.dirname(__file__)을 아이콘 앞의 경로로 지정해준다면 언제든지 아이콘이 잘 나올 것이다.
(__file__에는 현재 실행되는 파일의 절대 경로가 포함되어 있다. 따라서 이 경로의 폴더 경로만 가져와서 아이콘의 상대 경로 앞에 붙여주는 것이다.)

그러나 여기서는 다른 방법을 사용할 것이다. qt 에서는 리소스(아이콘, 도움말 문서 등)들을 관리해주는 파일을 생성할 수 있다. 확장자는 qrc로 되어 있고, 구성은 xml로 되어 있다.
(2012.02.18 추가 - 최근에 PyQt 프로그램을 배포하기 위해서 qrc 파일에 대해서 찾아보았는데, 이 파일이 하는 역할은 어떠한 데이터(이진, 텍스트)들에 대해서, 하나의 파일에 모두 첨부시키는 역할을 한다.(단순히 상대 경로의 위치를 알려주는 역할이 아니다.) 즉, 이후에 Qt 에서는 rcc, PyQt 에서는 pyrcc를 사용하여 파일을 변환하게 되는데, 이 파일에 모든 데이터들의 정보가 포함되게 된다.

따라서, 이와 관련한 데이터들을 함께 배포할 필요 없이, 단순히 qrc로 부터 변환된 파일만 배포하더라도 모든 데이터들을 손실 없이 배포할 수 있게 된다. 이와 관련한 자세한 내용은 http://developer.qt.nokia.com/doc/qt-4.8/resources.html 을 참조하면 된다.)

리소스 파일을 만들기 위해서 굳이 xml을 배울 필요는 없고, 간단한 사용법만 알면 된다.
일단, 텍스트 파일을 생성해서 파일명.qrc로 변경을 한다. 그리고 아래처럼 파일을 편집해주면 된다.
(아이콘들은 현재 프로그램 폴더에서 image 폴더 내에 들어있다.)


image/mainIcon.png
image/simpleDialogIcon.png
image/signalDialogIcon.png
image/connectDialogIcon.png
image/dumbDialogIcon.png
image/standardDialogIcon.png
image/smartDialogIcon.png
image/liveDialogIcon.png


중요한 부분은 qresource 태그 사이에 있는 값들을 편집해주는 것이다. 일단, file alias=... 에서 alias=... 은 없어도 상관이 없다. 다만, alias는 다른 곳에서 사용할 때 이 별칭을 사용할 수 있도록 해준다. 만약, 이를 쓰지 않으면 사이에 있는 값을 사용해야 한다.

이제, 리소스 파일을 추가해주었으므로, 이를 사용하기 위해서 파이썬 모듈로 변환을 시켜주어야 한다. PyQt를 설치할 때 pyrcc4 라는 프로그램도 같이 설치가 된다. 이는 qrc 파일을 파이썬 모듈로 변환을 시켜주는 도구이다.

커맨드 명령으로 "pyrcc4 -o qrc_resource.py resource.qrc"와 같이 해주면 파일이 변환된다.
(리눅스는 파일 경로가 자동으로 지정되어 있을 것이므로 쉽게 변환이 될 것이다. 윈도우즈는 아마도 GUI 프로그램이 있지 않을까 싶다. 윈도우즈를 안써서 모르겠다... 만약, 없다면 PATH 환경 변수에 pyrcc4 를 등록하고 커맨드 명령으로 변환 시킬 수 있다.)

그런데 주의할 점은, 위의 명령은 파이썬2에서 작동하는 명령이다. 파이썬3에서 사용하려면 -py3 옵션을 추가해주면 된다.

이처럼 파일을 변환시켰다면, 이제 모듈을 임포트하고 아이콘을 사용하면 된다.
import qrc_resource
# 중간 생략
        simpleDialogAction = QAction(QIcon(":simpleDialogIcon.png"), 
                                            "단순 대화상자", self)
# 중간 생략
        signalDialogAction = QAction(QIcon(":signalDialogIcon.png"),
                                        "시그널 대화상자", self)
# 중간 생략
        connectDialogAction = QAction(QIcon(":connectDialogIcon.png"), 
                                        "Connect 대화상자", self)
# 중간 생략
        dumbDialogAction = QAction(QIcon(":dumbDialogIcon.png"),
                                    "Dumb 대화상자", self)
# 중간 생략
        standardDialogAction = QAction(QIcon(":standardDialogIcon.png"), 
                                        "Standard 대화상자", self)
# 중간 생략
        smartDialogAction = QAction(QIcon(":smartDialogIcon.png"), 
                                    "Smart 대화상자", self)
# 중간 생략
        liveDialogAction = QAction(QIcon(":liveDialogIcon.png"), 
                                    "Live 대화상자", self)
# 중간 생략
    app.setWindowIcon(QIcon(":mainIcon.png"))
위와 같이 mainWindow.py 파일을 수정 해주면 아이콘이 이제 나타난다. : 표시는 메인 모듈에서 쓰겠다는 것이고, 이를 안쓰면 단순히 파일의 경로를 검색하게 된다.

그리고 위에서 말했 듯이, alias를 썼기 때문에 사이에 있는 값을 쓰지 않아도 된다.

댓글 없음:

댓글 쓰기