PyQT5 AttributeError при попытке вызвать функцию при нажатии кнопки

hurtZ

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

Версия питона - 3.9

Python:
from PyQt5 import QtWidgets, uic, QtCore, QtGui
import math
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.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(45, 20, 231, 61))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(25)
        self.label.setFont(font)
        self.label.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.label.setFrameShadow(QtWidgets.QFrame.Plain)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(20, 100, 111, 41))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.label_2.setFont(font)
        self.label_2.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setWordWrap(True)
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(20, 150, 111, 41))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.label_3.setFont(font)
        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3.setWordWrap(True)
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(20, 200, 111, 41))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.label_4.setFont(font)
        self.label_4.setAlignment(QtCore.Qt.AlignCenter)
        self.label_4.setWordWrap(True)
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(20, 250, 111, 41))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.label_5.setFont(font)
        self.label_5.setAlignment(QtCore.Qt.AlignCenter)
        self.label_5.setWordWrap(True)
        self.label_5.setObjectName("label_5")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setGeometry(QtCore.QRect(20, 300, 111, 41))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.label_6.setFont(font)
        self.label_6.setAlignment(QtCore.Qt.AlignCenter)
        self.label_6.setWordWrap(True)
        self.label_6.setObjectName("label_6")
        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);')
                                                                                # Beginning of variants
        self.port_btn.clicked.connect(self.port_btn_clicked)
        #self.port_btn.clicked(self.connect.port_btn_clicked)
        #self.port_btn(self.port_btn.clicked(port_btn_clicked()))
        #self.port_btn.clicked(self, port_btn_clicked())
                                                                                # End of variants
        self.stbd_btn = QtWidgets.QPushButton(self.centralwidget)
        self.stbd_btn.setGeometry(QtCore.QRect(220, 310, 80, 21))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.stbd_btn.setFont(font)
        self.stbd_btn.setObjectName("stbd_btn")
        self.stbd_btn.setStyleSheet('background: rgb(192,255,142);')
        #s_btn = QtWidgets.QPushButton("stbd_btn", self)
        self.stbd_btn.clicked.connect(self.buttonClicked)
        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")
        self.line_3 = QtWidgets.QLineEdit(self.centralwidget)
        self.line_3.setGeometry(QtCore.QRect(170, 210, 91, 21))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.line_3.setFont(font)
        self.line_3.setObjectName("line_3")
        self.line_4 = QtWidgets.QLineEdit(self.centralwidget)
        self.line_4.setGeometry(QtCore.QRect(170, 260, 91, 21))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(10)
        self.line_4.setFont(font)
        self.line_4.setObjectName("line_4")
        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.label.setText(_translate("MainWindow", "TRUE WIND"))
        self.label_2.setText(_translate("MainWindow", "Ship\'s speed (in knots)"))
        self.label_3.setText(_translate("MainWindow", "Ship\'s  heading"))
        self.label_4.setText(_translate("MainWindow", "Relative wind speed (in m/s)"))
        self.label_5.setText(_translate("MainWindow", "Relative wind direction"))
        self.label_6.setText(_translate("MainWindow", "Relative wind side"))
        self.port_btn.setText(_translate("MainWindow", "Port"))
        self.stbd_btn.setText(_translate("MainWindow", "Starboard"))

       
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())

# Main calculating code

# Determinative variables

#vspd = Ui_MainWindow.line1.text
vspd = 12
vdir = 120
rspd_input = 20
rspd_side = "Knots"
if rspd_side == "Knots":
    rspd = rspd_input
else: rspd = rspd_input / 1.852
rdir = 50
aotb = "Starboard"


# Direction identity
def port_btn_clicked(self):
    print('port button clicked!!!!!!!11111111')

    print(math.sqrt((vspd ** 2 + rspd ** 2 - 2 * vspd * rspd * math.cos(math.radians(rdir)))))
    #tspd = math.sqrt((vspd ** 2 + rspd ** 2 - 2 * vspd * rspd * math.cos(math.radians(rdir))))

    print((tspd ** 2 + vspd ** 2 - rspd ** 2) / (2 * tspd * vspd))
    #z_form = (tspd ** 2 + vspd ** 2 - rspd ** 2) / (2 * tspd * vspd)
    if z_form == 1:                    # Main angle calculations
        z = 0
    elif z_form == -1:
            z = 180
    else: z =math.degrees(math.acos(z_form))

    if aotb == "Port":                # Determination of siding and translating to 360 mode
        if 180 - z + vdir >= 360:
            a = 180 - z +vdir - 360
        else: a = 180 - z + vdir
    else:
        if 180 + z + vdir >= 360:
                a = 180 + z + vdir - 360
        else: a = 180 + z +vdir


def stbd_btn_clicked(self):
    print('stbd button clicked!!!!!!!11111111')
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Проблема реализовать это внутри класса
Просто перенесите определение функций внутрь класса:
Python:
from PyQt5 import QtWidgets, uic, QtCore, QtGui
import math
import sys


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        ...
        # вызов функций по нажатию кнопки
        self.port_btn.clicked.connect(self.port_btn_clicked)
        self.stbd_btn.clicked.connect(self.stbd_btn_clicked)
        ...

    # сами функции внутри класса
    def port_btn_clicked(self):
        print('port button clicked!!!!!!!11111111')

    def stbd_btn_clicked(self):
        print('stbd button clicked!!!!!!!11111111')

    def retranslateUi(self, MainWindow):
        ...


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

hurtZ

Новичок
Пользователь
Окт 13, 2021
10
0
1
Просто перенесите определение функций внутрь класса:
Python:
from PyQt5 import QtWidgets, uic, QtCore, QtGui
import math
import sys


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        ...
        # вызов функций по нажатию кнопки
        self.port_btn.clicked.connect(self.port_btn_clicked)
        self.stbd_btn.clicked.connect(self.stbd_btn_clicked)
        ...

    # сами функции внутри класса
    def port_btn_clicked(self):
        print('port button clicked!!!!!!!11111111')

    def stbd_btn_clicked(self):
        print('stbd button clicked!!!!!!!11111111')

    def retranslateUi(self, MainWindow):
        ...


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

Спасибо большое за помощь!
 

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