PyQt개발강좌, MacOS Spotlight 같은 기능 구현, PyQt에서 다이나믹 이미지 배경 교체

현대의 GUI 애플리케이션에서 사용자 경험을 극대화하기 위해 다양한 기능과 편의성을 제공하는 것이 중요합니다.
MacOS의 Spotlight 기능은 사용자가 원하는 정보를 빠르게 찾을 수 있도록 도와주는 매우 유용한 검색 도구입니다.
본 글에서는 PyQt를 사용하여 MacOS Spotlight와 유사한 기능을 구현하고, 배경 이미지를 다이나믹하게 변경하는 방법에 대해 자세히 알아보겠습니다.

1. PyQt 기본 설정하기

PyQt를 사용하기 위해서는 먼저 개발 환경을 설정해야 합니다.
Python과 PyQt5가 설치되어 있어야 하며, 설치 방법은 다음과 같습니다:

pip install PyQt5

1.1 PyQt 프로젝트 구조

PyQt 프로젝트는 일반적으로 다음과 같은 구조로 구성됩니다:

  • main.py: 애플리케이션의 진입점
  • ui.py: UI 구성 요소
  • resources/: 이미지 및 기타 리소스

2. MacOS Spotlight 유사 기능 구현하기

Spotlight 기능을 구현하기 위해 검색창과 결과 리스트를 표시하는 기본 GUI를 만듭니다.
사용자가 입력한 텍스트에 따라 검색 결과가 필터링되어 실시간으로 업데이트됩니다.

2.1 기본 GUI 구성하기


import sys
from PyQt5.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QLineEdit, QListWidget
)

class SpotlightWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Spotlight 기능 구현")
        self.setGeometry(100, 100, 400, 300)

        self.layout = QVBoxLayout()

        self.search_bar = QLineEdit(self)
        self.search_bar.setPlaceholderText("검색어를 입력하세요...")
        self.search_bar.textChanged.connect(self.on_text_changed)

        self.results_list = QListWidget(self)

        self.layout.addWidget(self.search_bar)
        self.layout.addWidget(self.results_list)

        self.setLayout(self.layout)

    def on_text_changed(self, text):
        # 여기에 검색 로직을 추가할 예정입니다.
        pass

if __name__ == "__main__":
    app = QApplication(sys.argv)
    spotlight = SpotlightWidget()
    spotlight.show()
    sys.exit(app.exec_())

2.2 검색 기능 추가하기

사용자가 입력한 텍스트에 따라 결과 목록을 필터링하는 기능을 구현합니다.


        def on_text_changed(self, text):
            self.results_list.clear()
            if text:
                results = self.search_items(text)
                self.results_list.addItems(results)

        def search_items(self, query):
            # 예시 데이터
            items = ["Python", "PyQt", "JavaScript", "Java", "C++", "C#", "Ruby", "Go", "Swift", "Kotlin"]
            return [item for item in items if query.lower() in item.lower()]

3. 다이나믹 이미지 배경 교체하기

배경 이미지를 동적으로 바꾸는 기능은 애플리케이션의 시각적인 매력을 극대화시켜줍니다.
사용자가 검색어를 입력할 때마다 배경 이미지를 변경하는 기능을 추가합니다.

3.1 이미지 리소스 추가하기

배경으로 사용할 이미지를 프로젝트 리소스 폴더에 추가합니다.
여기서는 맑은 하늘과 산의 이미지를 예시로 사용할 것입니다.

3.2 배경 이미지 변경하기


from PyQt5.QtGui import QPalette, QBrush, QPixmap

class SpotlightWidget(QWidget):
    def __init__(self):
        super().__init__()

        # 기존 코드 ...

        # 초기 배경 설정
        self.set_background("resources/background1.jpg")

    def set_background(self, image_path):
        palette = QPalette()
        palette.setBrush(QPalette.Window, QBrush(QPixmap(image_path)))
        self.setPalette(palette)

    def on_text_changed(self, text):
        self.results_list.clear()
        if text:
            results = self.search_items(text)
            self.results_list.addItems(results)
            self.change_background_based_on_input(text)

    def change_background_based_on_input(self, text):
        if "python" in text.lower():
            self.set_background("resources/background_python.jpg")
        elif "java" in text.lower():
            self.set_background("resources/background_java.jpg")
        else:
            self.set_background("resources/background1.jpg")  # 기본 배경

4. 코드 완성 및 실행

전체 코드를 종합하여 실행해보면, 사용자가 검색어를 입력할 때마다 배경 이미지가 동적으로 변경되며,
입력한 텍스트에 맞는 검색 결과가 리스트에 표시됩니다.
코드를 실행하기 위해, 아래와 같이 전체 코드를 작성해보세요.


import sys
from PyQt5.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QLineEdit, QListWidget
)
from PyQt5.QtGui import QPalette, QBrush, QPixmap

class SpotlightWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Spotlight 기능 구현")
        self.setGeometry(100, 100, 400, 300)

        self.layout = QVBoxLayout()

        self.search_bar = QLineEdit(self)
        self.search_bar.setPlaceholderText("검색어를 입력하세요...")
        self.search_bar.textChanged.connect(self.on_text_changed)

        self.results_list = QListWidget(self)

        self.layout.addWidget(self.search_bar)
        self.layout.addWidget(self.results_list)

        self.setLayout(self.layout)

        # 초기 배경 설정
        self.set_background("resources/background1.jpg")

    def set_background(self, image_path):
        palette = QPalette()
        palette.setBrush(QPalette.Window, QBrush(QPixmap(image_path)))
        self.setPalette(palette)

    def on_text_changed(self, text):
        self.results_list.clear()
        if text:
            results = self.search_items(text)
            self.results_list.addItems(results)
            self.change_background_based_on_input(text)

    def search_items(self, query):
        items = ["Python", "PyQt", "JavaScript", "Java", "C++", "C#", "Ruby", "Go", "Swift", "Kotlin"]
        return [item for item in items if query.lower() in item.lower()]

    def change_background_based_on_input(self, text):
        if "python" in text.lower():
            self.set_background("resources/background_python.jpg")
        elif "java" in text.lower():
            self.set_background("resources/background_java.jpg")
        else:
            self.set_background("resources/background1.jpg")  # 기본 배경

if __name__ == "__main__":
    app = QApplication(sys.argv)
    spotlight = SpotlightWidget()
    spotlight.show()
    sys.exit(app.exec_())

5. 마무리

이번 강좌에서는 PyQt를 사용하여 MacOS의 Spotlight와 유사한 기능을 구현하고,
사용자 입력에 따라 다이나믹하게 배경 이미지를 변경하는 방법을 살펴보았습니다.
이러한 기능들은 GUI 애플리케이션에서 사용자 경험을 향상시키는데 큰 도움이 됩니다.
앞으로 개발하시면서 다양한 기능을 추가하여 자신만의 스타일로 발전시켜보세요.