• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed AttributeError: Problem z podpięciem logiki do buttona -GUI PyQt5

Object Storage Arubacloud
0 głosów
359 wizyt
pytanie zadane 7 sierpnia 2019 w Python przez Ventre90 Obywatel (1,170 p.)
zamknięte 9 sierpnia 2019 przez Ventre90

Cześć drodzy pasjonaci.

Stworzyłem sobie widok takiego prostego kalkulatora za pomocą PyQt5 w edytorze QTDesigner. Kod został wygenerowany, ja natomiast jeszcze z widoku edytora ponazywałem sobie obiekty, tak by łatwo móc je identyfikować przy podpinaniu logiki. Niestety z tym podpinaniem nie idzie.

Stworzyłem prosta metodę close_it(self) na zamykanie programu i chce ją podpiąć do buttonu Quit  za pomocą wyrażeń: quit_B.clicked.connect(self.close_it)

jest to 16 i 94 linia poniższego kodu.

Aplikacja uruchamia się ale po naciśnięciu klawisza Quit wyskakuje error: AttributeError: 'Ui_MainWindow' object has no attribute 'close'

PS. Dodam że błędu nie generuje nieprawidłowa ilosć spacji, bo juz to sprawdzałem w różnych edytorach i wpisywałem tą funkcję w różnych miejscach kodu.

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import *
import sys

class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(510, 170)
        MainWindow.setMinimumSize(QtCore.QSize(510, 170))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.quit_B = QtWidgets.QPushButton(self.centralwidget)
        self.quit_B.setGeometry(QtCore.QRect(10, 110, 491, 31))
        self.quit_B.setObjectName("quit_B")
        self.quit_B.clicked.connect(self.close_it)

        self.add_B = QtWidgets.QPushButton(self.centralwidget)
        self.add_B.setGeometry(QtCore.QRect(10, 60, 91, 41))
        self.add_B.setObjectName("add_B")
        self.sub_B = QtWidgets.QPushButton(self.centralwidget)
        self.sub_B.setGeometry(QtCore.QRect(110, 60, 91, 41))
        self.sub_B.setObjectName("sub_B")
        self.multip_B = QtWidgets.QPushButton(self.centralwidget)
        self.multip_B.setGeometry(QtCore.QRect(210, 60, 91, 41))
        self.multip_B.setObjectName("multip_B")
        self.div_B = QtWidgets.QPushButton(self.centralwidget)
        self.div_B.setGeometry(QtCore.QRect(310, 60, 91, 41))
        self.div_B.setObjectName("div_B")
        self.mod_B = QtWidgets.QPushButton(self.centralwidget)
        self.mod_B.setGeometry(QtCore.QRect(410, 60, 91, 41))
        self.mod_B.setObjectName("mod_B")
        self.num1_field = QtWidgets.QLineEdit(self.centralwidget)
        self.num1_field.setGeometry(QtCore.QRect(10, 30, 151, 21))
        self.num1_field.setObjectName("num1_field")
        self.num2_field = QtWidgets.QLineEdit(self.centralwidget)
        self.num2_field.setGeometry(QtCore.QRect(180, 30, 151, 21))
        self.num2_field.setObjectName("num2_field")
        self.result_field = QtWidgets.QLineEdit(self.centralwidget)
        self.result_field.setToolTip('Wpisz <b>liczby</b> i wybierz działanie...')
        self.result_field.readonly = True
        self.result_field.setGeometry(QtCore.QRect(350, 30, 151, 21))
        self.result_field.setObjectName("result_field")
        self.num1_txt = QtWidgets.QLabel(self.centralwidget)
        self.num1_txt.setGeometry(QtCore.QRect(10, 10, 121, 21))
        self.num1_txt.setObjectName("num1_txt")
        self.num2_txt = QtWidgets.QLabel(self.centralwidget)
        self.num2_txt.setGeometry(QtCore.QRect(180, 10, 121, 21))
        self.num2_txt.setObjectName("num2_txt")
        self.result_txt = QtWidgets.QLabel(self.centralwidget)
        self.result_txt.setGeometry(QtCore.QRect(350, 10, 121, 21))
        self.result_txt.setObjectName("result_txt")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        MainWindow.setTabOrder(self.num1_field, self.num2_field)
        MainWindow.setTabOrder(self.num2_field, self.result_field)
        MainWindow.setTabOrder(self.result_field, self.add_B)
        MainWindow.setTabOrder(self.add_B, self.sub_B)
        MainWindow.setTabOrder(self.sub_B, self.multip_B)
        MainWindow.setTabOrder(self.multip_B, self.div_B)
        MainWindow.setTabOrder(self.div_B, self.mod_B)
        MainWindow.setTabOrder(self.mod_B, self.quit_B)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Simple Calculator"))
        self.quit_B.setText(_translate("MainWindow", "Quit"))
        self.add_B.setText(_translate("MainWindow", "Add"))
        self.sub_B.setText(_translate("MainWindow", "Subtract"))
        self.multip_B.setText(_translate("MainWindow", "Multiply"))
        self.div_B.setText(_translate("MainWindow", "Divide"))
        self.mod_B.setText(_translate("MainWindow", "Modulo"))
        self.num1_txt.setText(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:10pt; color:#cf0000;\">Number 1:</span></p></body></html>"))
        self.num2_txt.setText(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:10pt; color:#0000ad;\">Number 2:</span></p></body></html>"))
        self.result_txt.setText(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:10pt; color:#007e00;\">Result :</span></p></body></html>"))

    def close_it(self):
        self.close()

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

komentarz zamknięcia: rozwiązany

2 odpowiedzi

+1 głos
odpowiedź 7 sierpnia 2019 przez Mr-root Gaduła (3,750 p.)
wybrane 7 sierpnia 2019 przez Ventre90
 
Najlepsza

Myślałeś może nad takim rozwiązaniem:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import *
import sys
 
class Ui_MainWindow(object):
 
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(510, 170)
        MainWindow.setMinimumSize(QtCore.QSize(510, 170))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.quit_B = QtWidgets.QPushButton(self.centralwidget)
        self.quit_B.setGeometry(QtCore.QRect(10, 110, 491, 31))
        self.quit_B.setObjectName("quit_B")
        self.quit_B.clicked.connect(self.close_it)
        self.add_B = QtWidgets.QPushButton(self.centralwidget)
        self.add_B.setGeometry(QtCore.QRect(10, 60, 91, 41))
        self.add_B.setObjectName("add_B")
        self.sub_B = QtWidgets.QPushButton(self.centralwidget)
        self.sub_B.setGeometry(QtCore.QRect(110, 60, 91, 41))
        self.sub_B.setObjectName("sub_B")
        self.multip_B = QtWidgets.QPushButton(self.centralwidget)
        self.multip_B.setGeometry(QtCore.QRect(210, 60, 91, 41))
        self.multip_B.setObjectName("multip_B")
        self.div_B = QtWidgets.QPushButton(self.centralwidget)
        self.div_B.setGeometry(QtCore.QRect(310, 60, 91, 41))
        self.div_B.setObjectName("div_B")
        self.mod_B = QtWidgets.QPushButton(self.centralwidget)
        self.mod_B.setGeometry(QtCore.QRect(410, 60, 91, 41))
        self.mod_B.setObjectName("mod_B")
        self.num1_field = QtWidgets.QLineEdit(self.centralwidget)
        self.num1_field.setGeometry(QtCore.QRect(10, 30, 151, 21))
        self.num1_field.setObjectName("num1_field")
        self.num2_field = QtWidgets.QLineEdit(self.centralwidget)
        self.num2_field.setGeometry(QtCore.QRect(180, 30, 151, 21))
        self.num2_field.setObjectName("num2_field")
        self.result_field = QtWidgets.QLineEdit(self.centralwidget)
        self.result_field.setToolTip('Wpisz <b>liczby</b> i wybierz działanie...')
        self.result_field.readonly = True
        self.result_field.setGeometry(QtCore.QRect(350, 30, 151, 21))
        self.result_field.setObjectName("result_field")
        self.num1_txt = QtWidgets.QLabel(self.centralwidget)
        self.num1_txt.setGeometry(QtCore.QRect(10, 10, 121, 21))
        self.num1_txt.setObjectName("num1_txt")
        self.num2_txt = QtWidgets.QLabel(self.centralwidget)
        self.num2_txt.setGeometry(QtCore.QRect(180, 10, 121, 21))
        self.num2_txt.setObjectName("num2_txt")
        self.result_txt = QtWidgets.QLabel(self.centralwidget)
        self.result_txt.setGeometry(QtCore.QRect(350, 10, 121, 21))
        self.result_txt.setObjectName("result_txt")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
 
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        MainWindow.setTabOrder(self.num1_field, self.num2_field)
        MainWindow.setTabOrder(self.num2_field, self.result_field)
        MainWindow.setTabOrder(self.result_field, self.add_B)
        MainWindow.setTabOrder(self.add_B, self.sub_B)
        MainWindow.setTabOrder(self.sub_B, self.multip_B)
        MainWindow.setTabOrder(self.multip_B, self.div_B)
        MainWindow.setTabOrder(self.div_B, self.mod_B)
        MainWindow.setTabOrder(self.mod_B, self.quit_B)
 
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Simple Calculator"))
        self.quit_B.setText(_translate("MainWindow", "Quit"))
        self.add_B.setText(_translate("MainWindow", "Add"))
        self.sub_B.setText(_translate("MainWindow", "Subtract"))
        self.multip_B.setText(_translate("MainWindow", "Multiply"))
        self.div_B.setText(_translate("MainWindow", "Divide"))
        self.mod_B.setText(_translate("MainWindow", "Modulo"))
        self.num1_txt.setText(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:10pt; color:#cf0000;\">Number 1:</span></p></body></html>"))
        self.num2_txt.setText(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:10pt; color:#0000ad;\">Number 2:</span></p></body></html>"))
        self.result_txt.setText(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:10pt; color:#007e00;\">Result :</span></p></body></html>"))
 
    def close_it(self):
        sys.exit(1)
 
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Zmiana w funkcji close_it

Mam nadzieję, że pomogłem :-)

komentarz 7 sierpnia 2019 przez Ventre90 Obywatel (1,170 p.)
Działa bardzo dziękuje.

Ale dlaczego to dział i co ten AttributeError znaczy ?

Czy jak teraz będę pisał metody na odpowiednio dzielenie, mnożenie, dodawania do buttonow to ten error nie będzie się pojawiał ?
+1 głos
odpowiedź 7 sierpnia 2019 przez Mr-root Gaduła (3,750 p.)

Jeszcze jedno o co prosiłeś. Taki prosty przykład z dodawaniem:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import *
import sys
 
class Ui_MainWindow(object):
 
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(510, 170)
        MainWindow.setMinimumSize(QtCore.QSize(510, 170))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.quit_B = QtWidgets.QPushButton(self.centralwidget)
        self.quit_B.setGeometry(QtCore.QRect(10, 110, 491, 31))
        self.quit_B.setObjectName("quit_B")
        self.quit_B.clicked.connect(self.close_it)
        self.add_B = QtWidgets.QPushButton(self.centralwidget)
        self.add_B.setGeometry(QtCore.QRect(10, 60, 91, 41))
        self.add_B.setObjectName("add_B")
        self.add_B.clicked.connect(self.add_2)
        self.sub_B = QtWidgets.QPushButton(self.centralwidget)
        self.sub_B.setGeometry(QtCore.QRect(110, 60, 91, 41))
        self.sub_B.setObjectName("sub_B")
        self.multip_B = QtWidgets.QPushButton(self.centralwidget)
        self.multip_B.setGeometry(QtCore.QRect(210, 60, 91, 41))
        self.multip_B.setObjectName("multip_B")
        self.div_B = QtWidgets.QPushButton(self.centralwidget)
        self.div_B.setGeometry(QtCore.QRect(310, 60, 91, 41))
        self.div_B.setObjectName("div_B")
        self.mod_B = QtWidgets.QPushButton(self.centralwidget)
        self.mod_B.setGeometry(QtCore.QRect(410, 60, 91, 41))
        self.mod_B.setObjectName("mod_B")
        self.num1_field = QtWidgets.QLineEdit(self.centralwidget)
        self.num1_field.setGeometry(QtCore.QRect(10, 30, 151, 21))
        self.num1_field.setObjectName("num1_field")
        self.num2_field = QtWidgets.QLineEdit(self.centralwidget)
        self.num2_field.setGeometry(QtCore.QRect(180, 30, 151, 21))
        self.num2_field.setObjectName("num2_field")
        self.result_field = QtWidgets.QLineEdit(self.centralwidget)
        self.result_field.setToolTip('Wpisz <b>liczby</b> i wybierz działanie...')
        self.result_field.readonly = True
        self.result_field.setGeometry(QtCore.QRect(350, 30, 151, 21))
        self.result_field.setObjectName("result_field")
        self.num1_txt = QtWidgets.QLabel(self.centralwidget)
        self.num1_txt.setGeometry(QtCore.QRect(10, 10, 121, 21))
        self.num1_txt.setObjectName("num1_txt")
        self.num2_txt = QtWidgets.QLabel(self.centralwidget)
        self.num2_txt.setGeometry(QtCore.QRect(180, 10, 121, 21))
        self.num2_txt.setObjectName("num2_txt")
        self.result_txt = QtWidgets.QLabel(self.centralwidget)
        self.result_txt.setGeometry(QtCore.QRect(350, 10, 121, 21))
        self.result_txt.setObjectName("result_txt")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
 
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        MainWindow.setTabOrder(self.num1_field, self.num2_field)
        MainWindow.setTabOrder(self.num2_field, self.result_field)
        MainWindow.setTabOrder(self.result_field, self.add_B)
        MainWindow.setTabOrder(self.add_B, self.sub_B)
        MainWindow.setTabOrder(self.sub_B, self.multip_B)
        MainWindow.setTabOrder(self.multip_B, self.div_B)
        MainWindow.setTabOrder(self.div_B, self.mod_B)
        MainWindow.setTabOrder(self.mod_B, self.quit_B)
 
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Simple Calculator"))
        self.quit_B.setText(_translate("MainWindow", "Quit"))
        self.add_B.setText(_translate("MainWindow", "Add"))
        self.sub_B.setText(_translate("MainWindow", "Subtract"))
        self.multip_B.setText(_translate("MainWindow", "Multiply"))
        self.div_B.setText(_translate("MainWindow", "Divide"))
        self.mod_B.setText(_translate("MainWindow", "Modulo"))
        self.num1_txt.setText(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:10pt; color:#cf0000;\">Number 1:</span></p></body></html>"))
        self.num2_txt.setText(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:10pt; color:#0000ad;\">Number 2:</span></p></body></html>"))
        self.result_txt.setText(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:10pt; color:#007e00;\">Result :</span></p></body></html>"))
 
    def close_it(self):
        sys.exit(1)

    def add_2(self):
        first = int(self.num1_field.text())
        second = int(self.num2_field.text())
        self.result_field.setText(str(first + second))

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

 

Mr Root

komentarz 7 sierpnia 2019 przez Ventre90 Obywatel (1,170 p.)

@Mr Root - dziękuje za twoje zaangażowanie. Program napisałęm troche w inny sposób.

No i właśnie o ten sposob tutaj sie rozchodzi. Jak nadać w pythonie coś takiego jak źródło sygnału albo sender, gdzie program rozpozna o jaki button chodzi przy klikaniu. Brzmi to moze enigmatycznie ale postaram sie wyjasnic w przykładzie:

Początkowo logike pod swoje buttony napisałem tak:

def logic(self):
    n1 = float(self.num1_field.text())
    n2 = float(self.num2_field.text())
    score = ""

    if self.add_B.click:
        score = n1 + n2
    elif self.sub_B.click:
        score = n1 - n2
    elif self.multip_B.click:
        score = n1 + n2
    elif self.add_B.click:
        score = n1 * n2
    elif self.div_B.click:
        score = n1 / n2
    elif self.modulo_B.click:
        score = n1 % n2

    self.result_field.setText(str(score))

i oczywiście standardowo podpinka metody pod każdy button typu:

self.add_B.clicked.connect(self.logic)

Niestety to nie działa, bo program wykrywa tylko dodawanie albo jakies dziwne rzeczy sie dzieją.

Więc wyseparowalem te metody - co dziala - ale napeewno nie jest rozwiazaniem zgodnym ze sztuka:

    def addmition(self):
        n1 = float(self.num1_field.text())
        n2 = float(self.num2_field.text())
        score = ""
        if self.add_B.click:
            score = n1 + n2
        self.result_field.setText(str(score))

    def subtraction(self):
        n1 = float(self.num1_field.text())
        n2 = float(self.num2_field.text())
        score = ""
        if self.sub_B.click:
            score = n1 - n2
        self.result_field.setText(str(score))

    def multiplication(self):
        n1 = float(self.num1_field.text())
        n2 = float(self.num2_field.text())
        score = ""
        if self.multip_B.click:
            score = n1 * n2
        self.result_field.setText(str(score))

    def division(self):
        n1 = float(self.num1_field.text())
        n2 = float(self.num2_field.text())
        score = ""
        if self.div_B.click:
            score = n1 / n2
        self.result_field.setText(str(score))

    def modulo(self):
        n1 = float(self.num1_field.text())
        n2 = float(self.num2_field.text())
        score = ""
        if self.mod_B.click:
            score = n1 % n2
        self.result_field.setText(str(score))

i oczywiscie podpinam metode pod button.

Czy istnieje lepszy sposob zeby to zawrzec tylko w 1 metodzie ?

komentarz 7 sierpnia 2019 przez Mr-root Gaduła (3,750 p.)

Samo wypluwanie wyniku w jednej metodzie to nie problem.

	def calculate(self, operation):
		first = int(self.num1_field.text())
		second = int(self.num2_field.text())
		if operation == 1:
			self.result_field.setText(str(first + second))
		elif operation == 2:
			self.result_field.setText(str(first - second))
		elif operation == 3:
			self.result_field.setText(str(first * second))
		elif operation == 4:
			self.result_field.setText(str(first / second))
		elif operation == 5:
			self.result_field.setText(str(first % second))

Kłopot w tym, że ciężko jest przekazać argumenty do funkcji bezpośrednio "z przycisku"

Można próbować rozbić to na kilka metod i do wyświetlania wyniku zostawić jedną ale zakładam, że nie o to Ci chodzi.

komentarz 7 sierpnia 2019 przez Ventre90 Obywatel (1,170 p.)

Chodzi mi o to ze w internecie znalazłem taki kod:

    def dzialanie(self):

        nadawca = self.sender()

        try:
            liczba1 = float(self.liczba1Edt.text())
            liczba2 = float(self.liczba2Edt.text())
            wynik = ""

            if nadawca.text() == "&Dodaj":
                wynik = liczba1 + liczba2
            else:
                pass

            self.wynikEdt.setText(str(wynik))

if nadawca.text() == "&Dodaj":
                wynik = liczba1 + liczba2
            elif nadawca.text() == "&Odejmij":
                wynik = liczba1 - liczba2
            elif nadawca.text() == "&Mnóż":
                wynik = liczba1 * liczba2
            else:  # dzielenie
                try:
                    wynik = round(liczba1 / liczba2, 9)
                except ZeroDivisionError:
                    QMessageBox.critical(
                        self, "Błąd", "Nie można dzielić przez zero!")
                    return

i tu autor pisze tak jak ja na początku z tym if / elif - tyle ze nadaje ( jak tłumaczy) jakieś rozpoznawanie sygnału za pomocą tej funkcji self.sender() - a jak ja tego używam, chcąc zrobić takie same porównania na ifach jak on ( czyli text z batona) to wyskakuje błąd ten co w tytule tematu : AttributeError. dityczący funkcji self.sender()

Ja to troche robie inaczej, bo używam QT designer ale ogolnie się wzorowałem na tym projekcie:

https://python101.readthedocs.io/pl/latest/pyqt/kalkulator/

 

Podobne pytania

0 głosów
0 odpowiedzi 329 wizyt
pytanie zadane 4 listopada 2020 w Python przez Jesioon Nowicjusz (120 p.)
0 głosów
1 odpowiedź 569 wizyt
pytanie zadane 9 sierpnia 2019 w Python przez Ventre90 Obywatel (1,170 p.)
0 głosów
2 odpowiedzi 119 wizyt
pytanie zadane 2 stycznia w Python przez ride3bike Nowicjusz (180 p.)

92,572 zapytań

141,422 odpowiedzi

319,644 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...