[ PySide6 ] 트레이 아이콘 애플리케이션 만들기
들어가며
이번 블로그에서는 파이썬에서 PySide6를 사용해
트레이 아이콘 기능을 구현하는 방법을 작성해 보겠습니다.
트레이 아이콘은 윈도우 환경의 오른쪽 하단 작업표시줄에 표시되는 작은 아이콘으로,
프로그램을 백그라운드에서 실행하면서도
쉽게 접근할 수 있게 해주는 기능입니다.
자주 사용하는 기능을 구현해 놓은 프로그램을
트레이 아이콘으로 실행할 수 있게 한다면
필요할 때마다 실행할 필요 없이
쉽고 편하게 불러다 사용할 수 있습니다.
UI 만들기
먼저 QT 디자이너를 사용해
아래와 같이 UI를 구성했습니다.
오른쪽 상단의 X를 누르면 트레이 아이콘으로 변하고
종료 버튼을 누르면 프로그램이 종료되게 만들 겁니다.
UI를 구성하고
객체 탐색기에서 QMainWindow를 선택합니다.
속성편집기의
WindowIcon 속성에서
테마에서 아이콘 선택을 클릭한 다음
적절한 아이콘을 하나 선택해 줍니다.
이 아이콘은 메인 윈도우 좌측 상단의 아이콘을 설정하는 것인데
이 아이콘을 트레이 아이콘으로 사용할 겁니다.
코드 작성하기
1) 기본코드 작성하기
기본 코드를 작성하는 방법은 아래 블로그에 작성되어 있습니다.
※ [ PySide6 ] 파이썬 GUI PySide6 버튼 만들고 함수 연결하기(시그널과 슬롯 기본개념)
여기서 사용한 기본코드는 다음과 같습니다.
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCore import QFile
from tray_ui import Ui_MainWindow
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
위 코드를 실행하면 아래와 같이 화면이 나타납니다.
아이콘도 설정이 되어 있고, 버튼 표시도 잘 되어 있습니다.
2) 종료 버튼을 누르면 프로그램이 종료되는 기능 구현
코드 한 줄로 프로그램 종료 기능을 구현할 수 있습니다.
self.ui.pushButton.clicked.connect(QApplication.quit)
버튼의 객체 이름이 pushButton이고
이 객체를 클릭했을 때
QApplication.quit에 연결하라는 의미입니다.
QApplication.quit는 Qt에서 제공하는 표준 메서드로
프로그램을 종료해 주는 기능을 합니다.
지금까지의 전체코드는 다음과 같습니다.
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCore import QFile
from tray_ui import Ui_MainWindow
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(QApplication.quit)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
3) 트레이 아이콘 기능 구현하기
QSystemTrayIcon을 먼저 import합니다.
from PySide6.QtWidgets import QApplication, QMainWindow, QSystemTrayIcon
그다음 트레이 아이콘을 초기화하는 함수를 만들어줍니다.
def setup_tray_icon(self):
self.tray_icon = QSystemTrayIcon(self)
self.tray_icon.setIcon(self.windowIcon())
self.tray_icon.activated.connect(self.tray_icon_activated)
이 함수는 트레이 아이콘을 초기화하는 함수로
단순히 지금 우리가 만든 윈도우의 아이콘을 사용할 것이고
트레이 아이콘을 더블클릭했을 때 프로그램이 다시 활성화되는 함수에 연결을 했습니다.
트레이 아이콘을 더블클릭했을 때 실행되는
tray_icon_activated 함수는 다음과 같이 구현합니다.
def tray_icon_activated(self, reason):
if reason == QSystemTrayIcon.DoubleClick:
self.show()
그다음 창 닫기 버튼(X)를 눌렀을 때
프로그램이 화면에 보이지 않고
트레이 아이콘으로 만들어지게 하면 됩니다.
def closeEvent(self, event):
event.ignore()
self.hide()
if not self.tray_icon.isVisible():
self.tray_icon.show()
추가 설명을 하자면
QMainWindow의 closeEvent 메서드를 오버라이드(재정의)하여
사용자가 창 닫기(X) 버튼을 누르면 기존에 설정되어 있던 프로그램 종료 기능을 무시합니다.
event.ignore()가 그 기능을 합니다.
그리고 self.hide()를 통해 창을 숨깁니다.
전체 코드
전체 코드는 다음과 같습니다.
아래 코드를 실행하면 창 닫기 버튼(X)를 눌렀을 때
프로그램이 트레이 아이콘으로 변하고
종료를 누르면 바로 종료됩니다.
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QSystemTrayIcon
from tray_ui import Ui_MainWindow
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(QApplication.quit)
self.setup_tray_icon()
def setup_tray_icon(self):
self.tray_icon = QSystemTrayIcon(self)
self.tray_icon.setIcon(self.windowIcon())
self.tray_icon.activated.connect(self.tray_icon_activated)
def tray_icon_activated(self, reason):
if reason == QSystemTrayIcon.DoubleClick:
self.show()
def closeEvent(self, event):
event.ignore()
self.hide()
if not self.tray_icon.isVisible():
self.tray_icon.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
마치며
내가 자주 사용하는 프로그램을
트레이 아이콘으로 만들어 사용하면
훨씬 더 편리하게 프로그램에 접근할 수 있습니다.
[ 파이썬 관련 블로그 글 목록 ]
파이썬(Python) 블로그 목록