отделить функции от графического интерфейса в процессе. отстающий - PullRequest
1 голос
/ 25 апреля 2019

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

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(921, 988)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.sheet2 = QtWidgets.QLabel(self.centralwidget)
        self.sheet2.setObjectName("sheet2")
        self.verticalLayout.addWidget(self.sheet2)
        self.sheet1 = QtWidgets.QLabel(self.centralwidget)
        self.sheet1.setObjectName("sheet1")
        self.verticalLayout.addWidget(self.sheet1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 921, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        # self.label_2.setText(_translate("MainWindow", "TextLabel"))
        # self.label.setText(_translate("MainWindow", "TextLabel"))

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

    def update_sheet2(self, Image):
        qim = ImageQt(Image)
        pix = QtGui.QPixmap.fromImage(qim)
        pix = pix.scaled(self.sheet2.width(), self.sheet2.height(), QtCore.Qt.KeepAspectRatio)
        self.sheet2.setPixmap(pix)
        self.sheet2.setAlignment(QtCore.Qt.AlignCenter)

    def update_sheet1(self, Image):
        qim = ImageQt(Image)
        pix = QtGui.QPixmap.fromImage(qim)
        pix = pix.scaled(self.sheet1.width(), self.sheet1.height(), QtCore.Qt.KeepAspectRatio)
        self.sheet1.setPixmap(pix)
        self.sheet1.setAlignment(QtCore.Qt.AlignCenter)


def run_ui():
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    w.background = main(w)
    t = Process(target=w.background.process)
    t.start()
    sys.exit(app.exec_())

в функции с именем main(ui) в этом коде коды, в которых используется пользовательский интерфейс, выглядят следующим образом.и я использовал функцию run_ui() для запуска кода

def main(ui):
    for i in range(100000000):
        x=1
        y = x*x*x
    img = Image.open('XXX.png'.format(GRAY_PATH,1))
    ui.update_sheet1(img)


if __name__ == '__main__':
    run_ui()

, и я передал пользовательский интерфейс 'w' в качестве аргумента главной функции, где он использует эту ссылку для вызова функций update_sheet1,2с данными изображения.

это отстает от GUI и всегда не отвечает, и изображения также не появляются в GUI.

Я думаю, это как-то связано с тем, как мне понравился интерфейс.но не знаю, как это исправить.

спасибо за любую помощь.

1 Ответ

0 голосов
/ 25 апреля 2019

Qt не поддерживает многопроцессорность, поэтому для устранения сложности используйте многопоточность. В этом случае Qt также указывает, что графический интерфейс пользователя не должен изменяться из другого потока, вместо того, чтобы я создал QObject и экспортировал его в другой поток, у этого QObject есть сигнал, который транспортирует изображение.

С другой стороны, когда вы выполняете main (w), вы вызываете тяжелую задачу в основном процессе, которая вызывает зависание GUI, вместо этого вы должны передать имя функции и аргументы этой функции через из args:

from PyQt5 import QtCore, QtGui, QtWidgets
from PIL import Image
from PIL.ImageQt import ImageQt
from threading import Thread

# ...

class Signaller(QtCore.QObject):
    imageSignal = QtCore.pyqtSignal(Image.Image)


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

    def update_sheet2(self, Image):
        # ...

    @QtCore.pyqtSlot(Image.Image)
    def update_sheet1(self, Image):
        qim = ImageQt(Image)
        pix = QtGui.QPixmap.fromImage(qim)
        pix = pix.scaled(self.sheet1.width(), self.sheet1.height(), QtCore.Qt.KeepAspectRatio)
        self.sheet1.setPixmap(pix)
        self.sheet1.setAlignment(QtCore.Qt.AlignCenter)


def run_ui():
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    signaller = Signaller()
    signaller.imageSignal.connect(w.update_sheet1)
    t = Thread(target=main, args=(signaller,), daemon=True)
    t.start()
    sys.exit(app.exec_())


def main(signaller):
    for i in range(100000000):
        x=1
        y = x*x*x
    img = Image.open('XXX.png')
    signaller.imageSignal.emit(img)


if __name__ == '__main__':
    run_ui()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...