[PyQt] time.sleep() 구현하기

PyQt모듈을 사용하여 GUI모델을 구현하면서 time 모듈의 time.sleep() 메서드가 GUI환경에서 작은(?)문제를 일으킨다는 것을 발견했다.
sleep()메서드가 실행되는 동안 다른 어떠한 버튼도 조작할 수 없고 강제로 하려고 하면 프로그램이 응답없음과 함께 튕겨버리는 문제까지 발생했다.
단순히 1, 2초 대기시간을 주고 다시 메서드를 돌리려는데 뭐가 문제인가?
time.sleep를 사용하면 GUI쓰레드를 멈추게하기 때문이다.
검색하던 중에 PyQt용 QTimer가 따로 존재하는 것을 발견했다.


QTimer

QEventLoop() 선언

1
2
3
4
5
6
from PyQt5 import QtCore
def reset(self):
    loop = QEventLoop()
    QTimer.singleShot(10000loop.quit) # msec
    loop.exec_()
reset()
 

타이머가 필요한 곳에서 일반 함수처럼 사용을 해주면 된다.
물론 다른 함수들처럼 인수를 전달, 반환도 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import sys
 
from PyQt5 import QtCore
 
def timerEvent():
    global time
    time = time.addSecs(1)
    print(time.toString("hh:mm:ss"))
 
app = QtCore.QCoreApplication(sys.argv)
 
timer = QtCore.QTimer()
time = QtCore.QTime(000)
 
timer.timeout.connect(timerEvent)
 

실행결과

1
2
3
4
5
6
7
8
9
10
11
12
00:00:01
00:00:02
00:00:03
00:00:04
00:00:05
00:00:06
00:00:07
00:00:08
00:00:09
00:00:10
00:00:11
00:00:12

QtTest

QtTest를 사용하는 방법.

1
2
from PyQt4 import QtTest

QThread

물론 QThread를 쓰면 가장 확실한 방법이다. 백그라운드 인스턴스를 구성하고 메인쓰레드와 signal을 주고 받으면서 루프를 도는 것이 훨씬 더 gui적인 설계라고 할 수 있겠다.

[slot과 signal에 대한 간단한 설명]

https://blog.manash.me/quick-pyqt5-1-signal-and-slot-example-in-pyqt5-bf502ccaf11d


코드 출처:

How to create a timer in pyqt
PyQt5 QTimer count until specific seconds

 

반응형