如何在Python中并行运行两个GUI?

时间:2018-06-24 17:31:07

标签: python python-2.7 parallel-processing pyqt pyqt4

我们正在谈论python 2.7和PyQt4。

我正在使用一个名为PyCorder的用于eeg分析的开源程序,该程序从系统电极放大器接收数据并将其绘制在GUI中。对于这个问题,我们可以将其视为黑匣子。我用Qt设计器实现了一个简单的界面。我的目标是同时运行PyCorder和我的界面,使它们之间可以交换数据。

以下是启动界面的代码行:


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

我想这对于使用Qt Designer完成的任何接口都是很常见的。 接下来,是PyCorder的启动部分:


def main(args):

    print "Starting PyCorder, please wait ...\n"
    setpriority(priority=4)
    app = Qt.QApplication(args)
    try:
        win = None
        win = MainWindow()
        win.showMaximized()
        if ShowConfirmationDialog:
            accept = Qt.QMessageBox.warning(None, "PyCorder Disclaimer", ConfirmationText, 
                                            "Accept", "Cancel", "", 1)
            if accept == 0:
                win.usageConfirmed = True
                app.exec_()
            else:
                win.close()
        else:
            win.usageConfirmed = True
            app.exec_()
    except Exception as e:
        tb = GetExceptionTraceBack()[0]
        Qt.QMessageBox.critical(None, "PyCorder", tb + " -> " + str(e))
        if win != None:
            win.close()

    # show the battery disconnection reminder
    if ShowBatteryReminder and win and win.usageConfirmed:
        DlgBatteryInfo().exec_()

    print "PyCorder terminated\n"


if __name__ == '__main__':
    main(sys.argv)

仅知道相应代码的这两部分即可回答我的问题吗?有没有工具箱可以帮助我实现目标?

2 个答案:

答案 0 :(得分:0)

我想到的最好的主意是使用多重处理库,以便多次运行QT。 multiprocessing 是您可以使用的库之一。

答案 1 :(得分:0)

有多种方法可以执行此操作,但是我更喜欢使用中央“窗口管理器”充当两个窗口的所有者和内部通信中心。下面是该技术的样本,需要对其进行调整。请注意,我使用Qt5。我在Qt5上进行了测试,然后尝试不进行测试就转换为Qt4。没错,但是可能需要花些时间。

from PyQt4 import QtCore, QtGui

class WindowManager(QtCore.QObject):
    """ 
    Inheriting from QObject has benefits.
    For instance, the WindowManager can not have pyQtSignal members, if needed
    """
    def __init__(self):
        super(WindowManager, self).__init__()
        self.firstWindow = FirstWindow(self)
        self.secondWindow = SecondWindow(self)
        self.firstWindow.show()
        self.secondWindow.show()

class FirstWindow(QtGui.QMainWindow):
    def __init__(self, manager):
        super(FirstWindow, self).__init__()
        self.manager = manager
        self.mainWidget = QtGui.QWidget()
        self.setCentralWidget(self.mainWidget)
        self.mainLayout = QtGui.QVBoxLayout(self.mainWidget)
        self.clickyButton = QtGui.QPushButton("Click me")
        self.mainLayout.addWidget(self.clickyButton)
        self.clickyButton.clicked.connect(self.clickyButtonClicked)
    def clickyButtonClicked(self, checked=None):
        self.manager.secondWindow.setMessage("Clicky button clicked")

class SecondWindow(QtGui.QMainWindow):
    def __init__(self, manager):
        super(SecondWindow, self).__init__()
        self.manager = manager
        self.mainWidget = QtGui.QWidget()
        self.setCentralWidget(self.mainWidget)
        self.mainLayout = QtGui.QVBoxLayout(self.mainWidget)
        self.messageBox = QtGui.QLabel()
        self.mainLayout.addWidget(self.messageBox)
    def setMessage(self, message):
        self.messageBox.setText(message)

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    manager = WindowManager()
    sys.exit(app.exec_())