Installation de PyQt5 sous Linux
Pour installer PyQt5 dans la dernière version d'Ubuntu, exécutez la commande ci-dessous :
$ sudo apt installer python3-pyqt5Si vous utilisez une autre distribution Linux, recherchez le terme "Pyqt5" dans le gestionnaire de packages et installez-le à partir de là. Vous pouvez également installer PyQt5 à partir du gestionnaire de packages pip à l'aide de la commande ci-dessous :
$ pip installer pyqt5Notez que dans certaines distributions, vous devrez peut-être utiliser la commande pip3 pour installer correctement PyQt5.
Code complet
Je publie le code complet à l'avance afin que vous puissiez mieux comprendre le contexte des extraits de code individuels expliqués plus loin dans l'article. Si vous connaissez Python et PyQt5, vous pouvez simplement vous référer au code ci-dessous et ignorer l'explication.
#!/usr/bin/env python3importer le système
de PyQt5.QtWidgets importe QWidget, QApplication, QVBoxLayout, QHBoxLayout
de PyQt5.QtWidgets importent QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
de PyQt5.QtGui importer QKeySequence
de PyQt5 importer Qt
fenêtre de classe (QWidget):
def __init__(self):
super().__init__()
soi.file_path = Aucun
soi.open_new_file_shortcut = QShortcut(QKeySequence('Ctrl+O'), self)
soi.open_new_file_shortcut.activé.se connecter (se.open_new_file)
soi.save_current_file_shortcut = QShortcut(QKeySequence('Ctrl+S'), self)
soi.save_current_file_shortcut.activé.se connecter (se.save_current_file)
vbox = QVBoxLayout()
text = "Fichier sans titre"
soi.titre = QLabel(texte)
soi.Titre.setWordWrap(True)
soi.Titre.setAlignment(Qt.Qt.AlignCenter)
vbox.addWidget(self.Titre)
soi.setLayout(vbox)
soi.scrollable_text_area = QTextEdit()
vbox.addWidget(self.scrollable_text_area)
def open_new_file(self):
soi.file_path, filter_type = QFileDialog.getOpenFileName(self, "Ouvrir un nouveau fichier",
"", "Tous les fichiers (*)")
si soi.chemin du fichier:
avec open(self.file_path, "r") comme f :
contenu_fichier = f.lis()
soi.Titre.setText(self.chemin du fichier)
soi.scrollable_text_area.setText(file_contents)
autre:
soi.invalid_path_alert_message()
def save_current_file(self):
sinon soi.chemin du fichier:
new_file_path, filter_type = QFileDialog.getSaveFileName(self, "Enregistrer ce fichier
comme… ", "", "Tous les fichiers (*)")
si nouveau_chemin_fichier :
soi.chemin_fichier = nouveau_chemin_fichier
autre:
soi.invalid_path_alert_message()
retourner Faux
contenu_fichier = soi.scrollable_text_area.àTextePlain()
avec open(self.file_path, "w") comme f :
F.écrire (contenu_fichier)
soi.Titre.setText(self.chemin du fichier)
def closeEvent(self, event):
MessageBox = QMessageBox()
title = "Quitter l'application?"
message = "AVERTISSEMENT !!\n\nSi vous quittez sans enregistrer, toute modification apportée au fichier
sera perdu.\n\nEnregistrer le fichier avant de quitter?"
réponse = boîte de message.question(soi, titre, message, messageBox.Oui | messagerie.Non |
messagerie.Annuler, boîte de message.Annuler)
si réponse == boîte de message.Oui:
valeur_retour = soi.save_current_file()
si valeur_retour == Faux :
un événement.ignorer()
réponse elif == boîte de message.Non:
un événement.J'accepte()
autre:
un événement.ignorer()
def invalid_path_alert_message(self):
MessageBox = QMessageBox()
messagerie.setWindowTitle("Fichier invalide")
messagerie.setText("Le nom de fichier ou le chemin sélectionné n'est pas valide. Veuillez sélectionner un
fichier valide.")
messagerie.exec()
if __name__ == '__main__' :
app = QApplication(sys.argv)
w = Fenêtre()
w.showMaximized()
système.sortie (application.exec_())
Explication
La première partie du code importe simplement les modules qui seront utilisés tout au long de l'exemple :
importer le systèmede PyQt5.QtWidgets importe QWidget, QApplication, QVBoxLayout, QHBoxLayout
de PyQt5.QtWidgets importent QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
de PyQt5.QtGui importer QKeySequence
de PyQt5 importer Qt
Dans la partie suivante, une nouvelle classe appelée « Window » est créée qui hérite de la classe « QWidget ». La classe QWidget fournit des composants graphiques couramment utilisés dans Qt. En utilisant "super", vous pouvez vous assurer que l'objet Qt parent est renvoyé.
fenêtre de classe (QWidget):def __init__(self):
super().__init__()
Certaines variables sont définies dans la partie suivante. Le chemin du fichier est défini sur "Aucun" par défaut et les raccourcis pour ouvrir un fichier à l'aide
soi.open_new_file_shortcut = QShortcut(QKeySequence('Ctrl+O'), self)
soi.open_new_file_shortcut.activé.se connecter (se.open_new_file)
soi.save_current_file_shortcut = QShortcut(QKeySequence('Ctrl+S'), self)
soi.save_current_file_shortcut.activé.se connecter (se.save_current_file)
En utilisant la classe QVBoxLayout, une nouvelle mise en page est créée à laquelle les widgets enfants seront ajoutés. Une étiquette alignée au centre est définie pour le nom de fichier par défaut à l'aide de la classe QLabel.
vbox = QVBoxLayout()text = "Fichier sans titre"
soi.titre = QLabel(texte)
soi.Titre.setWordWrap(True)
soi.Titre.setAlignment(Qt.Qt.AlignCenter)
vbox.addWidget(self.Titre)
soi.setLayout(vbox)
Ensuite, une zone de texte est ajoutée à la mise en page à l'aide d'un objet QTextEdit. Le widget QTextEdit vous donnera une zone modifiable et défilante avec laquelle travailler. Ce widget prend en charge le copier, coller, couper, annuler, refaire, tout sélectionner, etc. Raccourcis clavier. Vous pouvez également utiliser un menu contextuel par clic droit dans la zone de texte.
soi.scrollable_text_area = QTextEdit()vbox.addWidget(self.scrollable_text_area)
La méthode "open_new_fie" est appelée lorsqu'un utilisateur termine
soi.file_path, filter_type = QFileDialog.getOpenFileName(self, "Ouvrir un nouveau fichier", "",
"Tous les fichiers (*)")
si soi.chemin du fichier:
avec open(self.file_path, "r") comme f :
contenu_fichier = f.lis()
soi.Titre.setText(self.chemin du fichier)
soi.scrollable_text_area.setText(file_contents)
autre:
soi.invalid_path_alert_message()
La méthode "save_current_file" est appelée chaque fois qu'un utilisateur termine
sinon soi.chemin du fichier:
new_file_path, filter_type = QFileDialog.getSaveFileName(self, "Enregistrer ce fichier
comme… ", "", "Tous les fichiers (*)")
si nouveau_chemin_fichier :
soi.chemin_fichier = nouveau_chemin_fichier
autre:
soi.invalid_path_alert_message()
retourner Faux
contenu_fichier = soi.scrollable_text_area.àTextePlain()
avec open(self.file_path, "w") comme f :
F.écrire (contenu_fichier)
soi.Titre.setText(self.chemin du fichier)
La méthode "closeEvent" fait partie de l'API de gestion des événements PyQt5. Cette méthode est appelée chaque fois qu'un utilisateur essaie de fermer une fenêtre à l'aide du bouton croix ou en appuyant sur
MessageBox = QMessageBox()
title = "Quitter l'application?"
message = "AVERTISSEMENT !!\n\nSi vous quittez sans enregistrer, toute modification apportée au fichier sera
être perdu.\n\nEnregistrer le fichier avant de quitter?"
réponse = boîte de message.question(soi, titre, message, messageBox.Oui | messagerie.Non |
messagerie.Annuler, boîte de message.Annuler)
si réponse == boîte de message.Oui:
valeur_retour = soi.save_current_file()
si valeur_retour == Faux :
un événement.ignorer()
réponse elif == boîte de message.Non:
un événement.J'accepte()
autre:
un événement.ignorer()
La boîte d'alerte « fichier invalide » n'a pas de cloches et de sifflets. Il transmet simplement le message que le chemin du fichier n'a pas pu être déterminé.
def invalid_path_alert_message(self):MessageBox = QMessageBox()
messagerie.setWindowTitle("Fichier invalide")
messagerie.setText("Le nom de fichier ou le chemin sélectionné n'est pas valide. Veuillez sélectionner un fichier valide.")
messagerie.exec()
Enfin, la boucle d'application principale pour la gestion des événements et le dessin des widgets est démarrée en utilisant le ".méthode exec_()".
if __name__ == '__main__' :app = QApplication(sys.argv)
w = Fenêtre()
w.showMaximized()
système.sortie (application.exec_())
Exécuter l'application
Enregistrez simplement le code complet dans un fichier texte, définissez l'extension de fichier sur ".py", marquez le fichier exécutable et exécutez-le pour lancer l'application. Par exemple, si le nom du fichier est "simple_text_editor.py", vous devez exécuter les deux commandes suivantes :
$ chmod +x simple_text_editor.py$ ./simple_text_editor.py
Ce que vous pouvez faire pour améliorer le code
Le code expliqué ci-dessus fonctionne bien pour un éditeur de texte simple. Cependant, il peut ne pas être utile à des fins pratiques car il manque de nombreuses fonctionnalités couramment vues dans les bons éditeurs de texte. Vous pouvez améliorer le code en ajoutant de nouvelles fonctionnalités telles que les numéros de ligne, la mise en évidence de ligne, la mise en évidence de la syntaxe, plusieurs onglets, l'enregistrement de session, la barre d'outils, les menus déroulants, la détection de changement de tampon, etc.
Conclusion
Cet article se concentre principalement sur la fourniture d'un point de départ pour la création d'applications PyQt. Si vous trouvez des erreurs dans le code ou si vous souhaitez suggérer quelque chose, vos commentaires sont les bienvenus.