Tkinter
에 작성한 응용 프로그램을 PyQt
에 이식하려고합니다. 응용 프로그램에는 API를 통해 외부 정보를 쿼리하고이를 사용하여 응용 프로그램의 텍스트 레이블을 업데이트하는 여러 스레드가 있습니다. 사용자 상호 작용은 없습니다.메서드에서 여러 스레드를 시작하는 방법?
Tkinter
에서 나는 after()
방법을 사용하고있었습니다. PyQT
에서 내가 이해하는 한, QtCore.QThread()
을 사용해야합니다.
다음 예제 프로그램은 두 개의 레이블 (hour
및 minute
)을 업데이트해야합니다. UI는 Qt Designer에서 생성되며 기본적으로 위의 두 텍스트 레이블입니다. 앱 윈도우에서 시간이 업데이트되고 (GUI에서 변경되며 콘솔에 "update hour"
이 인쇄 됨) 나타납니다. 분은 그렇지 않습니다. 내 (실패한) 이해는 started.connect()
이 표시된 방법으로 스레드를 시작하는 것이 었습니다. 한 번만 작동하는 것처럼 보입니다.
UpdateTime
의 각 메소드에 대해 스레드가 시작되도록 코드를 변경해야합니까?
import sys
import time
from PyQt4 import QtGui, QtCore
from infoscren_ui import Ui_MainWindow
class Infoscreen(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi(self)
class UpdateTime(QtCore.QObject):
def __init__(self, root):
QtCore.QObject.__init__(self)
self.root = root
def UpdateHour(self):
hour = 0
while True:
hour += 1
print("update hour")
self.root.hour.setText(str(hour))
time.sleep(1)
def UpdateMinute(self):
minute = 0
while True:
minute += 2
print("update minute")
self.root.minute.setText(str(minute))
time.sleep(1)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
infoscreen = Infoscreen()
thread = QtCore.QThread()
obj = UpdateTime(infoscreen)
obj.moveToThread(thread)
thread.started.connect(obj.UpdateHour)
thread.started.connect(obj.UpdateMinute)
thread.finished.connect(app.exit)
thread.start()
infoscreen.show()
sys.exit(app.exec_())
고맙습니다. 내가 이해하지 못하는 한가지가 있습니다 : 객체의 메소드 (당신의 예제에서'updateHour')는'.moveToThread (thread)'를 통해 스레드로 어떻게 이동 되었습니까? 이 개체의 모든 메서드가 기본적으로 시작 되었습니까? 나는 당신의 코드도, Schollii의 것도 언급하지 않았다. – WoJ
@WoJ. 원래 예제처럼 스레드의 'started'신호를 사용하는 것이 가장 자연 스럽습니다. 아마도 그러한 방법을 슬롯으로 꾸미는 것이 현명 할 것입니다.하지만 그에 대한 대답은 업데이트되었습니다. – ekhumoro