Как передать значения из Pyqt5 GUI в несколько процессов - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть следующий код:

from PyQt5 import uic, QtWidgets
import os
import sys
import threading
from multiprocessing import Pool

def fetchdata(num):
    message = window.lineEdit()
    print(message)

def processchain():
    p=Pool(processes=15)
    data=p.map(fetchdata,range(1,1000))

def alltask():
    x = threading.Thread(target=processchain)
    x.start()

if __name__ == '__main__':

    y = os.getcwd()

    app=QtWidgets.QApplication(sys.argv)
    window = uic.loadUi(os.path.normpath(y)+ "\\" + "estate.ui")
    window.pushButton.clicked.connect(alltask)

    window.show()



    sys.exit(app.exec_())

Функция многопроцессорной обработки fetchdata имеет строку input = window.lineEdit.text(), которая выдает ошибку о том, что переменная окна не определена. Означает ли это, что я должен передать переменную окна потоку в функции alltask, а затем передать ее из потока в функцию processchain, которая затем передаст ее всем многопроцессорным процессам? Это похоже на боль, и я надеюсь, что есть более простой способ

Как я могу сделать объекты GUI доступными для каждого потока и процесса? Ниже приведен код для воспроизведения файла estate.ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>640</width>
    <height>186</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>370</x>
      <y>30</y>
      <width>151</width>
      <height>71</height>
     </rect>
    </property>
    <property name="text">
     <string>ENTER</string>
    </property>
   </widget>
   <widget class="QLineEdit" name="lineEdit">
    <property name="geometry">
     <rect>
      <x>120</x>
      <y>49</y>
      <width>191</width>
      <height>31</height>
     </rect>
    </property>
   </widget>
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>60</y>
      <width>47</width>
      <height>13</height>
     </rect>
    </property>
    <property name="text">
     <string>INPUT</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>640</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

1 Ответ

1 голос
/ 15 февраля 2020

К GUI нельзя обращаться из другого потока или другого процесса, нужно сделать, чтобы отправить текстовую информацию во время запуска потока и процессов:

from multiprocessing import Pool
import os
import sys
import threading

from PyQt5 import uic, QtWidgets


def fetchdata(value):
    num, message = value
    print(num, message)
    return True


def processchain(message):
    p = Pool(processes=15)
    data = p.map(fetchdata, [(i, message) for i in range(1, 1000)])
    print("results:", data)


def alltask(message):
    threading.Thread(target=processchain, args=(message,), daemon=True).start()


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    ui_filename = os.path.join(os.path.dirname(os.path.realpath(__file__)), "estate.ui")
    window = uic.loadUi(ui_filename)

    def on_clicked():
        message = window.lineEdit.text()
        alltask(message)

    window.pushButton.clicked.connect(on_clicked)
    window.show()

    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...