Instalación de PyQt5 en Linux
Para instalar PyQt5 en la última versión de Ubuntu, ejecute el siguiente comando:
$ sudo apt install python3-pyqt5Si 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 pyqt5Tenga 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 python3importar 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 sysde 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
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
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
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
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.pyPS ./ 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.