from PyQt6.QtWidgets import * from PyQt6.QtGui import QKeySequence, QAction class MainWindow(QMainWindow): def closeEvent(self, e): if not text.document().isModified(): return answer = QMessageBox.question( window, None, "You have unsaved changes. Save before closing?", QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel ) if answer & QMessageBox.Save: save() if text.document().isModified(): # This happens when the user closes the Save As... dialog. # We do not want to close the window in this case because it # would throw away unsaved changes. e.ignore() elif answer & QMessageBox.Cancel: e.ignore() app = QApplication([]) app.setApplicationName("Text Editor") text = QPlainTextEdit() window = MainWindow() window.setCentralWidget(text) file_path = None menu = window.menuBar().addMenu("&File") open_action = QAction("&Open") def open_file(): global file_path path = QFileDialog.getOpenFileName(window, "Open")[0] if path: text.setPlainText(open(path).read()) file_path = path open_action.triggered.connect(open_file) open_action.setShortcut(QKeySequence.StandardKey.Open) menu.addAction(open_action) save_action = QAction("&Save") def save(): if file_path is None: save_as() else: with open(file_path, "w") as f: f.write(text.toPlainText()) text.document().setModified(False) save_action.triggered.connect(save) save_action.setShortcut(QKeySequence.StandardKey.Save) menu.addAction(save_action) save_as_action = QAction("Save &As...") def save_as(): global file_path path = QFileDialog.getSaveFileName(window, "Save As")[0] if path: file_path = path save() save_as_action.triggered.connect(save_as) menu.addAction(save_as_action) close = QAction("&Close") close.triggered.connect(window.close) menu.addAction(close) help_menu = window.menuBar().addMenu("&Help") about_action = QAction("&About") help_menu.addAction(about_action) def show_about_dialog(): text = "
" \ "

Text Editor

" \ "⁣" \ "" \ "
" \ "

Version 31.4.159.265358
" \ "Copyright © Company Inc.

" QMessageBox.about(window, "About Text Editor", text) about_action.triggered.connect(show_about_dialog) window.show() app.exec()