PyQt4如何通过单击pushButton来使用多处理

时间:2016-11-27 04:12:25

标签: python function class pyqt pyqt4

我一直在尝试使用多进程运行命令,因为使用while循环时GUI会冻结。我需要调用pyqt4类中的函数。或者更好的方法来处理多进程Qthread会帮助我吗?我已经搜索了很多教程,但我无法弄清楚如何做到这一点。

我试过这样,效果很好。问题是我无法将QeditText的输入传递给函数,如果有一种方法,那么它可以用于我想要做的事情。

import sys
import multiprocessing
import time
from PyQt4 import QtCore, QtGui
from form import Ui_Dialog


def worker():
    t = MyDialog()
    name = multiprocessing.current_process().name
    print name, 'Starting',  t.self.ui.rtmpIN.toPlainText()
    time.sleep(2)
    print name, 'Exiting'

class MyDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.ui.startButton.clicked.connect(self.start)
        self.ui.stopButton.clicked.connect(self.stop)
        self.ui.comboBox.addItem("player 1")
        self.ui.comboBox.addItem("player 2")
        self.ui.comboBox.addItem("player 3")
        #self.ui.comboBox.currentIndexChanged.connect(self.selectionchange)

    def selectionchange(self,i):
        print self.ui.comboBox.currentText()

    def start(self):
        worker_2 = multiprocessing.Process(target=worker)  # use default name
        worker_2.start()
        print "in:  ", self.ui.rtmpIN.toPlainText()
        print "out: ", self.ui.outPUT.toPlainText()
        print str(self.ui.comboBox.currentText())

        if self.ui.quialityBox.isChecked():
            q = "Streaming started" + "\n" + "quality: " + self.ui.Setquality.toPlainText() + "\n" + "player: " + str(self.ui.comboBox.currentText())
            self.ui.theLog.append(q)
            #print self.ui.Setquality.toPlainText()
        else:
            p = "Streaming" + "\n" + "player: " + str(self.ui.comboBox.currentText()) + "\n"
            self.ui.theLog.append(p)

    def stop(self):
        print 'stop pressed.'
        self.close()




if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        myapp = MyDialog()
        myapp.show()
        sys.exit(app.exec_())

我需要能够从worker函数中获取数据吗?有没有办法?

print "in:  ", self.ui.rtmpIN.toPlainText()
print "out: ", self.ui.outPUT.toPlainText()

编辑:忘记了form.py就在这里 http://pastebin.com/HksuSjkt

2 个答案:

答案 0 :(得分:1)

这是我的解决方案:

from PyQt4.QtCore import QThread

class Worker(QThread):
    def __init__(self, parent=None):
        super(Worker, self).__init__(parent)
        self.textin = ""
        self.textout = ""
        self.okay = True

    def setTextIn(self, text):
        self.textin = text

    def setTextOut(self, text):
        self.textout = text

    def run(self):
        while self.okay:
            print('IN:' + self.textin)
            print('OUT:' + self.textout)
            time.sleep(2)

    def stop(self):
        self.okay = False


class MyDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.worker = Worker(self)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.ui.rtmpIN.textChanged.connect(self.changeText)
        self.ui.outPUT.textChanged.connect(self.changeText)
        self.ui.startButton.clicked.connect(self.start)
        self.ui.stopButton.clicked.connect(self.stop)
        self.ui.comboBox.addItem("player 1")
        self.ui.comboBox.addItem("player 2")
        self.ui.comboBox.addItem("player 3")

    def selectionchange(self,i):
        print(self.ui.comboBox.currentText())

    def start(self):
        self.worker.start()
        print("in:  "+self.ui.rtmpIN.toPlainText())
        print("out: "+self.ui.outPUT.toPlainText())
        print(self.ui.comboBox.currentText())

        if self.ui.quialityBox.isChecked():
            q = "Streaming started" + "\n" + "quality: " + self.ui.Setquality.toPlainText() + "\n" + "player: " + str(self.ui.comboBox.currentText())
            self.ui.theLog.append(q)
        else:
            p = "Streaming" + "\n" + "player: " + str(self.ui.comboBox.currentText()) + "\n"
            self.ui.theLog.append(p)

    def changeText(self):
        self.worker.setTextIn(self.ui.rtmpIN.toPlainText())
        self.worker.setTextOut(self.ui.outPUT.toPlainText())

    def stop(self):
        self.worker.stop()
        self.worker.quit()
        self.worker.wait()
        print('stop pressed.')
        self.close()

    def closeEvent(self, event):
        self.worker.stop()
        self.worker.quit()
        self.worker.wait()
        QtGui.QDialog.closeEvent(self, event)


if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        myapp = MyDialog()
        myapp.show()
        sys.exit(app.exec_())

输出:

enter image description here

答案 1 :(得分:0)

我不是PyQt的专家,但我假设你在你提到的form.py eyllanesc中保留了一个条目小部件,我可以看到你导入了。

使用特殊变量来包含来自UI的字符串的原因之一是它所驻留的类占用了指定的内存空间(当涉及到范围等时很好)。

对于multiPROCESSING,内存空间不再共享,您再也无法访问此变量。但是,如果您使用multiTHREADING,它是一个新线程,但在同一个进程中,这意味着它可以访问您想要的Qt字符串。

语法就是为了这个目的而相同的

import threading

def foo(): pass

t = threading.Thread(target=foo,
                     args=[])

t.daemon = True

t.start()

详细了解帖子here