Как запустить два графических интерфейса в Python параллельно? - PullRequest
0 голосов
/ 24 июня 2018

Мы говорим о Python 2.7 и PyQt4.

Я работаю с программой с открытым исходным кодом для анализа EEG под названием PyCorder, которая получает данные от системного электродов-усилителей и выводит их в графическом интерфейсе.;мы можем рассматривать его как черный ящик для целей этого вопроса.Я реализовал простой интерфейс с Qt designer.Моя цель - запустить 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 голосов
/ 25 июня 2018

Есть несколько способов сделать это, но я предпочитаю использовать центральный «оконный менеджер», чтобы действовать как владелец и центр межсетевого взаимодействия двух окон. Ниже приведен пример этого метода, который необходимо адаптировать к вашим потребностям. Обратите внимание, что я использую 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_())
0 голосов
/ 24 июня 2018

Лучшая идея, на мой взгляд, состоит в том, чтобы использовать несколько библиотек обработки для запуска QT несколько раз. многопроцессорная обработка - это одна из библиотек, которую вы можете использовать.

...