[PyQt5] 타이머(Timer) 사용하기

PyQt에서 제공하는 타이머를 사용해 간단한 디지털 시계에 대한 UI를 구성해 보겠습니다. 디지털 시계에 대한 표현은 QLCDNumber라는 위젯을 사용합니다. 아래는 최종 실행 결과입니다.

시작 버튼을 클릭하면, 일정한 주기로 시간 표시가 변경되며 멈춤 버튼을 클릭하면 시간 표시에 대한 갱신을 중단합니다. 멈춤 상태에서 다시 시작 버튼을 클릭하면 시간 표시가 변경되기 시작합니다. 코드는 다음과 같습니다.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QTimer, QTime

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

        self.timer = QTimer(self)
        self.timer.setInterval(1000)
        self.timer.timeout.connect(self.timeout)

        self.setWindowTitle('QTimer')
        self.setGeometry(100, 100, 600, 280)
 
        layout = QVBoxLayout()
 
        self.lcd = QLCDNumber()
        self.lcd.display('')
        self.lcd.setDigitCount(8)

        subLayout = QHBoxLayout()
        
        self.btnStart = QPushButton("시작")
        self.btnStart.clicked.connect(self.onStartButtonClicked)
 
        self.btnStop = QPushButton("멈춤")
        self.btnStop.clicked.connect(self.onStopButtonClicked)
 
        layout.addWidget(self.lcd)
        
        subLayout.addWidget(self.btnStart)
        subLayout.addWidget(self.btnStop)
        layout.addLayout(subLayout)
 
        self.btnStop.setEnabled(False)

        self.setLayout(layout)        

    def onStartButtonClicked(self):
        self.timer.start()
        self.btnStop.setEnabled(True)
        self.btnStart.setEnabled(False)

    def onStopButtonClicked(self):
        self.timer.stop()
        self.btnStop.setEnabled(False)
        self.btnStart.setEnabled(True)

    def timeout(self):
        sender = self.sender()
        currentTime = QTime.currentTime().toString("hh:mm:ss")

        if id(sender) == id(self.timer):
            self.lcd.display(currentTime)

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

앞서 언급한 타이머의 갱신 시간 주기는 QTimer의 setInterval 함수로 지정하며 단위는 ms로써, 1000이 1초에 해당합니다. 타이머에 대한 갱신 시작과 중지는 각각 start와 stop입니다.

“[PyQt5] 타이머(Timer) 사용하기”에 대한 4개의 댓글

  1. 안녕하세요 파이썬 초보인 학생입니다!
    다름이아니라 작성자님 코드를 변형해서
    현재시간이아닌 0초부터 카운트 하게끔만든 타이머가 있는데 이 코드를 블로그에 올려도 될까요?
    허락해주시면 정말 감사하겠습니다 !! ㅠㅠ

    1. ChatGPT에 물어보니 다음과 같은 답변을 받았습니다.
      참고로 입력한 프롬프트는 “PyQt의 QLCDNumber를 0초부터 카운트 하는 코드를 작성해줘” 입니다.

      import sys
      from PyQt5.QtWidgets import QApplication, QMainWindow, QLCDNumber, QVBoxLayout, QWidget, QPushButton

      class CounterApp(QMainWindow):
      def __init__(self):
      super().__init__()

      self.initUI()

      def initUI(self):
      # 메인 윈도우 설정
      self.setWindowTitle(‘Counter App’)
      self.setGeometry(100, 100, 400, 200)

      # Central Widget 생성
      central_widget = QWidget()
      self.setCentralWidget(central_widget)

      # 레이아웃 설정
      layout = QVBoxLayout()
      central_widget.setLayout(layout)

      # QLCDNumber 위젯 생성 및 설정
      self.lcd_number = QLCDNumber(self)
      self.lcd_number.setDigitCount(4) # 숫자 자릿수 설정
      layout.addWidget(self.lcd_number)

      # 시작 버튼 생성 및 설정
      start_button = QPushButton(‘Start’, self)
      start_button.clicked.connect(self.start_count)
      layout.addWidget(start_button)

      # 카운트 변수 초기화
      self.count = 0

      def start_count(self):
      # 카운트를 0부터 시작하도록 설정
      self.count = 0

      # 타이머 생성 및 연결
      self.timer = self.startTimer(1000) # 1초마다 타이머 이벤트 발생

      def timerEvent(self, event):
      # 타이머 이벤트 핸들러
      self.count += 1
      self.lcd_number.display(self.count)

      if __name__ == ‘__main__’:
      app = QApplication(sys.argv)
      window = CounterApp()
      window.show()
      sys.exit(app.exec_())

김 형준에 답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다