Не запускается функция closeEvent(), PyQt
Прописал метод closeEvent() в классе, но он не работает. Второй день ломаю голову, сайт уже перечитал.
Метод closeEvent() уже везде где только можно наставил.
Хочу, чтобы в этом методе сохранялись переменные перед закрытием можно и без вывода диалогового окна.
Часть кода урезал лишние формулы и элементы.
temp.py:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(700, 560)
MainWindow.setMinimumSize(QtCore.QSize(700, 560))
MainWindow.setMaximumSize(QtCore.QSize(800, 600))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 681, 541))
self.layoutWidget.setObjectName("layoutWidget")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget)
self.verticalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetMinAndMaxSize)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.label_2 = QtWidgets.QLabel(self.layoutWidget)
self.label_2.setMinimumSize(QtCore.QSize(350, 0))
# *************
self.lock_btn.setObjectName("lock_btn")
self.horizontalLayout.addWidget(self.lock_btn)
self.verticalLayout_2.addLayout(self.horizontalLayout)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
self.stackedWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label_2.setText(_translate("MainWindow", "88:88:88 8888 88-88-8888"))
self.home_btn.setText(_translate("MainWindow", "Home"))
*****************************
self.label_9.setText(_translate("MainWindow", "Переменные программы"))
self.label_3.setText(_translate("MainWindow", "Название Программы"))
self.settings_titleProgram.setText(_translate("MainWindow", "88"))
self.label_6.setText(_translate("MainWindow", "Описание"))
self.checkBox.setText(_translate("MainWindow", "CheckBox"))
self.label_8.setText(_translate("MainWindow", "Описание"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
New_main.py:
import sys
import configparser
from builtins import print
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, QLabel,QDialog
from temp import Ui_MainWindow
from PyQt5.QtCore import QTimer,QDateTime
class MainWindow:
def __init__(self):
print('Start program')
config = configparser.ConfigParser()
config.read('file.ini')
#print (config['DEFAULT']['settings_titleProgram'] )
self.main_win = QMainWindow()
self.ui = Ui_MainWindow()
self.ui.setupUi(self.main_win)
self.timer=QTimer()
self.timer.timeout.connect(self.showTime)
self.timer.start(1000)
self.showHome()
text1 =self.ui.settings_titleProgram.text()
print(text1)
self.main_win.setWindowTitle(text1)
self.ui.stackedWidget.setCurrentWidget(self.ui.home)
self.ui.home_btn.clicked.connect(self.showHome)
self.ui.lock_btn.clicked.connect(self.showLock)
self.ui.settings_btn.clicked.connect(self.showSettings)
# *******************************
def closeEvent(self, event):
print('close')
def showHome(self):
self.main_win.show()
self.ui.stackedWidget.setCurrentWidget(self.ui.home)
print('home')
def showSettings(self):
self.ui.stackedWidget.setCurrentWidget(self.ui.settings)
print('settings')
# *****************
def save_ini(self):
print('Сохраняем')
text1 =self.ui.settings_titleProgram.text()
print(text1)
config = configparser.ConfigParser()
config.read('file.ini')
config['DEFAULT']['settings_titleProgram'] = 999
with open('file.ini', 'w') as configfile:
config.write(configfile)
# Вывод времени
def startTimer(self):
self.timer.start(500)
#self.startBtn.setEnabled(False)
#self.endBtn.setEnabled(True)
def showTime(self):
current_time=QDateTime.currentDateTime()
formatted_time=current_time.toString('hh:mm:ss dddd dd-MM-yyyy')
self.ui.label_2.setText(formatted_time)
def closeEvent(self, event):
print('close')
if __name__ == "__main__":
app = QApplication(sys.argv)
main_win = MainWindow()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
То что вы предоставили никак не воспроизводится и проверить ваш код не возможно.
Но похоже на то, что вы как-то странно пишите класс основного окна приложения.
Обычно это делается так:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
...
# так:
# from temp import Ui_MainWindow
# или так:
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
...
# -------------> vvvvvvvvvvvv vvvvvvvvvvvvv <------------------------------# !!! +++
class MainWindow(QMainWindow, Ui_MainWindow): #
def __init__(self): #
super().__init__() # +++
self.setupUi(self)
...
def closeEvent(self, event):
# сохраняте все что вам надо перед закрытием приложения
# или вызовите другой метод, например self.save_ini()
# где вы хотите эти сохранения сделать
print('close')
def showTime(self):
current_time = QDateTime.currentDateTime()
formatted_time = current_time.toString('hh:mm:ss dddd dd-MM-yyyy')
# !!! vvvvvvvvvvvv вот так вы обращаетесь к объектам, которые указаны в форме <----
self.label_2.setText(formatted_time)
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MainWindow()
w.show() # !!! +++
sys.exit(app.exec_())
Я удалил все, что мешало запустить ваше приложение, чтобы убедиться, что метод closeEvent() работает.
import sys
import configparser
from builtins import print
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, \
QLabel, QDialog
from PyQt5.QtCore import QTimer, QDateTime
#from temp import Ui_MainWindow
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(700, 560)
# MainWindow.setMinimumSize(QtCore.QSize(700, 560))
# MainWindow.setMaximumSize(QtCore.QSize(800, 600))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.centralwidget.setStyleSheet("background-color: rgb(255, 192, 225);")
# ?
self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 681, 541))
self.layoutWidget.setObjectName("layoutWidget")
self.layoutWidget.setStyleSheet("background-color: rgb(192, 192, 225);")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget) #(self.layoutWidget)
self.verticalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetMinAndMaxSize)
self.verticalLayout_2.setContentsMargins(10, 10, 10, 10)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.label_2 = QtWidgets.QLabel(self.layoutWidget)
# self.label_2.setMinimumSize(QtCore.QSize(350, 0))
self.label_2.setStyleSheet("background-color: rgb(192, 192, 0);")
self.verticalLayout_2.addWidget(self.label_2)
# self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget)
# *************
# self.lock_btn =
# self.horizontalLayout =
# self.lock_btn.setObjectName("lock_btn")
# self.horizontalLayout.addWidget(self.lock_btn)
# self.verticalLayout_2.addLayout(self.horizontalLayout)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
# ? self.stackedWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label_2.setText(_translate("MainWindow", "88:88:88 8888 88-88-8888"))
# self.home_btn.setText(_translate("MainWindow", "Home"))
# *****************************
# self.label_9.setText(_translate("MainWindow", "Переменные программы"))
# self.label_3.setText(_translate("MainWindow", "Название Программы"))
# self.settings_titleProgram.setText(_translate("MainWindow", "88"))
# self.label_6.setText(_translate("MainWindow", "Описание"))
# self.checkBox.setText(_translate("MainWindow", "CheckBox"))
# self.label_8.setText(_translate("MainWindow", "Описание"))
# -------------> vvvvvvvvvvvv vvvvvvvvvvvvv <------------------------------# !!! +++
class MainWindow(QMainWindow, Ui_MainWindow): #
def __init__(self): #
super().__init__() # +++
self.setupUi(self) # +++
config = configparser.ConfigParser()
config.read('file.ini')
# ? self.main_win = QMainWindow()
# ? self.ui = Ui_MainWindow()
# ? self.ui.setupUi(self.main_win)
self.timer = QTimer()
self.timer.timeout.connect(self.showTime)
self.timer.start(1000)
# ? self.showHome()
# #
# text1 =self.ui.settings_titleProgram.text()
text1 = '1' # self.settings_titleProgram.text()
print(text1)
# self.main_win.setWindowTitle(text1)
self.setWindowTitle(text1)
self.home = 0
# self.stackedWidget.setCurrentWidget(self.home)
# self.home_btn.clicked.connect(self.showHome)
# self.lock_btn.clicked.connect(self.showLock)
# self.settings_btn.clicked.connect(self.showSettings)
# *******************************
def closeEvent(self, event):
# сохраняте все что вам надо перед закрытием приложения
# или вызовите другой метод, например self.save_ini()
# где вы хотите эти сохранения сделать
print('close')
# ? def showHome(self):
# ? self.main_win.show()
# ? self.stackedWidget.setCurrentWidget(self.home)
# ? print('home')
def showSettings(self):
# self.stackedWidget.setCurrentWidget(self.settings)
print('settings')
# *****************
def save_ini(self):
print('Сохраняем')
text1 =self.settings_titleProgram.text()
print(text1)
config = configparser.ConfigParser()
config.read('file.ini')
config['DEFAULT']['settings_titleProgram'] = 999
with open('file.ini', 'w') as configfile:
config.write(configfile)
# Вывод времени # ??? ?# ??? ?# ??? ?# ??? ?# ??? ?
# ? def startTimer(self):
# ? self.timer.start(500)
# ? #self.startBtn.setEnabled(False)
# ? #self.endBtn.setEnabled(True)
def showTime(self):
current_time = QDateTime.currentDateTime()
formatted_time = current_time.toString('hh:mm:ss dddd dd-MM-yyyy')
# !!! vvvvvvvvvvvv вот так вы обращаетесь к объектам, которые указаны в форме <----
self.label_2.setText(formatted_time)
# ---> что это # ?
# def closeEvent(self, event):
# print('close')
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MainWindow()
w.show() # !!! +++
sys.exit(app.exec_())
