본문으로 바로가기

다음 예제는 QTimer 의 사용방법 및 활용에 관한 예제입니다.

프로그램 시연

전체 코드

from PyQt5.QtWidgets import *
from PyQt5 import uic
from PyQt5.QtCore import Qt
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
import os

PATH = os.path.dirname(os.path.abspath(__file__))

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi(os.path.join(PATH, 'ex.ui'), self)
        self.setWindowTitle('QTimer 예제')

        self.timer = QTimer()
        self.t = QTimer()
        self.t.start()
        self.timer.timeout.connect(self.count)
        self.reset()
        self.t.timeout.connect(self.show_remaind)
        
        self.start_btn.clicked.connect(self.timer_start)
        self.stop_btn.clicked.connect(self.timer.stop)
        self.set_btn.clicked.connect(self.set_interval)
        self.ss_btn.clicked.connect(self.singleshot)
        self.reset_btn.clicked.connect(self.reset)

    def reset(self):
        self.interval = 1000
        self.cnt = 0
        self.rt = -1
        self.is_rs = False
        
        self.timer.setInterval(self.interval)
        self.remaind_le.setText('')
        self.count_le.setText('')
        if self.timer.isActive():
            self.timer.stop()

    def singleshot(self):
        def msg_box():
            QMessageBox.information(self, self.windowTitle(), self.ss_le_2.text())
            self.ss_le.setText('')
            self.ss_le_2.setText('')
        self.timer.singleShot(int(self.ss_le.text())*1000, msg_box)


    def show_remaind(self):
        if self.timer.isActive():
            self.rt = self.timer.remainingTime()
            self.remaind_le.setText('ms: '+ str(self.rt))

    def timer_start(self):
        itv = self.interval
        if self.rt > -1:
            self.is_rs = True
            itv = self.rt
        self.timer.start(itv)
        

    def count(self):
        if self.is_rs:
            self.timer.setInterval(self.interval)
            self.is_rs = False
        self.cnt += 1
        self.count_le.setText('sec: ' + str(self.cnt))

    def set_interval(self):
        if not self.timer.isActive():
            self.reset()
        self.interval = int(self.iv_le.text()) * 1000
        self.timer.setInterval(self.interval)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle(QStyleFactory.create('Fusion'))
    main_window = MainWindow()
    main_window.show()
    app.exec_()

 

QTimer class

 

QTimer Class | Qt Core 5.15.0

QTimer Class The QTimer class provides repetitive and single-shot timers. More... Header: #include qmake: QT += core Inherits: QObject Properties Public Functions Public Slots Signals Static Public Members void singleShot(int msec, const QObject *receiver,

doc.qt.io

  • QTimer 클래스는 타이머를 위한 고급 프로그래밍 인터페이스를 제공한다.
  • QTimer 객체를 생성하고 timeout() 신호를 해당 슬롯에 연결한 후 start() 를 호출한다.
  • 호출한 시점부터는 일정한 간격으로 timeout() 신호를 방출한다.

 

일정 시간 간격으로 지속적으로 호출하기

다음 코드는 1초 간격으로 run() 함수를 호출합니다.

QTimer 객체를 생성하여 timeout signal 과 수행 함수를 연결하고 1초 간격의 Inverval 로 객체를 수행합니다.

Inverval 설정에는 두 가지 방법(#1, #2)이 있습니다.

 

다음은 예시 코드이며 전체 코드와 관련이 없습니다.

def run():
    print('run')

timer = QTimer()
timer.timeout.connect(run)

# 1
#timer.setInverval(1000)
#timer.start()
# 2
timer.start(1000)

#timer.stop()

 

QTimer 객체가 실행중인지 확인할 때는 isActive() 를 사용합니다.

 

다음은 예시 코드이며 전체 코드와 관련이 없습니다.

if timer.isActivate():
	print('running...')
else:
	print('stopped.')

 

QTimer 객체의 Interval 확인 및 설정 interval() / setInterval()

 

 

다음은 예시 코드이며 전체 코드와 관련이 없습니다.

# timer = QTimer()
# timer.setInterval(1000)

old_interval = timer.interval()
new_interval = 2000
timer.setInterval(new_interval)
timer.start()

 

QTimer 객체의 남은 시간 확인 , remainingTime()

주의할 점은, 객체가 동작중일 상태일 때만 정상 값을 반환합니다. (중지되었을 경우, -1 반환)

 

 

전체 코드에서 일부를 가져왔습니다.

다음은 두 개의 QTimer 객체를 두어, 상태를 확인하고 남은 시간을 출력하는데 사용했습니다.

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi(os.path.join(PATH, 'ex.ui'), self)
        self.setWindowTitle('QTimer 예제')

        self.timer = QTimer()
        self.t = QTimer()
        self.t.start()
        self.timer.timeout.connect(self.count)
        self.reset()
        self.t.timeout.connect(self.show_remaind)
        
...........

    def show_remaind(self):
        if self.timer.isActive():
            self.rt = self.timer.remainingTime()
            self.remaind_le.setText('ms: '+ str(self.rt))

 

일회용 타이머 singleShot(msec, function)

전체 코드에서 일부를 가져왔습니다.

SingShot 버튼(그림)을 클릭하면 다음 singleshot() 함수가 호출됩니다. 

self.ss_btn.clicked.connect(self.singleshot)

....

def singleshot(self):
    def msg_box():
        QMessageBox.information(self, self.windowTitle(), self.ss_le_2.text())
        self.ss_le.setText('')
        self.ss_le_2.setText('')
    self.timer.singleShot(int(self.ss_le.text())*1000, msg_box)

 

주요 특징

  • QTimer 객체를 중지하고 다시 시작 경우, 남은 시간은 초기화된다. (stop()->start())

  • QTimer 객체가 중지된 경우 remaingTime()은 -1을 리턴한다.

  • QTimer 객체가 동작중일 때 setInverval을 설정하면, 객체는 새로운 inverval 로 다시 시작한다.

 

문의

프로그램 실행을 위한 .py .ui 파일이 필요하신 분은 댓글에 메일을 남겨주시면 보내드리겠습니다.