Вывод атрибутов класса через геттер приводит к AttributeError

hurtZ

Новичок
Пользователь
Окт 13, 2021
10
0
1
Добрый день!
Использую PyQt5 для создания примитивного интерфейса.
Внутри класса главного окна указываю переменные, которым присваиваю значения, введённые пользователем в line edit. Ниже идёт метод, который возвращает эти атрибуты. При попытке вызова этого метода, выскакивает ошибка "у класса нет таких атрибутов".

Python:
from PyQt5 import QtWidgets, uic, QtCore, QtGui
import sys

# Main window
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(310, 350)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setMinimumSize(QtCore.QSize(310, 350))
        MainWindow.setMaximumSize(QtCore.QSize(310, 350))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        MainWindow.setFont(font)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.port_btn = QtWidgets.QPushButton(self.centralwidget)
        self.port_btn.setGeometry(QtCore.QRect(140, 310, 71, 21))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.port_btn.setFont(font)
        self.port_btn.setCheckable(False)
        self.port_btn.setObjectName("port_btn")
        self.port_btn.setStyleSheet('background: rgb(255,140,105);')
        self.port_btn.clicked.connect(self.port_btn_clicked)                    # Pushing PORT

        # Start line inputs
        self.line_1 = QtWidgets.QLineEdit(self.centralwidget)
        self.line_1.setGeometry(QtCore.QRect(170, 110, 91, 21))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.line_1.setFont(font)
        self.line_1.setObjectName("line_1")
        self.line_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.line_2.setGeometry(QtCore.QRect(170, 160, 91, 21))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.line_2.setFont(font)
        self.line_2.setObjectName("line_2")

        MainWindow.setCentralWidget(self.centralwidget)

        # Trying this shit
        self.li1 = self.line_1.text()
        self.li2 = self.line_2.text()


        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Windy?"))
        self.port_btn.setText(_translate("MainWindow", "Port"))

    def lines(self):
        return self.li1, self.li2

    def port_btn_clicked(self, MainWindow):
        print("btn prsd")
        self.close()

m = Ui_MainWindow()
lines = m.lines()
l1 = lines[0]
l2 = lines[1]



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

Traceback (most recent call last):
File "C:\Users\Add.3Off\Desktop\Проги\Projects\Testing0_o.py", line 72, in <module>
lines = m.lines()
File "C:\Users\Add.3Off\Desktop\Проги\Projects\Testing0_o.py", line 65, in lines
return self.li1, self.li2
AttributeError: 'Ui_MainWindow' object has no attribute 'li1'

Process finished with exit code 1
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 672
478
83
в классе Ui_<имя класса> обычно делают только gui, а все действия делают в другом классе, который унаследовался от Ui_<имя класса>, чтобы получать доступ к элементам gui
например так
Python:
from PyQt5 import QtWidgets, uic, QtCore, QtGui

# Main window
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(310, 350)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setMinimumSize(QtCore.QSize(310, 350))
        MainWindow.setMaximumSize(QtCore.QSize(310, 350))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        MainWindow.setFont(font)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.port_btn = QtWidgets.QPushButton(self.centralwidget)
        self.port_btn.setGeometry(QtCore.QRect(140, 310, 71, 21))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.port_btn.setFont(font)
        self.port_btn.setCheckable(False)
        self.port_btn.setObjectName("port_btn")
        self.port_btn.setStyleSheet('background: rgb(255,140,105);')
        # Start line inputs
        self.line_1 = QtWidgets.QLineEdit(self.centralwidget)
        self.line_1.setGeometry(QtCore.QRect(170, 110, 91, 21))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.line_1.setFont(font)
        self.line_1.setObjectName("line_1")
        self.line_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.line_2.setGeometry(QtCore.QRect(170, 160, 91, 21))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.line_2.setFont(font)
        self.line_2.setObjectName("line_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Windy?"))
        self.port_btn.setText(_translate("MainWindow", "Port"))


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.port_btn.clicked.connect(self.port_btn_clicked)                    # Pushing PORT
        self.li1 = self.line_1.text()
        self.li2 = self.line_2.text()

    def lines(self):
        return self.li1, self.li2

    def port_btn_clicked(self):
        print("btn prsd")
        self.close()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    lines = w.lines()
    l1 = lines[0]
    l2 = lines[1]
    print("l1: " + l1)
    print("l2: " + l2)
    w.show()
    sys.exit(app.exec_())

в принтах пусто, потому что в полях ввода ничего нет...
класс MainWindow унаследован от QtWidgets.QMainWindow, что указывает на тип окна, и унаследован от Ui_MainWindow, чтобы получить доступ к gui элементам, которые там есть...
 

hurtZ

Новичок
Пользователь
Окт 13, 2021
10
0
1
в классе Ui_<имя класса> обычно делают только gui, а все действия делают в другом классе, который унаследовался от Ui_<имя класса>, чтобы получать доступ к элементам gui

Спасибо! Это помогло и облегчило дальнейшую настройку нужных параметров.
 

Форум IT Специалистов