Почему после вызова функции из импортированного файла Python в файле приложение PyQt перестает отвечать? - PullRequest
0 голосов
/ 11 ноября 2019

Я создал графический интерфейс PyQt5 в моем основном .py файле, который находится в основной папке приложения. В файле для интерфейса кнопка инициирует новый класс Calculation (в файле entry.py), передавая значения нескольких входных данных на странице, и в этом классе вызывается метод startCalculation (). В этом методе различные переменные передаются методам в импортированных файлах Python, затем результат этих вычислений возвращается и передается следующему вычислению в другом файле Python. Эти возвраты представлены в виде массивов, содержащих значения (для оси y, которая затем отображается с использованием numpy и plotly).

Когда я запускаю приложение и нажимаю кнопку в главном интерфейсе, приложение начинает загрузку (радужная анимация на Mac) и говорит, что оно не отвечает. Это не проблема с самим классом, так как обычный тест печати работает в методе startCalculation (), но функция из импортированного файла вызывает это. Кроме того, в терминале не выдаются ошибки.

Ниже приведен код в файле интерфейса PyQt ( main .py)

from app import entry

    def startButton(self):
        massaTotale = float(self.lineEdit.text())
        dragCoefficient = float(self.lineEdit_5.text())
        liftCoefficient = float(self.lineEdit_6.text())
        powerAvionics = float(self.lineEdit_3.text())
        powerPayload = float(self.lineEdit_4.text())
        airSpeed = float(self.lineEdit_8.text())
        valoreUnico = float(self.valoreUnicoEdit.text())
        engineEfficiency = float(self.lineEdit_9.text())
        turbolenceCoeff = float(self.lineEdit_10.text())
        dayOfYear = float(self.day_LineEdit.text())
        latitude = float(self.latitude_LineEdit.text())
        sunsetHourAngle = float(self.sunsetHourAngle_LineEdit.text())
        declination = float(self.declination_LineEdit.text())
        newCaluclation = entry.Calculation(massaTotale, dragCoefficient, liftCoefficient, powerAvionics, powerPayload, airSpeed, valoreUnico, engineEfficiency, turbolenceCoeff, dayOfYear, latitude, sunsetHourAngle, declination)
        newCaluclation.startCalculation()

И это кодв классе, вызывающем функцию во внешнем файле

from app.mainFunctions import pLevel

    #constructor method
    def __init__(self, massaTotale, dragCoefficient, liftCoefficient, powerAvionics, powerPayload, airSpeed, valoreUnico, efficiencyEngine, turbolenceCoeff, dayOfYear, latitude, sunsetHourAngle, declination):
        # calculate plevel
        self.totM = massaTotale
        self.vair = airSpeed
        self.cl = liftCoefficient
        self.cd = dragCoefficient
        self.efficiencyEngine = efficiencyEngine
        self.valoreUnico = valoreUnico
        self.powerAvionics = powerAvionics
        self.powerPayload = powerPayload
        self.turbolenceCoeff = turbolenceCoeff
        self.day_of_year = dayOfYear
        self.latitude = latitude
        self.sunset_hour_angle = sunsetHourAngle
        self.declination = declination

    #starting the calculation
    def startCalculation(self):

        self.x_values, self.pLevel_values = pLevel.calculate_pLevel(self.valoreUnico, self.cd, self.cl, self.totM)

        '''
        self.pEngine_values = pEngine.calculate_pEngine(self.x_values, self.pLevel_values, self.efficiencyEngine, self.turbolenceCoeff)
        self.pOut_values = pOut.calculate_pOut(self.x_values, self.pEngine_values, self.powerAvionics, self.powerPayload)
        self.I_loctime = I_loctime.calculate_I_loctime(self.day_of_year, self.latitude, self.sunset_hour_angle, self.declination)
        self.asm_values = area_Solar_Module.calculate_asm(self.x_values, self.pOut_values, self.I_loctime)
        '''

Файл pLevel.py содержит следующий код и должен возвращать массив значений для передачи второй функции в записи файла класса вычисления.

import math
import numpy as np

import plotly as py
import plotly.graph_objs as go
import ipywidgets as widgets
import plotly.io as pio

import sys
sys.dont_write_bytecode = True

py.offline.init_notebook_mode(connected=True)
pio.renderers.default = "browser"

# calculating pLevel
x_values = []
y_values = []

layoutPLevel = go.Layout(
    title="pLevel",
    yaxis=dict(
        title='pLevel'
    ),
    xaxis=dict(
        title='Surface Area Wing'
    )
)

def calculate_pLevel(valoreUnico, cd, cl, totM):
    x_values = []
    count = 0
    while (count < 5):
        x_values.append(count)
        count = count + 0.01

    y_values = []
    iteration = 0
    while (iteration < len(x_values)):
        x_value = x_values[iteration]
        if (x_value == 0):
            y_value = 0
            y_values.append(y_value)
        else:
            if (valoreUnico == 0.0):
                # nessun dato per valoreUnico dato, utilizza i due valori separati
                y_value = firstPart(cd, cl) * math.sqrt(secondPart(x_value, totM))
                y_values.append(y_value)
            else:
                y_value = valoreUnico * \
                math.sqrt(secondPart(x_value, totM))
                y_values.append(y_value)

            iteration = iteration + 1
    else:
        yNpArray = np.array(y_values)
        xNpArray = np.array(x_values)
        tracePLevel = go.Scatter(
            x=xNpArray,
            y=yNpArray,
            mode='lines',
            name='pLevel',
            line=dict(
                shape='spline'
            )
        )
        figPLevel = go.Figure(data=[tracePLevel], layout=layoutPLevel)
        figPLevel.show()
        return x_values, y_values


def firstPart(cd, cl):
    return (cd / cl**(3/2))


def secondPart(x_value, totM):
    return (2*(totM * 9.81)**3) / (1.225 * x_value)

Структура файлов следующая:

-app
   -- __main__.py
   -- entry.py
   -- __init__.py
   -- mainFunctions
      --- pLevel.py
      --- __init__.py
...