Python: доступ к переменной метода класса из другого файла - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть код GUI PyQt5, и у него есть класс Ui_MainWindow, а у этого класса есть метод setupUI. Вот мой gui.py:

import io
import sys
import os
import core as c
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1022, 637)
        MainWindow.setMinimumSize(QtCore.QSize(1022, 637))
        MainWindow.setMaximumSize(QtCore.QSize(1022, 637))
        font = QtGui.QFont()
        font.setKerning(False)
        MainWindow.setFont(font)
        MainWindow.setMouseTracking(True)
        MainWindow.setFocusPolicy(QtCore.Qt.NoFocus)
        .
        .
        .
        self.lineEditSiteX = QtWidgets.QLineEdit(self.centralwidget)

        self.actionCalculate.triggered.connect(c.cal) # Here is where I'm stuck!!!!!!!!!!!!!!!!!!!!


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication.instance()
    if app is None:
        app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

В комментарии выше я пытаюсь вызвать функцию из другого файла с именем core.py следующим образом:

import gui

def cal():
    val = gui.Ui_MainWindow().lineEditSiteX.value()
    return val ** (1/val*2)

Я простоЕсли кто-то нажмет на Calculte, значение lineEdit будет доступно через файл core.py. Но это дает мне attributeError. Как я могу это сделать?

1 Ответ

2 голосов
/ 02 ноября 2019

У вас есть 2 ошибки:

  • Бизнес-логика не должна зависеть от графического интерфейса, но графический интерфейс должен использовать только бизнес-логику.
  • PyQt рекомендует создать класс, который наследуется от соответствующегоwidget и используя класс, сгенерированный Qt Designer (для получения дополнительной информации читайте здесь ).

Учитывая вышеизложенное, решение:

core.py

def cal(val):
    return val ** (1/val*2)

gui.py

import io
import sys
import os
import core as c
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        # ... 
        self.lineEditSiteX = QtWidgets.QLineEdit(self.centralwidget)


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

    @QtCore.pyqtSlot()
    def on_actionCalculate(self):
        try:
            val = float(self.lineEditSiteX.text())
        except ValueError:
            print("error")
        finally:
            res = c.cal(val)
            print(res)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication.instance()
    if app is None:
        app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...