pyside로 GUI 프로그램을 만들면 작업 표시줄과 타이틀 좌측 아이콘이 기본 아이콘으로 보이게 됩니다. 대부분의 프로그램은 고유의 아이콘으로 표시되어 어떤 프로그램인지를 잘 알 수 있도록 만들어지는데 pyside로 만든 GUI 프로그램도 나만의 아이콘이 보이도록 하는 방법을 정리했습니다. 창 상단 타이틀 바의 아이콘은 window.setWindowIcon() 메서드를 사용하면 바뀌지만 작업표시줄의 아이콘은 바뀌지를 않습니다. 이유는 윈도우 OS가 pyside로 만든 프로그램을 독립된 앱으로 인식하는 것이 아니라 파이썬 인터프리터의 하위 프로세스로만 인식해서 파이썬 기본 아이콘이 보이게 됩니다. 여기서는 이 현상을 시스템 레벨에서 우회하여 작업표시줄에서도 내가 설정한 아이콘이 보이도록 하는 것까지 포함되어 있습니다.
예제로 사용한 코드는 윈도우 탐색기의 좌측 트리 구조 부분을 구현한 것이고, 아이콘을 따로 디자인하지는 않았고 Google Docs의 Sheets.ico를 사용했습니다. 윈도우에서는 ico 파일을 사용하는 것이 좋습니다. pyside를 사용할 경우 main 함수 부분은 대부분 코드가 정해져 있습니다. 아래의 코드는 아이콘 설정까지 적용된 메인 코드입니다. os와 ctypes를 import해야 타이틀과 작업표시줄에 아이콘이 표시되는 api를 사용할 수 있습니다. 마지막으로 ico 파일은 소스코드와 같은 폴더에 위치하는 것이 경로 지정이 간편해집니다.
import sys
import os
import ctypes
from PySide6.QtWidgets import QApplication, QMainWindow, QTreeView, QVBoxLayout, QWidget, QStyle
from PySide6.QtGui import QStandardItemModel, QStandardItem, QIcon
from PySide6.QtCore import QSize
if __name__ == "__main__":
# 1. 윈도우 작업표시줄에 파이썬 기본 아이콘 대신 고유 아이콘이 뜨도록 설정
try:
my_app_id = "mycompany.myproduct.subproduct.version" # 임의의 고유 문자열
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(my_app_id)
except AttributeError:
pass # 윈도우가 아닌 OS(Mac, Linux) 환경일 경우 예외 처리
app = QApplication(sys.argv)
# 2. 프로그램 전체 아이콘 세팅 (.ico 또는 .png 파일 지정)
# 실행할 스크립트와 같은 폴더에 'my_icon.ico' 파일이 있다고 가정합니다.
icon_path = os.path.join(os.path.dirname(__file__), "my_icon.ico")
app.setWindowIcon(QIcon(icon_path))
window = SidebarTreeWindow()
window.show()
sys.exit(app.exec())
위에 제시한 코드를 그대로 적용하기 편하게 my_icon.ico 파일로 첨부해놓겠습니다.
1. 윈도우 작업표시줄 아이콘 강제 분리 (1번 주석 부분)
- 역할 : 이 프로그램이 python.exe와 무관한 '독립된 단독 애플리케이션'임을 윈도우 운영체제에 명시적으로 등록하는 과정입니다.
- 원리 : 윈도우의 내부 API인 AppUserModelID를 설정해 두면, 윈도우 작업표시줄이 이 프로세스를 완전히 새로운 앱으로 인식하여 파이썬 기본 로고 그룹에서 탈출시킵니다.
- 예외 처리 : ctypes.windll은 윈도우 전용 라이브러리이므로, 맥(macOS)이나 리눅스 환경에서는 에러가 발생하므로 try-except로 처리했습니다. (여기서는 맥이나 리눅스에서 나의 아이콘이 보이는 부분은 구현하지 않았습니다.)
2. 안전한 절대 경로 생성 (2번 주석 부분)
- 역할 : 아이코 파일(my_icon.ico)를 불러올 때 에러가 나이 않도록 실시간 절대 경로를 계산합니다.
- 원리 : 단순히 "my_icon.ico"라고만 적으면, 프로그램을 터미널이나 특정 작업 폴더 외부에서 실행했을 때 이미지를 찾지 못해 아이콘이 깨집니다. __file__을 기준으로 현재 스크립트 파일이 있는 폴더 경로를 고정해 주어 어디서 실행하든 안전하게 이미지를 로드합니다.
3. 애플리케이션 전체에 아이콘 설정 (app.setWindowIcon(QIcon(icon_path)))
- 역할 : 불러온 아이콘을 내 프로그램의 심벌로 선언합니다.
- 윈도우와 인스턴스의 차이 : window.setWindowIcon()을 쓰면 해당 메인 창 하나에만 적용되지만, app.setWindowIcon()을 사용하면 프로그램 안에서 파생되는 모든 서브창, 메시지 알림 창, 작업표시줄에 아이콘이 적용됩니다.
아래의 코드는 윈도우 탐색기의 좌측 트리 형식으로 구현한 전체 코드입니다.
import sys
import os
import ctypes
from PySide6.QtWidgets import QApplication, QMainWindow, QTreeView, QVBoxLayout, QWidget, QStyle
from PySide6.QtGui import QStandardItemModel, QStandardItem, QIcon
from PySide6.QtCore import QSize
class SidebarTreeWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("탐색기 스타일 사이드바")
self.resize(300, 600)
# 1. 트리 뷰 위젯 생성 및 기본 설정
self.tree_view = QTreeView()
self.tree_view.setHeaderHidden(True) # 맨 위 헤더(Column 타이틀) 숨기기
self.tree_view.setIconSize(QSize(20, 20)) # 아이콘 크기를 이미지처럼 보기 좋게 키우기
self.tree_view.setIndentation(20) # 자식 노드 들여쓰기 너비 설정
# 2. 트리 데이터 모델 생성
model = QStandardItemModel()
root_node = model.invisibleRootItem() # 최상위 루트 노드 준비
# 3. [바탕 화면] 최상위 부모 항목 생성 (이미지 맨 위 구조)
# SP_DesktopIcon은 Qt 내부의 기본 바탕화면 아이콘입니다.
style = self.style() # 현재 애플리케이션의 스타일을 가져옵니다.
desktop_icon = style.standardIcon(QStyle.StandardPixmap.SP_DesktopIcon)
desktop_item = QStandardItem(desktop_icon, "바탕 화면")
root_node.appendRow(desktop_item) # 최상위에 장착
# 4. [바탕 화면]의 자식 항목들 추가하기 (이미지 속 하위 리스트들)
home_icon = style.standardIcon(QStyle.StandardPixmap.SP_DirHomeIcon)
doc_icon = style.standardIcon(QStyle.StandardPixmap.SP_FileIcon)
pc_icon = style.standardIcon(QStyle.StandardPixmap.SP_ComputerIcon)
trash_icon = style.standardIcon(QStyle.StandardPixmap.SP_TrashIcon)
network_icon = style.standardIcon(QStyle.StandardPixmap.SP_DriveNetIcon)
# 자식 노드 아이템 생성
home_item = QStandardItem(home_icon, "홈")
download_item = QStandardItem(home_icon, "다운로드")
document_item = QStandardItem(doc_icon, "문서")
my_pc_item = QStandardItem(pc_icon, "내 PC")
trash_item = QStandardItem(trash_icon, "휴지통")
network_item = QStandardItem(network_icon, "네트워크")
# 바탕 화면(desktop_item) 아래에 자식으로 하나씩 붙이기 (계층 구조 형성)
desktop_item.appendRow(home_item)
desktop_item.appendRow(download_item)
desktop_item.appendRow(document_item)
desktop_item.appendRow(my_pc_item)
desktop_item.appendRow(trash_item)
desktop_item.appendRow(network_item)
# 5. 모델을 트리 뷰에 연결하고 처음부터 다 펼쳐두기
self.tree_view.setModel(model)
self.tree_view.expandAll() # 트리 뷰의 모든 노드를 펼쳐서 보여줍니다. (필요에 따라 주석 처리 가능)
# 6. 레이아웃 세팅
layout = QVBoxLayout()
layout.addWidget(self.tree_view)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
if __name__ == "__main__":
# 1. 윈도우 작업표시줄에 파이썬 기본 아이콘 대신 고유 아이콘이 뜨도록 설정
try:
my_app_id = "mycompany.myproduct.subproduct.version" # 임의의 고유 문자열
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(my_app_id)
except AttributeError:
pass # 윈도우가 아닌 OS(Mac, Linux) 환경일 경우 예외 처리
app = QApplication(sys.argv)
# 2. 프로그램 전체 아이콘 세팅 (.ico 또는 .png 파일 지정)
# 실행할 스크립트와 같은 폴더에 'my_icon.ico' 파일이 있다고 가정합니다.
icon_path = os.path.join(os.path.dirname(__file__), "my_icon.ico")
app.setWindowIcon(QIcon(icon_path))
window = SidebarTreeWindow()
window.show()
sys.exit(app.exec())
위 코드를 실행하면 [그림 1]과 같이 실행됩니다. 타이틀 좌측 상단에 내가 설정한 아이콘이 표시되고, 작업표시줄에 [그림 2]의 아이콘이 보여야 합니다.


※ pyinstaller를 이용해서 아이콘을 포함한 빌드 방법
pyinstaller --noconsole --onefile --icon=my_icon.ico --add-data "my_icon.ico;." py_tree_view.py
--add-data "my_icon.ico;." 이 부분이 추가한 후에 빌드하면 실행파일에도 my_icon.ico가 적용되어 윈도우 탐색기에서 py_tree_view.exe 옆에 [그림 2]의 아이콘이 보이게 됩니다. 또한 실행하게 되면 타이틀바 좌측, 작업 표시줄에도 내가 적용한 아이콘이 표시됩니다.
'프로그래밍' 카테고리의 다른 글
| pygame으로 공 튀기기 만들기 (0) | 2026.10.05 |
|---|---|
| SQLite3 핵심 요약과 파이썬 예제 (0) | 2026.10.05 |
| 파이썬 PySide로 계기판 만들기 (0) | 2026.10.05 |
| 파이썬으로 IP 기반 위치 정보 조회하기 (0) | 2026.10.05 |
| 파이썬으로 오실로스코프(DHO924S) 화면 캡처 (0) | 2026.10.05 |