Как передать переменную между функциями
Получается ошибка, что переменная не определена, пробовал через global, но всё равно не получается.
Как перевести переменную в другую функцию? Нужно будет вывести диалоговое окно, поэтому и спрашиваю.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import (QWidget, QApplication, QPushButton, QLabel, QLineEdit, QToolTip, QHBoxLayout, QVBoxLayout,
QMessageBox, QInputDialog)
from PyQt5.QtGui import (QFont, QIcon, QFontDatabase)
from PyQt5.QtCore import QCoreApplication
class App(QWidget):
def __init__(self):
super().__init__()
self.window()
def window(self):
self.setWindowTitle("Body mass index")
self.setWindowIcon(QIcon("img/ico.png"))
QToolTip.setFont(QFont("Josefin Slab", 15))
self.okBtn = QPushButton("ok")
self.okBtn.setToolTip("calculate")
self.okBtn.setFont(QFont("Josefin Slab", 11))
# self.okBtn.clicked.connect(self.calc())
self.exitBtn = QPushButton("exit")
self.exitBtn.setToolTip("close the program")
self.exitBtn.setFont(QFont("Josefin Slab", 11))
self.exitBtn.clicked.connect(QCoreApplication.instance().quit)
self.Hbox = QHBoxLayout()
self.Hbox.addStretch()
self.Hbox.addWidget(self.okBtn)
self.Hbox.addWidget(self.exitBtn)
self.m = QLineEdit(self)
self.m.setToolTip("Enter your weight here")
self.h = QLineEdit(self)
self.h.setToolTip("Enter your height here")
self.Vbox = QVBoxLayout()
self.Vbox.addWidget(self.m)
self.Vbox.addWidget(self.h)
self.Vbox.addLayout(self.Hbox)
self.Vbox.addStretch()
self.setLayout(self.Vbox)
if self.h != "" and self.m != "":
hq = self.h.text()
mq = self.m.text()
self.okBtn.clicked.connect(self.calc())
def closeEvent(self, event):
reply = QMessageBox.question(self, "Exit", "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
def calc(self):
# global hq
# global mq
self.bmi = float(mq) / (float(hq) * float(hq))
if __name__ == "__main__":
root = QApplication(sys.argv)
QFontDatabase.addApplicationFont("fonts/josefin.ttf")
start = App()
start.setFixedSize(300, 100)
start.show()
sys.exit(root.exec_())
Ответы (2 шт):
Вам надо указать полный путь к переменной, например если в другом классе: class.def.name, где class - имя класса, def - имя функции и name - имя переменной. Либо же в том же классе, но из другой функции класса: self.def.name, где self - указывает что значение берётся из этого же класса, def - имя функции из которой берёте и nmae - имя переменной. Надеюсь помог)
В данном случае, вам передавать ничего не надо. т.к. переменные, которые участвуют в расчетах являются атрибутами класса App (self.h , self.m), а следовательно доступны во всех методах данного класса. А если вам надо будет что-то передать, то вы можете воспользоваться функцией lambda
Попробуйте пример. Если вам, что-то будет не понятно - спросите, я отвечу.
import sys
from PyQt5.QtWidgets import (QWidget, QApplication, QPushButton, QLabel, QLineEdit,
QToolTip, QHBoxLayout, QVBoxLayout,
QMessageBox, QInputDialog)
from PyQt5.QtGui import (QFont, QIcon, QFontDatabase)
from PyQt5.QtCore import QCoreApplication
class App(QWidget):
def __init__(self):
super().__init__()
self.window()
def window(self):
self.setWindowTitle("Body mass index")
self.setWindowIcon(QIcon("img/ico.png"))
QToolTip.setFont(QFont("Josefin Slab", 15))
self.okBtn = QPushButton("ok")
self.okBtn.setToolTip("calculate")
self.okBtn.setFont(QFont("Josefin Slab", 11))
# self.okBtn.clicked.connect(self.calc())
self.okBtn.clicked.connect(self.calc) # +++
self.exitBtn = QPushButton("exit")
self.exitBtn.setToolTip("close the program")
self.exitBtn.setFont(QFont("Josefin Slab", 11))
self.exitBtn.clicked.connect(QCoreApplication.instance().quit)
self.Hbox = QHBoxLayout()
self.Hbox.addStretch()
self.Hbox.addWidget(self.okBtn)
self.Hbox.addWidget(self.exitBtn)
self.m = QLineEdit(self)
self.m.setToolTip("Enter your weight here")
self.h = QLineEdit(self)
self.h.setToolTip("Enter your height here")
self.Vbox = QVBoxLayout()
self.Vbox.addWidget(self.m)
self.Vbox.addWidget(self.h)
self.Vbox.addLayout(self.Hbox)
self.Vbox.addStretch()
self.setLayout(self.Vbox)
# if self.h != "" and self.m != "":
# hq = self.h.text()
# mq = self.m.text()
# self.okBtn.clicked.connect(self.calc())
def closeEvent(self, event):
reply = QMessageBox.question(self, "Exit", "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
# ++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def calc(self):
hq = self.h.text()
mq = self.m.text()
if not hq or not mq:
msg = QMessageBox.information(self, 'Внимание',
'Заполните пожалуйста все поля для рассчетов!')
return
# global hq
# global mq
self.bmi = float(mq) / (float(hq) * float(hq))
msg = QMessageBox.information(self, 'Резкльтат',
f' {mq} / ({hq} * {hq}) = {self.bmi:.3f}')
# ++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if __name__ == "__main__":
root = QApplication(sys.argv)
QFontDatabase.addApplicationFont("fonts/josefin.ttf")
start = App()
start.setFixedSize(300, 100)
start.show()
sys.exit(root.exec_())
