Liste des nombres premiers jumeaux en Python illustrés sur une fenêtre PyQt5

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:

nombres premiers jumeaux en python PyQt5

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:

  1. lineEdite_n : désigne  le nom du champ de saisie
  2. textEdit_list_jumeaux : nom du widget QTextEdit qui affiche la liste des couples de nombres premiers jumeaux (liste en bleu)
  3. btn_validate : nom du bouton 'Validate' qui valide l'action
  4. 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

Leave a Reply