0

I have a big problem. I can't change sub-process's result data to GUI of main process. and I want to run function anytime. I make program simply. it has only main process job.(not use thread, process). please give a hint. thank you. (ps. i'm sorry, I can't write English well)

form.py

from PyQt4 import QtCore, QtGui

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(956, 464)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayoutWidget = QtGui.QWidget(self.centralwidget)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(230, 30, 716, 361))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtGui.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.textEdit_2 = QtGui.QTextEdit(self.horizontalLayoutWidget)
        self.textEdit_2.setObjectName("textEdit_2")
        self.horizontalLayout.addWidget(self.textEdit_2)
        self.textEdit_3 = QtGui.QTextEdit(self.horizontalLayoutWidget)
        self.textEdit_3.setObjectName("textEdit_3")
        self.horizontalLayout.addWidget(self.textEdit_3)
        self.textEdit_4 = QtGui.QTextEdit(self.horizontalLayoutWidget)
        self.textEdit_4.setObjectName("textEdit_4")
        self.horizontalLayout.addWidget(self.textEdit_4)
        self.textEdit_5 = QtGui.QTextEdit(self.horizontalLayoutWidget)
        self.textEdit_5.setObjectName("textEdit_5")
        self.horizontalLayout.addWidget(self.textEdit_5)
        self.textEdit_6 = QtGui.QTextEdit(self.horizontalLayoutWidget)
        self.textEdit_6.setObjectName("textEdit_6")
        self.horizontalLayout.addWidget(self.textEdit_6)
        self.textEdit_7 = QtGui.QTextEdit(self.horizontalLayoutWidget)
        self.textEdit_7.setObjectName("textEdit_7")
        self.horizontalLayout.addWidget(self.textEdit_7)
        self.textEdit_8 = QtGui.QTextEdit(self.horizontalLayoutWidget)
        self.textEdit_8.setObjectName("textEdit_8")
        self.horizontalLayout.addWidget(self.textEdit_8)
        self.textEdit_9 = QtGui.QTextEdit(self.horizontalLayoutWidget)
        self.textEdit_9.setObjectName("textEdit_9")
        self.horizontalLayout.addWidget(self.textEdit_9)
        self.table = QtGui.QTableWidget(self.centralwidget)
        self.table.setGeometry(QtCore.QRect(10, 30, 211, 361))
        self.table.setObjectName("table")
        self.table.setColumnCount(2)
        self.table.setRowCount(0)
        item = QtGui.QTableWidgetItem()
        self.table.setHorizontalHeaderItem(0, item)
        item = QtGui.QTableWidgetItem()
        self.table.setHorizontalHeaderItem(1, item)
        self.button = QtGui.QPushButton(self.centralwidget)
        self.button.setGeometry(QtCore.QRect(130, 400, 85, 27))
        self.button.setObjectName("button")
        self.button_2 = QtGui.QPushButton(self.centralwidget)
        self.button_2.setGeometry(QtCore.QRect(290, 410, 85, 27))
        self.button_2.setObjectName("button_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QObject.connect(self.button_2, QtCore.SIGNAL("clicked()"), MainWindow.close)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.table.horizontalHeaderItem(0).setText(QtGui.QApplication.translate("MainWindow", "no", None, QtGui.QApplication.UnicodeUTF8))
        self.table.horizontalHeaderItem(1).setText(QtGui.QApplication.translate("MainWindow", "status", None, QtGui.QApplication.UnicodeUTF8))
        self.button.setText(QtGui.QApplication.translate("MainWindow", "Run", None, QtGui.QApplication.UnicodeUTF8))
        self.button_2.setText(QtGui.QApplication.translate("MainWindow", "1", None, QtGui.QApplication.UnicodeUTF8))

main.py

from form import *
import time

class mainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self,parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.table.verticalHeader().setVisible(False)
        for i in range(2,10):
            item = QtGui.QTableWidgetItem(str(i))
            item2 = QtGui.QTableWidgetItem("Ready")
            item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
            item.setCheckState(QtCore.Qt.Unchecked)
            self.ui.table.setRowCount(i-1)
            self.ui.table.setItem(i-2, 0, item)
            self.ui.table.setItem(i-2, 1, item2)
        #:for
        QtCore.QObject.connect(self.ui.button , QtCore.SIGNAL("clicked()"), self.callback_runButton)
    #:def   

    def callback_runButton(self):
        numList = []
        for i in range(0,self.ui.table.rowCount()):
            if self.ui.table.item(i,0).checkState() == 2 and str(self.ui.table.item(i,1).text()) == 'Ready':
                print self.ui.table.item(i,0).text()
                self.ui.table.item(i,1).setText('Run')          
                numList.append(i)
            #if
        #:for

        #### Question 1:        
        #1. I want to no blocking GUI under runnig "self.run_MultiplicationTable(numList)"
        #2. although called "self.run_MultiplicationTable(numList)", I Want to run function again.
        #3. I try to thread function. but #2 is not permit. (GUI is not blocking, but function is not excuted.)
        #4. I try to process(run fuction under child process), but I can't modify GUI(parent process).

        self.run_MultiplicationTable(numList)
    #:def       

    def run_MultiplicationTable(self, numList):
        print "Run_MultiplicationTable"
        for i in numList:
            #### Question 2: similar Question 1
            #1. I want to run function at same time. 
            self.each_Cal(i)
        #:for
    #def
    def each_Cal(self, num):
        i = self.ui.table.item(num,0).text()
        putTextEdit = eval('self.ui.textEdit_'+ str(i))
        for j in range(1,10):
            printString =  str(i)+' * '+str(j)+'='+str(int(i)*j)    
            putTextEdit.append(printString)
            time.sleep(1) #It is job excuted time 
        #:for
        self.ui.table.item(num,1).setText('Done')

    #def
#:class

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWin = mainWindow()
    MainWin.show()
    sys.exit(app.exec_())
piraji
  • 1
  • I believe you _can't_ change the GUI from a subprocess. However you can monitor the subprocess and when it is completed you can update the GUI directly. If you don't want the GUI to block, then you can launch and monitor the subprocess from a separate thread instead of the GUI thread. You can use queues to exchange data with the subprocess, and this data exchange could act as a sort of signal from the subprocess to trigger a GUI change (via a listening function in the subprocess' parent thread). – 101 Sep 20 '15 at 12:30
  • Thank you. I will try to your guide. – piraji Sep 23 '15 at 16:14

0 Answers0