PyQt는 파이썬 프로그래밍 언어를 위한 Python 바인딩으로, Qt 애플리케이션 프레임워크를 사용할 수 있게 도와줍니다.
Qt는 매우 강력한 GUI 프레임워크로, 다양한 플랫폼에서 사용할 수 있는 응용 프로그램을 개발할 수 있게 해줍니다.
이 글에서는 MacOS에서 제공하는 Spotlight와 유사한 기능을 구현하는 방법에 대해 알아보겠습니다.
Spotlight는 사용자가 입력한 텍스트를 기반으로 파일 및 애플리케이션을 검색할 수 있는 기능입니다.
QPixmap과 QTimer를 이용한 이미지 전환 구현
본 강좌에서는 PyQt에서 QPixmap
과 QTimer
클래스를 이용하여 주기적인 이미지 전환 기능을 구현할 것입니다.
QPixmap
클래스는 이미지 파일을 쉽게 로드하고 표시할 수 있도록 도와주며,
QTimer
클래스는 주기적으로 특정 작업을 실행할 수 있게 해줍니다.
개발 환경 설정
PyQt를 사용하기 위해 먼저 PyQt5를 설치해야 합니다. 다음 명령을 사용하여 PyQt5를 설치합니다:
pip install PyQt5
기본 구조와 UI 구성
먼저 기본 애플리케이션 구조를 설정하고 UI를 구성하는 단계입니다.
QWidget
를 기본 윈도우로 설정하고, 그 안에 QLabel
을 추가하여 이미지를 표시할 영역을 만들겠습니다.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import QTimer
class SpotlightApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Spotlight Simulator')
self.setGeometry(100, 100, 600, 400)
# 레이아웃 설정
layout = QVBoxLayout()
self.label = QLabel(self)
layout.addWidget(self.label)
self.setLayout(layout)
# 이미지 로드
self.imageList = ['image1.jpg', 'image2.jpg', 'image3.jpg']
self.currentIndex = 0
self.displayImage()
# QTimer 설정
self.timer = QTimer(self)
self.timer.timeout.connect(self.updateImage)
self.timer.start(2000) # 2초 간격으로 이미지 전환
def displayImage(self):
pixmap = QPixmap(self.imageList[self.currentIndex])
self.label.setPixmap(pixmap.scaled(self.label.size(), aspectRatioMode=True))
def updateImage(self):
self.currentIndex = (self.currentIndex + 1) % len(self.imageList)
self.displayImage()
if __name__ == '__main__':
app = QApplication(sys.argv)
spotlight = SpotlightApp()
spotlight.show()
sys.exit(app.exec_())
코드 설명
위의 코드는 PyQt5를 이용한 기본 애플리케이션 구조입니다.
SpotlightApp
클래스는 QWidget
을 상속받아 UI를 초기화하고 주기적으로 이미지를 변경하는 기능을 포함하고 있습니다.
-
__init__
: 초기화 메서드로, UI를 설정하는initUI
메서드를 호출합니다. -
initUI
: UI의 레이아웃과 이미지를 표시할QLabel
을 생성합니다.
QTimer
를 설정하여 2초 간격으로updateImage
메서드를 호출합니다. -
displayImage
: 현재 인덱스에 해당하는 이미지를QLabel
에 표시합니다. -
updateImage
: 현재 인덱스를 증가시켜 다음 이미지를 표기합니다.
이미지를 순환적으로 표시하기 위해 인덱스를 이미지 목록의 길이로 나눈 나머지를 사용합니다.
이미지 전환 효과 추가하기
이미지 전환 시 간단한 페이드 효과를 추가하여 UX를 향상시킬 수 있습니다.
페이드 효과는 현재 이미지를 서서히 투명하게 만든 후 다음 이미지를 표시하는 방식으로 구현할 수 있습니다.
이를 위해 QGraphicsOpacityEffect
를 사용할 수 있습니다.
from PyQt5.QtWidgets import QGraphicsOpacityEffect
def displayImage(self):
pixmap = QPixmap(self.imageList[self.currentIndex])
self.label.setPixmap(pixmap.scaled(self.label.size(), aspectRatioMode=True))
# Opacity 효과 설정
effect = QGraphicsOpacityEffect()
effect.setOpacity(0)
self.label.setGraphicsEffect(effect)
# 페이드 효과 애니메이션
fade_in = QPropertyAnimation(effect, b'opacity')
fade_in.setDuration(1000) # 1초 동안 페이드 인
fade_in.setStartValue(0)
fade_in.setEndValue(1)
fade_in.start(QAbstractAnimation.DeleteWhenStopped)
완성된 프로그램
위의 코드 완성된 프로그램 모양은 아래와 같이 됩니다:
class SpotlightApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Spotlight Simulator')
self.setGeometry(100, 100, 600, 400)
layout = QVBoxLayout()
self.label = QLabel(self)
layout.addWidget(self.label)
self.setLayout(layout)
self.imageList = ['image1.jpg', 'image2.jpg', 'image3.jpg']
self.currentIndex = 0
self.displayImage()
self.timer = QTimer(self)
self.timer.timeout.connect(self.updateImage)
self.timer.start(2000)
def displayImage(self):
pixmap = QPixmap(self.imageList[self.currentIndex])
self.label.setPixmap(pixmap.scaled(self.label.size(), aspectRatioMode=True))
effect = QGraphicsOpacityEffect()
effect.setOpacity(0)
self.label.setGraphicsEffect(effect)
fade_in = QPropertyAnimation(effect, b'opacity')
fade_in.setDuration(1000)
fade_in.setStartValue(0)
fade_in.setEndValue(1)
fade_in.start(QAbstractAnimation.DeleteWhenStopped)
def updateImage(self):
self.currentIndex = (self.currentIndex + 1) % len(self.imageList)
self.displayImage()
결론
이번 강좌에서는 PyQt로 MacOS Spotlight와 유사한 이미지 전환 기능을 구현하는 방법에 대해 알아보았습니다.
기본적인 QLabel과 QPixmap을 이용하여 이미지를 표시하고, QTimer로 주기적인 이미지 전환을 구현했습니다.
또한 페이드 효과를 추가하여 더 매끄러운 전환을 구현하였습니다.
여러분의 창의력을 발휘하여 다양한 UI 요소와 효과를 추가하여 더욱 나만의 애플리케이션을 만들어 보세요.
파이썬과 PyQt를 활용하면 자신의 아이디어를 신속하고 쉽게 구현할 수 있습니다.