Python 如何从子流程更改GUI?我想随时运行函数

Python 如何从子流程更改GUI?我想随时运行函数,python,user-interface,pyqt4,multiprocess,Python,User Interface,Pyqt4,Multiprocess,我有个大问题。我不能将子进程的结果数据更改为主进程的GUI。我想随时运行函数。我做程序很简单。它只有主进程作业(不使用线程、进程)。请给我一个提示。谢谢您。 (附:对不起,我的英语写得不好) form.py from PyQt4 import QtCore, QtGui class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow")

我有个大问题。我不能将子进程的结果数据更改为主进程的GUI。我想随时运行函数。我做程序很简单。它只有主进程作业(不使用线程、进程)。请给我一个提示。谢谢您。 (附:对不起,我的英语写得不好)

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_())

我相信您不能从子流程更改GUI。但是,您可以监视子流程,完成后可以直接更新GUI。如果不希望GUI阻塞,则可以从单独的线程而不是GUI线程启动和监视子流程。您可以使用队列与子流程交换数据,此数据交换可以作为子流程的一种信号来触发GUI更改(通过子流程父线程中的侦听函数)。谢谢。我会尽力帮助你的向导。