Exercice 21
On souhaite créer une application graphique PyQt5 Python qui permet d'afficher la liste des nombres premiers jumeaux qui sont inférieur ou égaux à un entier donné n. A cet effet, Nous procédons à la création de la fenêtre graphique qui réalise l'application via l'outil graphique visuel Qt Designer. La fenêtre demande à l'utilisateur d'entrer la valeur de l'entier n et puis de cliquer sur le bouton 'Validate', elle lui affiche la liste des nombres premiers jumeaux inférieurs ou égaux à l'entier n saisie comme le montre la figure ci-dessous:
Rappel : Deux nombres p et q sont dit premiers jumeaux s'ils sont tous les deux premiers et leurs différences est q - p = 2.
1) - Créer l'interface graphique sous le nom library.ui en respectant le nommage suivant:
- lineEdite_n : désigne le nom du champ de saisie
- textEdit_list_jumeaux : nom du widget QTextEdit qui affiche la liste des couples de nombres premiers jumeaux (liste en bleu)
- btn_validate : nom du bouton 'Validate' qui valide l'action
- btn_cancel : nom du bouton 'Annuler ' qui annule l'opération
2) - Transformer le fichier graphique library.ui en un fichier Python library.py à l'aide de la commande cmd:
pyuic5 -x library.ui -o library.py
3) - Créer un script python sous forme de fonction qui prend en entrée un entier n et qui renvoie la liste des nombres premiers de Sophie German qui sont inférieurs ou égaux à n.
4) - Créer un fichier python main.py dans lequel importer le contenu du fichier library.py et y ajouter le code de bouton de commande 'btn_validate' qui réalise l'action.
Solution
Questions 1) et 2) : Code du fichier library.py généré par Qt Designer:
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(526, 370) self.label = QtWidgets.QLabel(Form) self.label.setGeometry(QtCore.QRect(90, 10, 391, 31)) font = QtGui.QFont() font.setPointSize(18) font.setBold(True) font.setWeight(75) self.label.setFont(font) self.label.setStyleSheet("color: rgb(0, 0, 127);") self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(Form) self.label_2.setGeometry(QtCore.QRect(20, 80, 151, 16)) font = QtGui.QFont() font.setPointSize(11) font.setBold(True) font.setWeight(75) self.label_2.setFont(font) self.label_2.setStyleSheet("color: rgb(0, 0, 255);") self.label_2.setObjectName("label_2") self.btn_validate = QtWidgets.QPushButton(Form) self.btn_validate.setGeometry(QtCore.QRect(370, 330, 141, 31)) font = QtGui.QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.btn_validate.setFont(font) self.btn_validate.setStyleSheet("background-color: rgb(0, 0, 0);\n" "color: rgb(255, 255, 0);") self.btn_validate.setObjectName("btn_validate") self.lineEdit_n = QtWidgets.QLineEdit(Form) self.lineEdit_n.setGeometry(QtCore.QRect(190, 70, 301, 31)) font = QtGui.QFont() font.setPointSize(11) font.setBold(True) font.setWeight(75) self.lineEdit_n.setFont(font) self.lineEdit_n.setStyleSheet("color: rgb(255, 0, 0);") self.lineEdit_n.setObjectName("lineEdit_n") self.label_3 = QtWidgets.QLabel(Form) self.label_3.setGeometry(QtCore.QRect(10, 140, 391, 16)) font = QtGui.QFont() font.setPointSize(11) font.setBold(True) font.setWeight(75) self.label_3.setFont(font) self.label_3.setStyleSheet("color: rgb(0, 0, 255);") self.label_3.setObjectName("label_3") self.btn_cancel = QtWidgets.QPushButton(Form) self.btn_cancel.setGeometry(QtCore.QRect(220, 330, 141, 31)) font = QtGui.QFont() font.setPointSize(10) font.setBold(True) font.setWeight(75) self.btn_cancel.setFont(font) self.btn_cancel.setStyleSheet("background-color: rgb(0, 0, 0);\n" "color: rgb(255, 255, 0);") self.btn_cancel.setObjectName("btn_cancel") self.line = QtWidgets.QFrame(Form) self.line.setGeometry(QtCore.QRect(10, 110, 481, 21)) self.line.setFrameShape(QtWidgets.QFrame.HLine) self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName("line") self.textEdit_list_jumeaux = QtWidgets.QTextEdit(Form) self.textEdit_list_jumeaux.setGeometry(QtCore.QRect(10, 170, 501, 141)) font = QtGui.QFont() font.setPointSize(12) self.textEdit_list_jumeaux.setFont(font) self.textEdit_list_jumeaux.setStyleSheet("color: rgb(0, 0, 255);") self.textEdit_list_jumeaux.setObjectName("textEdit_list_jumeaux") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Form")) self.label.setText(_translate("Form", "Nombres premiers Jumeaux")) self.label_2.setText(_translate("Form", "Saisir la valeur de n")) self.btn_validate.setText(_translate("Form", "Valider")) self.label_3.setText(_translate("Form", "Liste des nombres premiers Jumeaux")) self.btn_cancel.setText(_translate("Form", "Annuler"))
Question: 3)
# fonction qui teste la primalité d'un nombre def test_prim(n): # initialisation du nombr de diviseurs de n d = 0 for k in range(2, n): if n%k == 0: d = d + 1 # un nombre est premier s'il ne possède aucun diviseur strict 1 < K < n if d > 0 : return False else: return True # fonction qui détermine la liste des nombres sont premiers jumeaux <= n def premiers_jumeaux(n): # initialisation de la liste des nombres premiers jumeaux list_jumeaux = [] for p in range(1, n): if test_prim(p) and test_prim(p+2): list_jumeaux.append((p, p+2)) return list_jumeaux
Question 4) Code du fichier main.py:
import sys from library import * # fonction qui teste la primalité d'un nombre def test_prim(n): # initialisation du nombr de diviseurs de n d = 0 for k in range(2, n): if n%k == 0: d = d + 1 # un nombre est premier s'il ne possède aucun diviseur strict 1 < K < n if d > 0 : return False else: return True # fonction qui détermine la liste des nombres sont premiers jumeaux <= n def premiers_jumeaux(n): # initialisation de la liste des nombres premiers jumeaux list_jumeaux = [] for p in range(1, n): if test_prim(p) and test_prim(p+2): list_jumeaux.append((p, p+2)) return list_jumeaux def action(): # récupération du champ de saisie n = int(ui.lineEdit_n.text()) # récupérer la liste des premiers jumeaux list_jumeaux = premiers_jumeaux(n) # insérer la liste des premiers jumeaux sur le label result ui.textEdit_list_jumeaux.setText(str(list_jumeaux)) app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() ui = Ui_Form() ui.setupUi(Form) ui.btn_validate.clicked.connect(action) Form.show() sys.exit(app.exec_())
Younes Derfoufi
CRMEF OUJDA