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


