Python 如何从子流程更改GUI?我想随时运行函数
我有个大问题。我不能将子进程的结果数据更改为主进程的GUI。我想随时运行函数。我做程序很简单。它只有主进程作业(不使用线程、进程)。请给我一个提示。谢谢您。 (附:对不起,我的英语写得不好) form.pyPython 如何从子流程更改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")
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更改(通过子流程父线程中的侦听函数)。谢谢。我会尽力帮助你的向导。