PyQt모듈을 사용하여 GUI모델을 구현하면서 time 모듈의 time.sleep() 메서드가 GUI환경에서 작은(?)문제를 일으킨다는 것을 발견했다.
sleep()메서드가 실행되는 동안 다른 어떠한 버튼도 조작할 수 없고 강제로 하려고 하면 프로그램이 응답없음과 함께 튕겨버리는 문제까지 발생했다.
단순히 1, 2초 대기시간을 주고 다시 메서드를 돌리려는데 뭐가 문제인가?
time.sleep를 사용하면 GUI쓰레드를 멈추게하기 때문이다.
검색하던 중에 PyQt용 QTimer가 따로 존재하는 것을 발견했다.
QTimer
QEventLoop() 선언
from PyQt5 import QtCore
def reset(self):
loop = QEventLoop()
QTimer.singleShot(10000, loop.quit) # msec
loop.exec_()
reset()
타이머가 필요한 곳에서 일반 함수처럼 사용을 해주면 된다.
물론 다른 함수들처럼 인수를 전달, 반환도 가능하다.
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(0, 0, 0)
timer.timeout.connect(timerEvent)
timer.start(100)
sys.exit(app.exec_())
실행결과
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를 사용하는 방법.
from PyQt4 import QtTest
QtTest.QTest.qWait(msecs)
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
Sponsored ( Powered by dclick )
마늘 닭똥집이 유명한 '양철지붕'
일과를 마치고 회사 동료들과 함께 방문한 양철지붕. 예전부터 마늘 닭똥집이 맛있다고 하여 벼르...