Сгенерированный PyInstaller исполняемый файл приложения PyQT5 показывает "QCoreApplication :: exe c: событие l oop уже запущено" - PullRequest
2 голосов
/ 21 июня 2020

Я создал приложение на основе PyQt5, которое загружает все 3D-объекты (файлы * .stl) из входного каталога в QListWidget. Пользователь может выбрать элементы из этого списка и переместить его в другой виджет QListWidget, в котором он хочет выполнить какую-либо операцию (фильтрацию).

Я использовал средство визуализации vtk для отображения выбранного объекта. Я также предоставил виджет для ввода файла фильтра (*.mlx), созданного из meshlab. На основе всех этих входных данных, когда пользователь нажимает кнопку «Применить фильтр», мой код применяет фильтр meshlab к выбранным объектам и отображает объект после операции фильтрации в отдельном QListWidget.

Пользовательский интерфейс выглядит примерно так вот так:

enter image description here

The application works as intended when I run it from spyder or from command prompt. Next, I generated an application using PyInstaller. When I open the application, it opens without any issue and I am able to load the objects, add the objects to QListWidget and all other operations. But when I click on "Apply Filter" button, the application stops and gives the following error "QCoreApplication::exec: The event loop is already running".

I am not sure what can be the issue for this as the app is working correctly in the IDE. Following is the code (Sorry code is not clean)

import sys
import os
import vtk
from PyQt5 import Qt, QtCore, QtWidgets
from PyQt5.QtWidgets import QPushButton, QLabel, QLineEdit, QListWidget
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from PyQt5.QtCore import pyqtSlot
import meshlabxml as mlx
from pathlib import Path

class MainWindow(Qt.QMainWindow):
    def __init__(self, parent = None):
        Qt.QMainWindow.__init__(self, parent)
        cwd = os.getcwd()
        self.file_list = []
        self.selected_list = []
        self.source_dir = os.path.join(cwd, 'inputs')
        self.out_dir = os.path.join(cwd, 'outputs')
        self.meshlab_dir = Path(r"C:\Program Files\VCG\MeshLab")
        self.filter_dir = os.path.join(cwd, 'filter.mlx')
        self.cur_filename = os.path.join(cwd, 'sample.stl')
        self.initUI()
        
        
    def initUI(self):
        self.frame = Qt.QFrame()
        self.setWindowState(QtCore.Qt.WindowMaximized)
        self.setWindowTitle("Mesh Processor")
        
        lbl_inpdir = QLabel('STL input directory')
        self.edt_inpdir = QLineEdit()
        btn_load = QPushButton('Load')
        self.lbl_load = QLabel('')
        btn_add = QPushButton('>>')
        btn_remove = QPushButton('

***UPDATE: Filter file and sample inputs can be downloaded from http://www.filedropper.com/inputs ***

*** ОБНОВЛЕНИЕ: Я смог решить это, используя эти:

  1. Используется подпроцесс для выполнения фильтра meshlab вместо использования библиотеки meshlab xml.
  2. Используется cx freeze для генерации исполняемого файла ***
...