Как отследить нажатие закрытия окна
Есть диалоговое окно. Как я могу отследить нажатие на его закрытие?
На данный момент при нажатии на крестик, происходит тоже самое, что и при нажатии на 'ок'.
После закрытия диалогового окна, которое я привёл, мне необходимо завершать выполнение ветки кода.
Вот код диалогового окна, в нём я переопределяю метод закрытия, как мне сделать, чтобы после нажатия оно закрывалось и код прерывался?
from PyQt5 import QtCore, QtGui, QtWidgets
class DialogArchName(QtWidgets.QDialog):
def __init__(self, parent=None):
super(DialogArchName, self).__init__(parent)
self.namef = ''
self.pathf = ''
label = QtWidgets.QLabel("Введите имя архива:")
self.namefield = QtWidgets.QLineEdit()
btnchoice = QtWidgets.QPushButton('Выбрать путь', clicked=self.getpath)
self.rar_arch = QtWidgets.QRadioButton('.rar')
self.zip_arch = QtWidgets.QRadioButton('.zip')
btnOk = QtWidgets.QPushButton("Архивировать", clicked=self.getname)
layout = QtWidgets.QGridLayout(self)
layout.addWidget(btnchoice, 3, 1, 1, 1) # высота, право
layout.addWidget(label, 0, 0, 1, 3)
layout.addWidget(self.namefield, 1, 1, 1, 1)
layout.addWidget(self.rar_arch, 0, 2, 3, 3)
layout.addWidget(self.zip_arch, 1, 2, 3, 3)
layout.addWidget(btnOk, 3, 2, 1, 1)
def closeEvent(self, a0: QtWidgets.QDialog.closeEvent) -> None:
QtWidgets.QDialog.closeEvent(self, a0)
def getname(self):
self.namef = self.namefield.text()
self.hide()
return self.namef
def getpath(self):
self.pathf = QtWidgets.QFileDialog.getExistingDirectory()
return self.pathf
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я не совсем понимаю в чем у вас проблема, попробуйте так:
from PyQt5 import QtCore, QtGui, QtWidgets
class DialogArchName(QtWidgets.QDialog):
def __init__(self, parent=None):
super(DialogArchName, self).__init__(parent)
self.namef = ''
self.pathf = ''
label = QtWidgets.QLabel("Введите имя архива:")
self.namefield = QtWidgets.QLineEdit()
btnchoice = QtWidgets.QPushButton('Выбрать путь', clicked=self.getpath)
self.rar_arch = QtWidgets.QRadioButton('.rar')
self.zip_arch = QtWidgets.QRadioButton('.zip')
btnOk = QtWidgets.QPushButton("Архивировать", clicked=self.getname)
layout = QtWidgets.QGridLayout(self)
layout.addWidget(label, 0, 0, 1, 1)
layout.addWidget(self.rar_arch, 0, 1, 1, 1)
layout.addWidget(self.namefield, 1, 0, 1, 1)
layout.addWidget(self.zip_arch, 1, 1, 1, 1)
layout.addWidget(btnchoice, 3, 0, 1, 1) # высота, право
layout.addWidget(btnOk, 3, 1, 1, 1)
# ??? def closeEvent(self, a0: QtWidgets.QDialog.closeEvent) -> None:
# ??? QtWidgets.QDialog.closeEvent()
def closeEvent(self, event):
reply = QtWidgets.QMessageBox.question(
self,
'Информация',
'Вы уверены, что хотите закрыть Dialog?',
QtWidgets.QMessageBox.Yes,
QtWidgets.QMessageBox.No)
if reply == QtWidgets.QMessageBox.Yes:
# тут делайте что вам надо перед закрытием диалога
event.accept()
else:
event.ignore()
def getname(self):
self.namef = self.namefield.text()
# ??? self.hide()
# ??? return self.namef
def getpath(self):
self.pathf = QtWidgets.QFileDialog.getExistingDirectory()
# ??? return self.pathf
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = DialogArchName()
w.show()
sys.exit(app.exec_())
Update:
Хотя вы плохо объяснили что вам надо сделать, но я понял вашу задачу так:
main.py
...
class ExampleApp(QtWidgets.QMainWindow, front.Ui_MainWindow):
...
# архивация
def arch(self): # архивация
dirfiles = []
if self.pathFile == '':
if self.directory == '':
QtWidgets.QMessageBox.information(None, 'Ошибка', 'Выберите папку либо файл')
return # +++
else:
path = Path(self.directory)
dirfiles = [str(f.absolute()) for f in path.glob("**/*")]
else:
pass
if dirfiles:
self.dialogname.exec_()
dialogname = self.dialogname.namef
pathname = self.dialogname.pathf
if dialogname:
if pathname:
archive_name = pathname+'/'+dialogname
else:
archive_name = dialogname
else:
if pathname:
archive_name = pathname + '/' + os.path.split(self.directory)[-1]
else:
archive_name = os.path.split(self.directory)[-1]
# !!! +++
if self.dialogname.close_forcibly: # !!! +++
QtWidgets.QMessageBox.information( # !!! +++
self, # !!! +++
'Ошибка', # !!! +++
'Что-то пошло не так' # !!! +++
) # !!! +++
return # !!! +++
try:
shutil.make_archive(archive_name, 'zip', path)
#print(self.closeEvent(QtWidgets.QDialog.closeEvent))
QtWidgets.QMessageBox.information(None, 'Успех', 'Архивирование успешно завершено')
except Exception:
print(traceback.format_exc())
QtWidgets.QMessageBox.information(None, 'Ошибка', 'Что-то пошло не так')
if self.pathFile:
print(self.pathFile)
self.dialogname.exec_()
dialogname = self.dialogname.namef
pathname = self.dialogname.pathf
if dialogname:
if pathname:
archive = zipfile.ZipFile(pathname+'/'+dialogname+'.zip', 'w')
else:
archive = zipfile.ZipFile(dialogname + '.zip', 'w')
else:
if pathname:
archive = zipfile.ZipFile(pathname+'/'+os.path.split(self.pathFile[0])[-1] + '.zip', 'w')
else:
archive = zipfile.ZipFile(os.path.split(self.pathFile[0])[-1] + '.zip', 'w')
try:
for i in self.pathFile:
try:
archive.write(i, arcname=os.path.split(i)[-1], compress_type=zipfile.ZIP_DEFLATED)
except Exception:
print(traceback.format_exc())
except Exception:
QtWidgets.QMessageBox.information(None, 'Ошибка', 'Что-то пошло не так')
else:
QtWidgets.QMessageBox.information(None, 'Успех', 'Архивирование успешно завершено')
archive.close()
...
front.py
from PyQt5 import QtCore, QtGui, QtWidgets, Qt
class Ui_MainWindow():
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(300, 250)
MainWindow.setMinimumSize(QtCore.QSize(500, 230))
MainWindow.setMaximumSize(QtCore.QSize(500, 230))
MainWindow.setAutoFillBackground(False)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.btnBrowse = QtWidgets.QPushButton(self.centralwidget)
self.btnBrowse.setGeometry(QtCore.QRect(10, 0, 221, 23))
self.btnBrowse.setObjectName("btnBrowse")
self.listWidget = QtWidgets.QListWidget(self.centralwidget)
self.listWidget.setGeometry(QtCore.QRect(10, 30, 221, 151))
self.listWidget.setObjectName("listWidget")
self.btnArch = QtWidgets.QPushButton(self.centralwidget)
self.btnArch.setGeometry(QtCore.QRect(10, 185, 221, 23))
self.btnArch.setObjectName("btnArch")
self.browseArch = QtWidgets.QPushButton(self.centralwidget)
self.browseArch.setGeometry(QtCore.QRect(260, 0, 221, 23))
self.browseArch.setObjectName("browseArch")
self.exlist = QtWidgets.QListWidget(self.centralwidget)
self.exlist.setGeometry(QtCore.QRect(260, 30, 221, 151))
self.exlist.setObjectName("exlist")
self.exButton = QtWidgets.QPushButton(self.centralwidget)
self.exButton.setGeometry(QtCore.QRect(260, 185, 221, 23))
self.exButton.setObjectName("exButton")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Archivator"))
self.btnBrowse.setText(_translate("MainWindow", "Выбрать..."))
self.btnArch.setText(_translate("MainWindow", "Архивировать"))
self.browseArch.setText(_translate("MainWindow", "Выбрать архив"))
self.exButton.setText(_translate("MainWindow", "Извлечь"))
class Dialog(QtWidgets.QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
label = QtWidgets.QLabel("Выберите:")
self.rbDir = QtWidgets.QRadioButton('Папку', self)
self.rbPath = QtWidgets.QRadioButton('Файлы', self)
btnOk = QtWidgets.QPushButton("Ok", clicked=self.hide)
layout = QtWidgets.QGridLayout(self)
layout.addWidget(label, 0, 0, 1, 3)
layout.addWidget(self.rbDir, 1, 1, 1, 1)
layout.addWidget(self.rbPath, 2, 1, 1, 1)
layout.addWidget(btnOk, 3, 2, 1, 1)
class DialogArchName(QtWidgets.QDialog):
def __init__(self, parent=None):
super(DialogArchName, self).__init__(parent)
self.namef = ''
self.pathf = ''
# +++
self.close_forcibly = False # +++
label = QtWidgets.QLabel("Введите имя архива:")
self.namefield = QtWidgets.QLineEdit()
btnchoice = QtWidgets.QPushButton('Выбрать путь', clicked=self.getpath)
self.rar_arch = QtWidgets.QRadioButton('.rar')
self.zip_arch = QtWidgets.QRadioButton('.zip')
btnOk = QtWidgets.QPushButton("Архивировать", clicked=self.getname)
layout = QtWidgets.QGridLayout(self)
layout.addWidget(btnchoice, 3, 1, 1, 1) # высота, право
layout.addWidget(label, 0, 0, 1, 3)
layout.addWidget(self.namefield, 1, 1, 1, 1)
layout.addWidget(self.rar_arch, 0, 2, 3, 3)
layout.addWidget(self.zip_arch, 1, 2, 3, 3)
layout.addWidget(btnOk, 3, 2, 1, 1)
def closeEvent(self, a0: QtWidgets.QDialog.closeEvent) -> None:
# ??? QtWidgets.QDialog.closeEvent(self, a0)
# +++
self.close_forcibly = True # +++
def getname(self):
self.namef = self.namefield.text()
# +++
self.close_forcibly = False # +++
self.hide()
# ??? return self.namef
def getpath(self):
self.pathf = QtWidgets.QFileDialog.getExistingDirectory()
# ??? return self.pathf





