如何将多处理与 Pyqt 一起使用



我在使用 pyqt 进行多处理时遇到问题,因为它会打开多个窗口并且并没有真正超出目标函数。我在Qt Designer中创建了我的界面,我的示例代码如下:

from multiprocessing import Pool
from PyQt5 import uic, QtWidgets
from PyQt5.QtWidgets import *
import sys
def updater(num):
    print(num)
def main_tracker():
    p = Pool(processes=4)
    data = p.map(updater, range(0, 100))
app=QtWidgets.QApplication(sys.argv)
window = uic.loadUi("tracker.ui")
window.pushButton.clicked.connect(main_tracker)
window.show()
sys.exit(app.exec_())

在运行它时,界面正常打开,但是当我单击 gui 上的按钮时,它只是打开多个 pyqt 窗口,并且没有按预期运行函数。我怎样才能让它工作,以便多处理工作而不打开多个窗口?我在这里看到了类似的问题,但我还没有找到一个可以解决我的问题的方法。

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>365</width>
    <height>134</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>69</x>
      <y>19</y>
      <width>173</width>
      <height>59</height>
     </rect>
    </property>
    <property name="text">
     <string>PushButton</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>365</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

我有两点意见。始终使用

if __name__ == "__main__":
   code here

主文件的构造。在您的情况下,它将是:

from multiprocessing import Pool
from PyQt5 import uic, QtWidgets
from PyQt5.QtWidgets import *
import sys
def updater(num):
    print(num)
def main_tracker():
    p = Pool(processes=4)
    data = p.map(updater, range(0, 100))
if __name__ == "__main__":
    app=QtWidgets.QApplication(sys.argv)
    window = uic.loadUi("tracker.ui")
    window.pushButton.clicked.connect(main_tracker)
    window.show()
    sys.exit(app.exec_())

如果您想在Windows上冻结应用程序(创建exec文件(,那么将此行添加到您的代码中(或者它可能会修复您的错误(

import multiprocessing
multiprocessing.freeze_support()

否则您将再次遇到多个窗口的问题

相关内容

  • 没有找到相关文章

最新更新