PyQt개발강좌, QTimer로 반복 작업 설정

오늘은 PyQt에서 QTimer를 사용하여 반복 작업을 설정하는 방법에 대해 자세히 살펴보겠습니다.
QTimer는 지정된 시간 간격으로 작업을 수행할 수 있는 강력한 도구로, GUI 애플리케이션에서 주기적인 작업이 필요할 때 유용하게 사용할 수 있습니다.
예를 들어, 주기적으로 데이터를 업데이트하거나 애니메이션 효과를 구현하는 데 사용될 수 있습니다.

QTimer란?

QTimer는 PyQt의 timer 클래스 중 하나로, 특정 시간 간격마다 정해진 작업을 수행할 수 있습니다.
이벤트 루프를 유지하면서 비동기적으로 실행되는 코드를 작성할 수 있어, UI가 멈추지 않고 원활하게 작동하도록 도와줍니다.

QTimer의 기본 원리

QTimer는 다음과 같은 주요 개념으로 동작합니다:

  • 타이머 시작: QTimer의 start() 메소드를 호출하여 타이머를 시작합니다.
  • 타이머 기간: 타이머가 호출될 시간 간격을 설정합니다. (밀리초 단위)
  • 신호와 슬롯: QTimer는 시간이 만료될 때 발신하는 timeout() 신호를 가지고 있으며, 이를 통해 지정된 함수를 호출할 수 있습니다.

QTimer 사용법

QTimer를 사용하기 위해서는 먼저 클래스를 임포트해야 합니다:

from PyQt5.QtCore import QTimer

예제: 간단한 QTimer 사용하기

아래는 QTimer를 사용하여 1초마다 메시지를 출력하는 간단한 PyQt 애플리케이션입니다.


import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLabel
from PyQt5.QtCore import QTimer


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

        self.initUI()
        self.timer = QTimer()
        self.timer.timeout.connect(self.update_label)

    def initUI(self):
        self.setWindowTitle('QTimer 예제')
        
        self.layout = QVBoxLayout()
        
        self.label = QLabel('메시지가 여기에 표시됩니다.')
        self.layout.addWidget(self.label)

        self.start_button = QPushButton('타이머 시작')
        self.start_button.clicked.connect(self.start_timer)
        self.layout.addWidget(self.start_button)

        self.stop_button = QPushButton('타이머 정지')
        self.stop_button.clicked.connect(self.stop_timer)
        self.layout.addWidget(self.stop_button)

        self.setLayout(self.layout)

    def start_timer(self):
        self.timer.start(1000)  # 1000ms = 1초

    def stop_timer(self):
        self.timer.stop()

    def update_label(self):
        self.label.setText('타이머가 작동 중입니다!')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = TimerApp()
    ex.show()
    sys.exit(app.exec_())

위의 코드는 QTimer를 사용하여 1초마다 레이블의 텍스트를 업데이트합니다. 사용자는 ‘타이머 시작’ 버튼을 클릭하여 타이머를 시작하고, ‘타이머 정지’ 버튼을 클릭하여 타이머를 중지할 수 있습니다.

QTimer 옵션

QTimer는 다양한 옵션을 제공합니다. 주요 메소드들은 다음과 같습니다:

  • start(milliseconds): 타이머를 시작합니다. milliseconds는 타이머가 작동하는 간격입니다.
  • stop(): 타이머를 중지합니다.
  • isActive(): 타이머가 현재 작동 중인지 확인합니다.
  • setInterval(milliseconds): 타이머의 시간 간격을 설정합니다.
  • timeout(): 타이머가 만료되었을 때 발신하는 신호입니다.

예제: 더 복잡한 QTimer 사용하기

이제 QTimer를 사용하여 더 복잡한 애플리케이션을 만들어 보겠습니다.
이번 예제에서는 QTimer를 사용하여 시계를 생성하고, 매초 현재 시간을 업데이트하여 표시하겠습니다.


import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel
from PyQt5.QtCore import QTimer, QTime


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

        self.initUI()
        self.timer = QTimer()
        self.timer.timeout.connect(self.update_time)

    def initUI(self):
        self.setWindowTitle('QTimer를 이용한 시계')
        
        self.layout = QVBoxLayout()
        
        self.time_label = QLabel('')
        self.layout.addWidget(self.time_label)

        self.setLayout(self.layout)

        self.start_timer()

    def start_timer(self):
        self.timer.start(1000)  # 1초 간격으로 타이머 시작

    def update_time(self):
        current_time = QTime.currentTime().toString()
        self.time_label.setText(f'현재 시간: {current_time}')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = ClockApp()
    ex.show()
    sys.exit(app.exec_())

이 코드는 매초 현재 시간을 레이블에 업데이트하는 애플리케이션입니다. 사용자가 애플리케이션을 실행하면 자동으로 타이머가 시작되고, 현재 시간이 매초 업데이트됩니다.

QTimer의 이점

QTimer의 주요 이점은 다음과 같습니다:

  • 비동기 처리: 타이머는 주기적으로 작업을 수행하지만, UI 이벤트 루프를 차단하지 않으므로 애플리케이션의 응답성을 유지합니다.
  • 다양한 용도로 활용 가능: 시계, 애니메이션 업데이트, 주기적인 데이터 전송 등 여러 가지 용도로 활용할 수 있습니다.
  • 간편한 구현: 슬롯과 신호를 통해 쉽게 구현할 수 있으며, 코드가 간결합니다.

QTimer를 활용한 애플리케이션 아이디어

QTimer를 사용하여 개발할 수 있는 흥미로운 애플리케이션 아이디어를 몇 가지 소개합니다:

  • 게임 애플리케이션: 타이머를 사용하여 남은 시간 표시, 캐릭터 움직임 및 공격 속성 조절 등에 활용할 수 있습니다.
  • 주식 시세 업데이트: 주기적으로 주식 시세를 가져와서 UI를 업데이트하는 애플리케이션을 만들 수 있습니다.
  • 타이머 기능: 사용자가 설정한 시간에 경고음을 울리거나 메시지를 표시하는 타이머 애플리케이션을 구현할 수 있습니다.

결론

이번 포스트에서는 PyQt의 QTimer에 대해 살펴보았습니다. QTimer를 사용하여 반복 작업을 간편하게 설정하고, 이벤트 루프를 차단하지 않는 비동기 작업을 구현할 수 있습니다.
다양한 애플리케이션에서 유용하게 활용할 수 있는 QTimer를 통해 사용자 경험을 향상시키고, 보다 동적인 애플리케이션을 만들어보세요.
QTimer는 여러분의 PyQt 개발에 큰 도움이 될 것입니다. 감사합니다!