Creando NotePad usando PyQt5 – Python

En este artículo veremos cómo podemos crear un bloc de notas usando PyQt5.
El Bloc de notas es un editor de texto genérico que le permite crear, abrir, editar y leer archivos de texto sin formato.
PyQt5 es un kit de herramientas GUI multiplataforma, un conjunto de enlaces de Python para Qt v5. Uno puede desarrollar una aplicación de escritorio interactiva con tanta facilidad debido a las herramientas y la simplicidad que ofrece esta biblioteca.
Use este comando para instalar PyQt5:
 

pip install PyQt5

Pasos de implementación de GUI: 
1. Cree un diseño vertical 
2. Cree un objeto QPlainTextEdit y agréguelo al diseño 
3. Cree un contenedor, es decir, un objeto QWidget 
4. Establezca este diseño vertical en el contenedor 
5. Cree una barra de estado para mostrar consejos de estado 
6 Crear barra de menú de archivo y agregar acciones de archivo a continuación es cómo se verá la barra de menú de archivo
 

7. Cree una barra de menú de edición y agréguele varias acciones de edición, a continuación se muestra cómo se verá la barra de menú de edición
 

8. Cree dos barras de herramientas para acciones de archivo y edición, a continuación se muestra cómo se verán las barras de herramientas
 

Pasos de implementación de back-end: 
1. Cree una variable de ruta y configúrela en Ninguno 
2. Agregue acciones a cada una de las acciones del menú de archivo, estas son las mismas acciones de la barra de herramientas, ya que ambas comparten las mismas acciones 
3. Cree un método crítico que muestre el valor pasado en la ventana emergente, se utiliza para mostrar si se produce algún error al guardar o abrir el archivo 
4. Cree un método de título de actualización que cambie el título de la ventana de acuerdo con el nombre del archivo 
5. Dentro de la acción de abrir archivo, cree un bloque de prueba y excepción que intente abrir el archivo y luego actualice el título y la ruta 
6. Dentro de la acción de guardar, si la ruta no es ninguna, llame al método Guardar como; de lo contrario, guarde el archivo en la ruta 
7. Dentro del método Guardar como, guarde el archivo en la ruta seleccionada por el usuario 
8. Dentro de la acción de impresión, imprima el archivo usando el objeto QPrintDialog 
9. Dentro de la acción de la barra de alternancia de edición, configure el modo de ajuste de línea del editor de acuerdo con el estado marcado 
10. De manera similar, configure la acción para deshacer, rehacer, cortar, copiar, pegar y seleccionar todo utilizando las funciones integradas del objeto QPlainTextEdit 
 

A continuación se muestra la implementación. 
 

Python3

# importing required libraries
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtPrintSupport import *
import os
import sys
 
# Creating main window class
class MainWindow(QMainWindow):
 
    # constructor
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
 
        # setting window geometry
        self.setGeometry(100, 100, 600, 400)
 
        # creating a layout
        layout = QVBoxLayout()
 
        # creating a QPlainTextEdit object
        self.editor = QPlainTextEdit()
 
        # setting font to the editor
        fixedfont = QFontDatabase.systemFont(QFontDatabase.FixedFont)
        fixedfont.setPointSize(12)
        self.editor.setFont(fixedfont)
 
        # self.path holds the path of the currently open file.
        # If none, we haven't got a file open yet (or creating new).
        self.path = None
 
        # adding editor to the layout
        layout.addWidget(self.editor)
 
        # creating a QWidget layout
        container = QWidget()
 
        # setting layout to the container
        container.setLayout(layout)
 
        # making container as central widget
        self.setCentralWidget(container)
 
        # creating a status bar object
        self.status = QStatusBar()
 
        # setting stats bar to the window
        self.setStatusBar(self.status)
 
        # creating a file tool bar
        file_toolbar = QToolBar("File")
 
        # adding file tool bar to the window
        self.addToolBar(file_toolbar)
 
        # creating a file menu
        file_menu = self.menuBar().addMenu("&File")
 
        # creating actions to add in the file menu
        # creating a open file action
        open_file_action = QAction("Open file", self)
 
        # setting status tip
        open_file_action.setStatusTip("Open file")
 
        # adding action to the open file
        open_file_action.triggered.connect(self.file_open)
 
        # adding this to file menu
        file_menu.addAction(open_file_action)
 
        # adding this to tool bar
        file_toolbar.addAction(open_file_action)
 
        # similarly creating a save action
        save_file_action = QAction("Save", self)
        save_file_action.setStatusTip("Save current page")
        save_file_action.triggered.connect(self.file_save)
        file_menu.addAction(save_file_action)
        file_toolbar.addAction(save_file_action)
 
        # similarly creating save action
        saveas_file_action = QAction("Save As", self)
        saveas_file_action.setStatusTip("Save current page to specified file")
        saveas_file_action.triggered.connect(self.file_saveas)
        file_menu.addAction(saveas_file_action)
        file_toolbar.addAction(saveas_file_action)
 
        # for print action
        print_action = QAction("Print", self)
        print_action.setStatusTip("Print current page")
        print_action.triggered.connect(self.file_print)
        file_menu.addAction(print_action)
        file_toolbar.addAction(print_action)
 
        # creating another tool bar for editing text
        edit_toolbar = QToolBar("Edit")
 
        # adding this tool bar to the main window
        self.addToolBar(edit_toolbar)
 
        # creating a edit menu bar
        edit_menu = self.menuBar().addMenu("&Edit")
 
        # adding actions to the tool bar and menu bar
 
        # undo action
        undo_action = QAction("Undo", self)
        # adding status tip
        undo_action.setStatusTip("Undo last change")
 
        # when triggered undo the editor
        undo_action.triggered.connect(self.editor.undo)
 
        # adding this to tool and menu bar
        edit_toolbar.addAction(undo_action)
        edit_menu.addAction(undo_action)
 
        # redo action
        redo_action = QAction("Redo", self)
        redo_action.setStatusTip("Redo last change")
 
        # when triggered redo the editor
        redo_action.triggered.connect(self.editor.redo)
 
        # adding this to menu and tool bar
        edit_toolbar.addAction(redo_action)
        edit_menu.addAction(redo_action)
 
        # cut action
        cut_action = QAction("Cut", self)
        cut_action.setStatusTip("Cut selected text")
 
        # when triggered cut the editor text
        cut_action.triggered.connect(self.editor.cut)
 
        # adding this to menu and tool bar
        edit_toolbar.addAction(cut_action)
        edit_menu.addAction(cut_action)
 
        # copy action
        copy_action = QAction("Copy", self)
        copy_action.setStatusTip("Copy selected text")
 
        # when triggered copy the editor text
        copy_action.triggered.connect(self.editor.copy)
 
        # adding this to menu and tool bar
        edit_toolbar.addAction(copy_action)
        edit_menu.addAction(copy_action)
 
        # paste action
        paste_action = QAction("Paste", self)
        paste_action.setStatusTip("Paste from clipboard")
 
        # when triggered paste the copied text
        paste_action.triggered.connect(self.editor.paste)
 
        # adding this to menu and tool bar
        edit_toolbar.addAction(paste_action)
        edit_menu.addAction(paste_action)
 
        # select all action
        select_action = QAction("Select all", self)
        select_action.setStatusTip("Select all text")
 
        # when this triggered select the whole text
        select_action.triggered.connect(self.editor.selectAll)
 
        # adding this to menu and tool bar
        edit_toolbar.addAction(select_action)
        edit_menu.addAction(select_action)
 
 
        # wrap action
        wrap_action = QAction("Wrap text to window", self)
        wrap_action.setStatusTip("Check to wrap text to window")
 
        # making it checkable
        wrap_action.setCheckable(True)
 
        # making it checked
        wrap_action.setChecked(True)
 
        # adding action
        wrap_action.triggered.connect(self.edit_toggle_wrap)
 
        # adding it to edit menu not to the tool bar
        edit_menu.addAction(wrap_action)
 
        # calling update title method
        self.update_title()
 
        # showing all the components
        self.show()
 
    # creating dialog critical method
    # to show errors
    def dialog_critical(self, s):
 
        # creating a QMessageBox object
        dlg = QMessageBox(self)
 
        # setting text to the dlg
        dlg.setText(s)
 
        # setting icon to it
        dlg.setIcon(QMessageBox.Critical)
 
        # showing it
        dlg.show()
 
    # action called by file open action
    def file_open(self):
 
        # getting path and bool value
        path, _ = QFileDialog.getOpenFileName(self, "Open file", "",
                             "Text documents (*.txt);All files (*.*)")
 
        # if path is true
        if path:
            # try opening path
            try:
                with open(path, 'rU') as f:
                    # read the file
                    text = f.read()
 
            # if some error occurred
            except Exception as e:
 
                # show error using critical method
                self.dialog_critical(str(e))
            # else
            else:
                # update path value
                self.path = path
 
                # update the text
                self.editor.setPlainText(text)
 
                # update the title
                self.update_title()
 
    # action called by file save action
    def file_save(self):
 
        # if there is no save path
        if self.path is None:
 
            # call save as method
            return self.file_saveas()
 
        # else call save to path method
        self._save_to_path(self.path)
 
    # action called by save as action
    def file_saveas(self):
 
        # opening path
        path, _ = QFileDialog.getSaveFileName(self, "Save file", "",
                             "Text documents (*.txt);All files (*.*)")
 
        # if dialog is cancelled i.e no path is selected
        if not path:
            # return this method
            # i.e no action performed
            return
 
        # else call save to path method
        self._save_to_path(path)
 
    # save to path method
    def _save_to_path(self, path):
 
        # get the text
        text = self.editor.toPlainText()
 
        # try catch block
        try:
 
            # opening file to write
            with open(path, 'w') as f:
 
                # write text in the file
                f.write(text)
 
        # if error occurs
        except Exception as e:
 
            # show error using critical
            self.dialog_critical(str(e))
 
        # else do this
        else:
            # change path
            self.path = path
            # update the title
            self.update_title()
 
    # action called by print
    def file_print(self):
 
        # creating a QPrintDialog
        dlg = QPrintDialog()
 
        # if executed
        if dlg.exec_():
 
            # print the text
            self.editor.print_(dlg.printer())
 
    # update title method
    def update_title(self):
 
        # setting window title with prefix as file name
        # suffix aas PyQt5 Notepad
        self.setWindowTitle("%s - PyQt5 Notepad" %(os.path.basename(self.path)
                                                  if self.path else "Untitled"))
 
    # action called by edit toggle
    def edit_toggle_wrap(self):
 
        # chaining line wrap mode
        self.editor.setLineWrapMode(1 if self.editor.lineWrapMode() == 0 else 0 )
 
 
# drivers code
if __name__ == '__main__':
 
    # creating PyQt5 application
    app = QApplication(sys.argv)
 
    # setting application name
    app.setApplicationName("PyQt5-Note")
 
    # creating a main window object
    window = MainWindow()
 
    # loop
    app.exec_()

Producción : 
 

Publicación traducida automáticamente

Artículo escrito por rakshitarora y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *