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

QMessageBox a zamykanie programu - Python (PyQt5)

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

Drodzy pasjonaci mam do Was kolejną prośbę o pomoc. Czy ktoś zna sposób na przypisanie funkcji lub jakiegoś eventu to standardowych buttonów w QMessageBox?

Stworzyłem taki Box, który wyskakuje po naciśnięciu przycisku Quit w głównym oknie programu.. Niestety zarówno standardowy button Yes i No zamyka mi program. Ja chciałbym oczywiście aby button NO nie zamykał programu tylko jedynie QMessageBox (ten popup co wyskakuje). Próbowałem wiele sposobów ale nic nie idzie. Kod i screen poniżej:

Pytanie ma związek z liniami kodu: 

17 - podpięcie buttona 'Quit' pod metode otwierająca QMessageBoxa

111-112 - metoda zamykania programu

154- 162 - zefiniowenia całego okna popup czyli QMessageBoxa

 

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
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.end_window)
        #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.addmition)

        self.sub_B = QtWidgets.QPushButton(self.centralwidget)
        self.sub_B.setGeometry(QtCore.QRect(110, 60, 91, 41))
        self.sub_B.setObjectName("sub_B")
        self.sub_B.clicked.connect(self.subtraction)

        self.multip_B = QtWidgets.QPushButton(self.centralwidget)
        self.multip_B.setGeometry(QtCore.QRect(210, 60, 91, 41))
        self.multip_B.setObjectName("multip_B")
        self.multip_B.clicked.connect(self.multiplication)

        self.div_B = QtWidgets.QPushButton(self.centralwidget)
        self.div_B.setGeometry(QtCore.QRect(310, 60, 91, 41))
        self.div_B.setObjectName("div_B")
        self.div_B.clicked.connect(self.division)

        self.mod_B = QtWidgets.QPushButton(self.centralwidget)
        self.mod_B.setGeometry(QtCore.QRect(410, 60, 91, 41))
        self.mod_B.setObjectName("mod_B")
        self.mod_B.clicked.connect(self.modulo)

        self.num1_field = QtWidgets.QLineEdit(self.centralwidget)
        self.num1_field.setGeometry(QtCore.QRect(10, 30, 151, 21))
        self.num1_field.setObjectName("num1_field")
        self.num1_field.setToolTip('use <b>.</b> to separate float nummbers')

        self.num2_field = QtWidgets.QLineEdit(self.centralwidget)
        self.num2_field.setGeometry(QtCore.QRect(180, 30, 151, 21))
        self.num2_field.setObjectName("num2_field")
        self.num2_field.setToolTip('use <b>.</b> to separate float nummbers')

        self.result_field = QtWidgets.QLineEdit(self.centralwidget)
        self.result_field.setToolTip('Input <b>nummbers</b> and click an action')
        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 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))

    def end_window(self):
        msg = QMessageBox()
        msg.setWindowTitle('Question')
        msg.setText('Do you want to close the program?')
        msg.setIcon(QMessageBox.Question)
        msg.setStandardButtons(QMessageBox.Yes|QMessageBox.No)
        msg.buttonClicked.connect(self.close_it)

        x = msg.exec_()




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

 

 

1 odpowiedź

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

Cześć wydaje mi się, że znalazłem pożądane przez ciebie rozwiązanie edytując funkcję close_it [111-115] oraz fragment ją wywołujący [167 -> 168]

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
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.end_window)
		#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.addmition)
 
		self.sub_B = QtWidgets.QPushButton(self.centralwidget)
		self.sub_B.setGeometry(QtCore.QRect(110, 60, 91, 41))
		self.sub_B.setObjectName("sub_B")
		self.sub_B.clicked.connect(self.subtraction)
 
		self.multip_B = QtWidgets.QPushButton(self.centralwidget)
		self.multip_B.setGeometry(QtCore.QRect(210, 60, 91, 41))
		self.multip_B.setObjectName("multip_B")
		self.multip_B.clicked.connect(self.multiplication)
 
		self.div_B = QtWidgets.QPushButton(self.centralwidget)
		self.div_B.setGeometry(QtCore.QRect(310, 60, 91, 41))
		self.div_B.setObjectName("div_B")
		self.div_B.clicked.connect(self.division)
 
		self.mod_B = QtWidgets.QPushButton(self.centralwidget)
		self.mod_B.setGeometry(QtCore.QRect(410, 60, 91, 41))
		self.mod_B.setObjectName("mod_B")
		self.mod_B.clicked.connect(self.modulo)
 
		self.num1_field = QtWidgets.QLineEdit(self.centralwidget)
		self.num1_field.setGeometry(QtCore.QRect(10, 30, 151, 21))
		self.num1_field.setObjectName("num1_field")
		self.num1_field.setToolTip('use <b>.</b> to separate float nummbers')
 
		self.num2_field = QtWidgets.QLineEdit(self.centralwidget)
		self.num2_field.setGeometry(QtCore.QRect(180, 30, 151, 21))
		self.num2_field.setObjectName("num2_field")
		self.num2_field.setToolTip('use <b>.</b> to separate float nummbers')
 
		self.result_field = QtWidgets.QLineEdit(self.centralwidget)
		self.result_field.setToolTip('Input <b>nummbers</b> and click an action')
		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, button_id):
		if int(button_id) == 16384:
			sys.exit(1)
		else:
			return

	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))

	def bttn(i):
		print(str(i).encode('ascii'))


	def end_window(self):
		msg = QMessageBox()
		msg.setWindowTitle('Question')
		msg.setText('Do you want to close the program?')
		msg.setIcon(QMessageBox.Question)
		msg.setStandardButtons(QMessageBox.Yes|QMessageBox.No)
#		msg.buttonClicked.connect(self.bttn)
		self.close_it(msg.exec_())
		


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 10 sierpnia 2019 przez Ventre90 Obywatel (1,170 p.)

@ Mr Root - Dzięki. Bardzo doceniam, że mi pomagasz ale mam kilka pytań. Generalnie to działa nawet bez tej metody def bttn(i):

Co zmienia to, że dopisałeś w metodzie close_it te button_id i tą liczbę 16384 później ? 

 czy to jest ID tego buttonu w tym QMessageBoxie ? Jeżeli tak to skąd się bierze takie ID ? Czy to ID jest generowane w momencie kliknięcia na ten button i dlatego program wie, że to właśnei do tego buttonu jest przypisana akcja sys.exit(1) ?

Tego zapisu też nie do końca łapie niestety: self.close_it(msg.exec_()) - chodzi o to, że funkcja self.close_it wywołuje całe popup okno zdefiniowane jako msg. ( i te wszystkie definicje msg.QMessageBox w nim zawarte ) ?

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

Cześć. 

Metodę bttn(i) dodałem aby sprawdzić wartości zwracane przez poszczególne przyciski.

Wtedy zobaczyłem, że msg.exec_() zwraca wartość 16384 po wciśnięciu [YES] oraz 65536 dla [NO] więc w metodzie close_it dopisałem wymaganie zmiennej button_id aby tylko po wciśnięciu yes program kończył działanie. Równie dobrze można zapisać tego if'a w end_window().

Dla sprawdzenia wartości wykonałem jeszcze polecenia z pozionu metody end_window()

print(msg.Yes)
print(msg.No)

których wyniki to kolejno

D:\Desktop>py -3 app.py
16384
65536

zatem msg.Yes = 16384

oraz

msg.No = 65536

zatem mógłbym też zrobić tak

if button_id == msg.Yes:
    self.close_it()

dla funkcji close_it widniejącej poniej

def close_it(self):
    sys.exit(0)

ponieważ walidacja została już wykonana.

I jeszcze ostatnie pytanie. Zapis:

self.close_it(msg.exec_())

1 - self ponieważ odwołujemy się do metody danego obiektu

2 - funkcja close_it(button_id)

argumentem wywołania "jest msg.exec_()" ale poprawniej będzie jeśli powiem, że tym argumentem jest to co msg.exec_() zwróci. Aby tak się stało przy wywoływaniu funkcji close_it wykonywane jest polecenie msg.exec_() a jego "return" (w tym wypadku 16384 lub 65536) jest przekazywany bezpośrednio jako argument wywołania dla close_it.

cieszę się, że mogłem pomóc

Mr Root

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

MR Root bardzo dziękuje za obszerne wyjaśnienia. Już rozumiem sprawę z tymi button_id na poziomie logicznym.

Jednak jak dokładnie Ty wyświetlasz te button_id, bo to bardzo przydatne informacje, które się mogą mi jeszcze nie raz przydać. Niestety jak dopisuje te print do metody end_widnow() to nigdzie mi się nie wyświetlają te button_id ( Odpalam program z PowerShell - i myślałem ze po kliknięciu Yes/No to powinno sie wypritowac w powłoce). Jednak tak nie jest. Jak to zrobić ?

    def bttn(i):
        print(str(i).encode('ascii'))

    def end_window(self):
        msg = QMessageBox()
        msg.setWindowTitle('Question')
        msg.setText('Do you want to close the program?')
        msg.setIcon(QMessageBox.Question)
        msg.setStandardButtons(QMessageBox.Yes|QMessageBox.No)
        msg.buttonClicked.connect(self.bttn)
        self.close_it(msg.exec_())
        print(msg.Yes)
        print(msg.No)

PS. Czy w tym def bttn(i) - nie powinno byc def bttn(self) ?

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

Cześc.

Jednak jak dokładnie Ty wyświetlasz te button_id,

Tak jak już pisałem to co nazwałem button_id jest zwracane przez msg.exec()

Niestety jak dopisuje te print do metody end_widnow() to nigdzie mi się nie wyświetlają te button_id ( Odpalam program z PowerShell - i myślałem ze po kliknięciu Yes/No to powinno sie wypritowac w powłoce).

Jeśli robisz to w taki sposób to tylko po kliknięciu NO zostaną wywalone na ekran button_id

i nie wiem czemu ci nie działa bo u mnie przez powershella wszystko pięknie śmiga

PS. Czy w tym def bttn(i) - nie powinno byc def bttn(self) ?

bttn() dodałem tylko dla sprawdzenia co jest zwracane i można już to usunąć :-) a tak na przyszłość wystarczy wskazać interpreterowi, że jest to metoda statyczna dopisując @staticmethod na początku

    @staticmethod
    def bttn(i):
        print(str(i).encode('ascii'))

Wersja programu która u mnie działa:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
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.end_window)
        # 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.addmition)

        self.sub_B = QtWidgets.QPushButton(self.centralwidget)
        self.sub_B.setGeometry(QtCore.QRect(110, 60, 91, 41))
        self.sub_B.setObjectName("sub_B")
        self.sub_B.clicked.connect(self.subtraction)

        self.multip_B = QtWidgets.QPushButton(self.centralwidget)
        self.multip_B.setGeometry(QtCore.QRect(210, 60, 91, 41))
        self.multip_B.setObjectName("multip_B")
        self.multip_B.clicked.connect(self.multiplication)

        self.div_B = QtWidgets.QPushButton(self.centralwidget)
        self.div_B.setGeometry(QtCore.QRect(310, 60, 91, 41))
        self.div_B.setObjectName("div_B")
        self.div_B.clicked.connect(self.division)

        self.mod_B = QtWidgets.QPushButton(self.centralwidget)
        self.mod_B.setGeometry(QtCore.QRect(410, 60, 91, 41))
        self.mod_B.setObjectName("mod_B")
        self.mod_B.clicked.connect(self.modulo)

        self.num1_field = QtWidgets.QLineEdit(self.centralwidget)
        self.num1_field.setGeometry(QtCore.QRect(10, 30, 151, 21))
        self.num1_field.setObjectName("num1_field")
        self.num1_field.setToolTip('use <b>.</b> to separate float nummbers')

        self.num2_field = QtWidgets.QLineEdit(self.centralwidget)
        self.num2_field.setGeometry(QtCore.QRect(180, 30, 151, 21))
        self.num2_field.setObjectName("num2_field")
        self.num2_field.setToolTip('use <b>.</b> to separate float nummbers')

        self.result_field = QtWidgets.QLineEdit(self.centralwidget)
        self.result_field.setToolTip('Input <b>nummbers</b> and click an action')
        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, button_id):
        if int(button_id) == 16384:
            sys.exit(1)
        else:
            return

    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))

    def end_window(self):
        msg = QMessageBox()
        msg.setWindowTitle('Question')
        msg.setText('Do you want to close the program?')
        msg.setIcon(QMessageBox.Question)
        msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        self.close_it(msg.exec_())


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

Podobne pytania

0 głosów
0 odpowiedzi 326 wizyt
pytanie zadane 4 listopada 2020 w Python przez Jesioon Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 354 wizyt
0 głosów
2 odpowiedzi 115 wizyt
pytanie zadane 2 stycznia w Python przez ride3bike Nowicjusz (180 p.)

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 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!

...