내 HMI는 시작 및 중지, 스레드에서 GUI로 정보를 인쇄하는 필드 QStatusBar로 구성됩니다. "시작"할 때 중지 단추로 중단 할 수있는 스레드를 시작합니다. 내가하고 싶은 일은 스레드가 일시 중지 된 동안 사용자에게 선택권을주기 위해 스레드의 특정 지점에서 팝업 창을 여는 것입니다.PyQt : GUI에서 스레드로 정보 전송
from PyQt4 import QtCore, QtGui
import sys
import os
import time
from PyQt4.QtGui import QApplication, QDialog, QListWidgetItem, QListWidget, QIcon
from test_bench_tool2 import Ui_MainWindow
from popup import Ui_popup
"""Class poppup window(continue/quit)"""
class MyPopup(QtGui.QDialog):
def __init__(self,type):
super(MyPopup, self).__init__()
self.res = 0
self.type=type
self.ui = Ui_popup()
self.ui.setupUi(self)
QtCore.QObject.connect(self.ui.Quit,QtCore.SIGNAL("clicked()"),self.showDialogstop)
QtCore.QObject.connect(self.ui.Continue,QtCore.SIGNAL("clicked()"),self.showDialogcontinue)
def showDialogcontinue(self):
self.res=1
self.close()
def showDialogstop(self):
self.res=0
self.close()
class MyThread(QtCore.QThread):
Statuschanged = QtCore.pyqtSignal(str)
popupmodechanged = QtCore.pyqtSignal(str)
def __init__(self, parent=None):
super(MyThread, self).__init__(parent=parent)
self.Status_auto = ''
self.dialog = MyPopup('toto')
self.Status_auto +=''
self.popup=''
self.answer=''
def run(self):
result = self.get_result()
def get_result(self,):
empty_result = []
self.popup='Vn'
self.popupmodechanged.emit((self.popup))
self.Status_auto +='\n\nMeasures finished!!'
self.Statuschanged.emit((self.Status_auto))
results=[]
#do things to calculate results
return(results)
class Main(QtGui.QDialog):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# Connect the Buttons
QtCore.QObject.connect(self.ui.Start,QtCore.SIGNAL("clicked()"),self.Start)
QtCore.QObject.connect(self.ui.Stop,QtCore.SIGNAL("clicked()"),self.Stop)
self.__thread = MyThread(self)
self.__thread.Statuschanged.connect(self.ui.report_auto.setText)
self.__thread.popupmodechanged.connect(self.open_popup)
def open_popup(self):
self.__thread.dialog.__init__(self.__thread.dialog.type)
self.__thread.dialog.exec_()
def Start(self):
global tableRx, tableTx
self.ui.report_auto.setText('test in process...')
self.__thread.start()
def Stop(self):
self.ui.report_auto.setText('test canceled')
if self.__thread.isRunning():
self.__thread.terminate()
def main():
app = QtGui.QApplication(sys.argv)
window = Main()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
스레드를 계속하려면 팝업의 결과를 어떻게 얻을 수 있습니까? 나는이 같은 get_result() 함수를 넣으려고했다.
if self.dialog.res == 1:
print "continue"
self.dialog.close()
#do things
else:
self.dialog.close()
그러나 나는 GUI에서 그 결과를 얻을 수 없다. GUI에서 내 스레드로 정보를 얻으려면 어떻게해야합니까 ?? 큐를 사용합니까?
은 별도의 QThread에서 GUI를 (당신이 할 때 경고가 표시됩니다) 작성해서는 안됩니다. 대신 QThread에서 계산을 수행하고 스레드가 완료 될 때까지 기다린 다음 주 GUI 스레드에서 팝업을 엽니 다. – sebastian
미안 해요,하지만 그게 내가하고 싶은게 아니에요, 팝업 스레드의 중간에 나타나야합니다,하지만 조언을 주셔서 감사합니다 –