Загрузка данных


from PyQt6.QtWidgets import *
import sys
from NotePad import *
from PyQt6.QtPrintSupport import *
from PyQt6.QtGui import *
from PyQt6.QtCore import Qt


class NotePadWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()

        self.actionSave.triggered.connect(self.save_file)
        self.actionNew.triggered.connect(self.file_new)
        self.actionCopes.triggered.connect(self.open_file)
        self.actionPrint.triggered.connect(self.priview_dialog)
        self.actionPrint_2.triggered.connect(self.print_file)
        self.actionUndo.triggered.connect(self.textEdit.undo)
        self.actionRedo.triggered.connect(self.textEdit.redo)
        self.actionExport_PDF.triggered.connect(self.export_pdf)
        self.actionQuite.triggered.connect(self.close)

        # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 12:
        # Подключаем команды меню Edit к встроенным функциям QTextEdit.
        # При нажатии Cut выделенный текст вырезается, Copy — копируется,
        # Paste — вставляется из буфера обмена.
        self.actionCut.triggered.connect(self.textEdit.cut)
        self.actionCopy.triggered.connect(self.textEdit.copy)
        self.actionPaste.triggered.connect(self.textEdit.paste)

        # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 13:
        # Подключаем команды форматирования к отдельным методам ниже.
        self.actionBold.triggered.connect(self.text_bold)
        self.actionItalic.triggered.connect(self.text_italic)
        self.actionUnderline.triggered.connect(self.text_underline)

        # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 14:
        # Подключаем пункты Left, Right и Center к функциям выравнивания.
        # При нажатии на пункт абзац в textEdit выравнивается указанным способом.
        self.actionLeft.triggered.connect(self.align_left)
        self.actionRight.triggered.connect(self.align_right)
        self.actionCenter.triggered.connect(self.align_center)

        # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 14:
        # Подключаем пункт justifi к функции justify(), как в уроке.
        self.actionjustifi.triggered.connect(self.justify)

        # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 15:
        # Подключаем пункт Font к диалогу выбора шрифта.
        # При нажатии на Font будет вызвана функция font_dialog().
        self.actionFont.triggered.connect(self.font_dialog)

        # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 15:
        # Подключаем пункт Color к диалогу выбора цвета текста.
        # При нажатии на Color будет вызвана функция color_dialog().
        self.actionColor.triggered.connect(self.color_dialog)

    def closeEvent(self, event):
        if self.mayby_save():
            event.accept()
        else:
            event.ignore()

    def mayby_save(self):
        if not self.textEdit.document().isModified():
            return True

        ret = QMessageBox.warning(
            self,
            'Application',
            'The document has been modified. Do you want to save it?',
            QMessageBox.StandardButton.Save
            | QMessageBox.StandardButton.Discard
            | QMessageBox.StandardButton.Cancel,
        )

        if ret == QMessageBox.StandardButton.Save:
            return self.save_file()
        if ret == QMessageBox.StandardButton.Cancel:
            return False
        return True

    def save_file(self):
        filename, _ = QFileDialog.getSaveFileName(
            self, 'Save File', '', 'Text Files (*.txt);;All Files (*)'
        )
        if filename:
            with open(filename, 'w', encoding='utf-8') as f:
                text = self.textEdit.toPlainText()
                f.write(text)
            QMessageBox.about(self, 'File Saved', 'File Saved')
            self.textEdit.document().setModified(False)
            return True
        return False

    def file_new(self):
        if self.mayby_save():
            self.textEdit.clear()
            self.textEdit.document().setModified(False)

    def open_file(self):
        fname, _ = QFileDialog.getOpenFileName(
            self, 'Open File', '', 'Text Files (*.txt);;All Files (*)'
        )
        if fname:
            with open(fname, 'r', encoding='utf-8') as f:
                data = f.read()
            self.textEdit.setText(data)
            self.textEdit.document().setModified(False)

    def print_file(self):
        printer = QPrinter(QPrinter.PrinterMode.HighResolution)
        dialog = QPrintDialog(printer, self)
        if dialog.exec() == QPrintDialog.DialogCode.Accepted:
            getattr(self.textEdit, "print")(printer)

    def priview_dialog(self):
        printer = QPrinter(QPrinter.PrinterMode.HighResolution)
        preview_dialog = QPrintPreviewDialog(printer, self)
        preview_dialog.paintRequested.connect(self.print_preview)
        preview_dialog.exec()

    def print_preview(self, printer):
        getattr(self.textEdit, "print")(printer)

    def export_pdf(self):
        filename, _ = QFileDialog.getSaveFileName(
            self, 'Export PDF', '', 'PDF Files (*.pdf)'
        )
        if filename:
            writer = QPdfWriter(filename)
            writer.setPageSize(QPdfWriter.PageSize.A4)
            getattr(self.textEdit, "print")(writer)
            QMessageBox.about(self, 'Success', 'File exported to PDF successfully')

    # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 13:
    # Создаём формат с жирным начертанием и применяем его к текущему выделению.
    def text_bold(self):
        font = QFont()
        font.setBold(True)
        self.textEdit.setCurrentFont(font)

    # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 13:
    # Создаём формат курсивного начертания и применяем его к текущему выделению.
    def text_italic(self):
        font = QFont()
        font.setItalic(True)
        self.textEdit.setCurrentFont(font)

    # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 13:
    # Включаем подчёркивание для текущего выделения или текста, который будут вводить.
    def text_underline(self):
        font = QFont()
        font.setUnderline(True)
        self.textEdit.setCurrentFont(font)

    # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 14:
    # Устанавливаем выравнивание текста по левому краю.
    # Qt.AlignmentFlag.AlignLeft — встроенный флаг Qt для левого выравнивания.
    def align_left(self):
        self.textEdit.setAlignment(Qt.AlignmentFlag.AlignLeft)

    # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 14:
    # Устанавливаем выравнивание текста по правому краю.
    # Qt.AlignmentFlag.AlignRight — встроенный флаг Qt для правого выравнивания.
    def align_right(self):
        self.textEdit.setAlignment(Qt.AlignmentFlag.AlignRight)

    # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 14:
    # Размещаем текст по центру абзаца с помощью встроенного флага AlignCenter.
    def align_center(self):
        self.textEdit.setAlignment(Qt.AlignmentFlag.AlignCenter)

    # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 14:
    # Выравниваем текущий абзац по ширине, используя AlignJustify.
    def justify(self):
        self.textEdit.setAlignment(Qt.AlignmentFlag.AlignJustify)

    # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 15:
    # Открываем стандартное окно выбора шрифта.
    # QFontDialog.getFont() возвращает выбранный шрифт и значение ok.
    # Если пользователь подтвердил выбор (ok == True), применяем шрифт
    # к выделенному тексту или к тексту, который будет вводиться дальше.
    def font_dialog(self):
        font, ok = QFontDialog.getFont()
        if ok:
            self.textEdit.setCurrentFont(font)

    # ДОБАВЛЕНО ПО ВИДЕОУРОКУ 15:
    # Открываем стандартное окно выбора цвета.
    # Если выбранный цвет действителен, применяем его к тексту в textEdit.
    # Если пользователь отменил выбор, цвет не меняется.
    def color_dialog(self):
        color = QColorDialog.getColor()
        if color.isValid():
            self.textEdit.setTextColor(color)


app = QApplication(sys.argv)
Note = NotePadWindow()
sys.exit(app.exec())