Pitón

Cómo escribir un editor de texto simple en PyQt5

Cómo escribir un editor de texto simple en PyQt5
Este artículo cubrirá una guía sobre cómo crear un editor de texto simple en Python3 y PyQt5. Qt5 es un conjunto de bibliotecas multiplataforma escritas en C ++, que se utiliza principalmente para crear aplicaciones gráficas enriquecidas. PyQt5 proporciona enlaces de Python para la última versión de Qt5. Todos los ejemplos de código de este artículo se prueban con Python 3.8.2 y PyQt5 versión 5.14.1 en Ubuntu 20.04.

Instalación de PyQt5 en Linux

Para instalar PyQt5 en la última versión de Ubuntu, ejecute el siguiente comando:

$ sudo apt install python3-pyqt5

Si está utilizando cualquier otra distribución de Linux, busque el término "Pyqt5" ​​en el administrador de paquetes e instálelo desde allí. Alternativamente, puede instalar PyQt5 desde el administrador de paquetes pip usando el siguiente comando:

$ pip instalar pyqt5

Tenga en cuenta que en algunas distribuciones, es posible que deba usar el comando pip3 para instalar correctamente PyQt5.

Código completo

Estoy publicando el código completo de antemano para que pueda comprender mejor el contexto de los fragmentos de código individuales que se explican más adelante en el artículo. Si está familiarizado con Python y PyQt5, puede consultar el código a continuación y omitir la explicación.

#!/ usr / bin / env python3
importar sys
de PyQt5.QtWidgets importan QWidget, QApplication, QVBoxLayout, QHBoxLayout
de PyQt5.QtWidgets importan QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
de PyQt5.Importación de QtGui QKeySequence
desde PyQt5 importar Qt
ventana de clase (QWidget):
def __init __ (yo):
súper().__en eso__()
uno mismo.file_path = Ninguno
uno mismo.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), self)
uno mismo.open_new_file_shortcut.activado.conectar (uno mismo.open_new_file)
uno mismo.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), self)
uno mismo.save_current_file_shortcut.activado.conectar (uno mismo.save_current_file)
vbox = QVBoxLayout ()
text = "Archivo sin título"
uno mismo.title = QLabel (texto)
uno mismo.título.setWordWrap (Verdadero)
uno mismo.título.setAlignment (Qt.Qt.Alinear al centro)
vbox.addWidget (self.título)
uno mismo.setLayout (vbox)
uno mismo.scrollable_text_area = QTextEdit ()
vbox.addWidget (self.scrollable_text_area)
def open_new_file (auto):
uno mismo.file_path, filter_type = QFileDialog.getOpenFileName (self, "Abrir archivo nuevo",
"", "Todos los archivos (*)")
si yo mismo.ruta de archivo:
con abierto (yo.file_path, "r") como f:
file_contents = f.leer()
uno mismo.título.setText (self.ruta de archivo)
uno mismo.scrollable_text_area.setText (file_contents)
demás:
uno mismo.inválido_ruta_mensaje_de_alerta ()
def save_current_file (auto):
si no soy yo.ruta de archivo:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Guardar este archivo
como… "," "," Todos los archivos (*) ")
si new_file_path:
uno mismo.file_path = new_file_path
demás:
uno mismo.inválido_ruta_mensaje_de_alerta ()
falso retorno
file_contents = self.scrollable_text_area.toPlainText ()
con abierto (yo.file_path, "w") como f:
F.escribir (file_contents)
uno mismo.título.setText (self.ruta de archivo)
def closeEvent (self, event):
messageBox = QMessageBox ()
title = "Salir de la aplicación?"
message = "ADVERTENCIA !!\ n \ nSi sale sin guardar, cualquier cambio realizado en el archivo
se perderá.\ n \ nGuardar el archivo antes de salir?"
respuesta = messageBox.pregunta (yo, título, mensaje, messageBox.Si | buzon de mensaje.No |
buzon de mensaje.Cancelar, messageBox.Cancelar)
si respuesta == messageBox.Sí:
return_value = self.save_current_file ()
si return_value == False:
evento.ignorar()
respuesta elif == messageBox.No:
evento.aceptar()
demás:
evento.ignorar()
def mensaje_alerta_ruta_invalida (auto):
messageBox = QMessageBox ()
buzon de mensaje.setWindowTitle ("Archivo no válido")
buzon de mensaje.setText ("El nombre de archivo o la ruta seleccionados no son válidos. Por favor seleccione un
archivo valido.")
buzon de mensaje.ejecutivo ()
if __name__ == '__main__':
app = QApplication (sys.argv)
w = Ventana ()
w.showMaximized ()
sys.salir (aplicación.exec_ ())

Explicación

La primera parte del código solo importa módulos que se usarán en toda la muestra:

importar sys
de PyQt5.QtWidgets importan QWidget, QApplication, QVBoxLayout, QHBoxLayout
de PyQt5.QtWidgets importan QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
de PyQt5.Importación de QtGui QKeySequence
desde PyQt5 importar Qt

En la siguiente parte, se crea una nueva clase llamada "Ventana" que hereda de la clase "QWidget". La clase QWidget proporciona componentes gráficos de uso común en Qt. Al usar "super", puede asegurarse de que se devuelva el objeto Qt principal.

ventana de clase (QWidget):
def __init __ (yo):
súper().__en eso__()

Algunas variables se definen en la siguiente parte. La ruta del archivo está configurada en "Ninguno" de forma predeterminada y los accesos directos para abrir un archivo usando y guardar un archivo usando se definen mediante la clase QShortcut. Estos atajos luego se conectan a sus respectivos métodos que se llaman cada vez que un usuario presiona las combinaciones de teclas definidas.

uno mismo.file_path = Ninguno
uno mismo.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), self)
uno mismo.open_new_file_shortcut.activado.conectar (uno mismo.open_new_file)
uno mismo.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), self)
uno mismo.save_current_file_shortcut.activado.conectar (uno mismo.save_current_file)

Usando la clase QVBoxLayout, se crea un nuevo diseño al que se agregarán widgets secundarios. Se establece una etiqueta alineada al centro para el nombre de archivo predeterminado usando la clase QLabel.

vbox = QVBoxLayout ()
text = "Archivo sin título"
uno mismo.title = QLabel (texto)
uno mismo.título.setWordWrap (Verdadero)
uno mismo.título.setAlignment (Qt.Qt.Alinear al centro)
vbox.addWidget (self.título)
uno mismo.setLayout (vbox)

A continuación, se agrega un área de texto al diseño usando un objeto QTextEdit. El widget QTextEdit le dará un área editable y desplazable para trabajar. Este widget admite copiar, pegar, cortar, deshacer, rehacer, seleccionar todo, etc. atajos de teclado. También puede utilizar un menú contextual del botón derecho del ratón dentro del área de texto.

uno mismo.scrollable_text_area = QTextEdit ()
vbox.addWidget (self.scrollable_text_area)

El método "open_new_fie" se llama cuando un usuario completa atajo de teclado. La clase QFileDialog presenta al usuario un cuadro de diálogo de selector de archivos. La ruta del archivo se determina después de que un usuario selecciona un archivo del selector. Si la ruta del archivo es válida, el contenido de texto se lee del archivo y se establece en el widget QTextEdit. Esto hace que el texto sea visible para el usuario, cambia el título al nuevo nombre de archivo y completa el proceso de apertura de un nuevo archivo. Si por alguna razón no se puede determinar la ruta del archivo, se muestra al usuario un cuadro de alerta de "archivo no válido".

def open_new_file (auto):
uno mismo.file_path, filter_type = QFileDialog.getOpenFileName (self, "Abrir archivo nuevo", "",
"Todos los archivos (*)")
si yo mismo.ruta de archivo:
con abierto (yo.file_path, "r") como f:
file_contents = f.leer()
uno mismo.título.setText (self.ruta de archivo)
uno mismo.scrollable_text_area.setText (file_contents)
demás:
uno mismo.inválido_ruta_mensaje_alerta ()

El método "save_current_file" se llama cada vez que un usuario completa atajo de teclado. En lugar de recuperar una nueva ruta de archivo, QFileDialog ahora le pide al usuario que proporcione una ruta. Si la ruta del archivo es válida, el contenido visible en el widget QTextEdit se escribe en la ruta completa del archivo; de lo contrario, se muestra un cuadro de alerta de "archivo no válido". El título del archivo que se está editando actualmente también se cambia a la nueva ubicación proporcionada por el usuario.

def save_current_file (auto):
si no soy yo.ruta de archivo:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Guardar este archivo
como… "," "," Todos los archivos (*) ")
si new_file_path:
uno mismo.file_path = new_file_path
demás:
uno mismo.inválido_ruta_mensaje_alerta ()
falso retorno
file_contents = self.scrollable_text_area.toPlainText ()
con abierto (yo.file_path, "w") como f:
F.escribir (file_contents)
uno mismo.título.setText (self.ruta de archivo)

El método "closeEvent" es parte de la API de manejo de eventos PyQt5. Este método se llama cada vez que un usuario intenta cerrar una ventana usando el botón de cruz o presionando combinación de teclas. Al disparar el evento de cierre, se muestra al usuario un cuadro de diálogo con tres opciones: "Sí", "No" y "Cancelar". El botón "Sí" guarda el archivo y cierra la aplicación mientras que el botón "No" cierra el archivo sin guardar el contenido. El botón "Cancelar" cierra el cuadro de diálogo y lleva al usuario a la aplicación.

def closeEvent (self, event):
messageBox = QMessageBox ()
title = "Salir de la aplicación?"
message = "ADVERTENCIA !!\ n \ nSi sale sin guardar, cualquier cambio realizado en el archivo
estar perdido.\ n \ nGuardar el archivo antes de salir?"
respuesta = messageBox.pregunta (yo, título, mensaje, messageBox.Si | buzon de mensaje.No |
buzon de mensaje.Cancelar, messageBox.Cancelar)
si respuesta == messageBox.Sí:
return_value = self.save_current_file ()
si return_value == False:
evento.ignorar()
respuesta elif == messageBox.No:
evento.aceptar()
demás:
evento.ignorar()

El cuadro de alerta de "archivo no válido" no tiene campanas y silbatos. Simplemente transmite el mensaje de que no se pudo determinar la ruta del archivo.

def mensaje_alerta_ruta_invalida (auto):
messageBox = QMessageBox ()
buzon de mensaje.setWindowTitle ("Archivo no válido")
buzon de mensaje.setText ("El nombre de archivo o la ruta seleccionados no son válidos. Seleccione un archivo válido.")
buzon de mensaje.ejecutivo ()

Por último, el bucle principal de la aplicación para el manejo de eventos y el dibujo de widgets se inicia mediante el uso de ".método exec_ () ”.

if __name__ == '__main__':
app = QApplication (sys.argv)
w = Ventana ()
w.showMaximized ()
sys.salir (aplicación.exec_ ())

Ejecutando la aplicación

Simplemente guarde el código completo en un archivo de texto, establezca la extensión del archivo en ".py ”, marque el archivo como ejecutable y ejecútelo para iniciar la aplicación. Por ejemplo, si el nombre del archivo es "simple_text_editor.py ”, debe ejecutar los siguientes dos comandos:

$ chmod + x editor_texto_simple.py
PS ./ simple_text_editor.py

Cosas que puede hacer para mejorar el código

El código explicado anteriormente funciona bien para un editor de texto básico. Sin embargo, puede que no sea útil para fines prácticos, ya que carece de muchas características que se ven comúnmente en buenos editores de texto. Puede mejorar el código agregando nuevas características como números de línea, resaltado de línea, resaltado de sintaxis, múltiples pestañas, guardado de sesión, barra de herramientas, menús desplegables, detección de cambio de búfer, etc.

Conclusión

Este artículo se centra principalmente en proporcionar un punto de partida para la creación de aplicaciones PyQt. Si encuentra errores en el código o quiere sugerir algo, los comentarios son bienvenidos.

Vulkan para usuarios de Linux
Con cada nueva generación de tarjetas gráficas, vemos que los desarrolladores de juegos superan los límites de la fidelidad gráfica y se acercan un pa...
OpenTTD frente a Simutrans
Crear su propia simulación de transporte puede ser divertido, relajante y extremadamente atractivo. Es por eso que debes asegurarte de probar tantos j...
Tutorial de OpenTTD
OpenTTD es uno de los juegos de simulación empresarial más populares que existen. En este juego, necesitas crear un maravilloso negocio de transporte....