Styliser les widgets

Exclusif Premium

Débloquez votre potentiel ! ✨

Cette session fait partie de notre programme Premium exclusif

+100h de formations exclusives
+180 exercices de code avancés
+100h de mentorats en réécriture
20 projets guidés pas à pas
Mentorats groupés hebdomadaires
Support individuel avec nos mentors

Prêt à passer au niveau supérieur ?

Découvrez tous les avantages Premium et transformez votre apprentissage dès aujourd'hui!

Inscris-toi

(c'est gratuit !)

Un compte est nécessaire pour participer aux discussions.

Créer un compte

Styliser les widgets

Dans cette partie on va voir comment nous pouvons modifier les widgets de l'application pour avoir un rendu un peu plus intéressant que le rendu actuel.

La première chose que nous allons faire c'est réduire les marges et l'espacement de notre QGridLayout.

Par défaut, un espace est en effet présent entre les widgets et autour du layout.

Pour réduire cet espace, on peut utiliser les méthodes setSpacing et setContentsMargins :

self.main_layout.setSpacing(0)
self.main_layout.setContentsMargins(10, 10, 10, 10)

Attaquons nous maintenant au QLineEdit.

Tout d'abord, on indique une hauteur minimum avec la méthode setMinimumHeight :

self.le_result.setMinimumHeight(50)

Ensuite, nous souhaitons aligner le texte à droite du QLineEdit. Pour ça, on peut utiliser les options d'alignement avec la méthode setAlignment et la constante du module QtCore.Qt.AlignRight du module QtCore :

self.le_result.setAlignment(QtCore.Qt.AlignRight)

Pour finir, nous allons modifier les boutons pour qu'ils aient une taille minimale et qu'ils puissent s'étendre en largeur et en hauteur quand on change la taille de la fenêtre.

On utilise tout d'abord la méthode setMinimumSize pour indiquer une taille minimum de 48 par 48 pixels :

button.setMinimumSize(48, 48)

Et pour finir on utilise le sizePolicy et la méthode setSizePolicy pour modifier le comportement des boutons en cas de modification de la taille de la fenêtre :
button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

!!!note
N'oubliez pas d'importer la classe QSizePolicy du module PySide6.QtWidgets au préalable :
from PySide6.QtWidgets import QSizePolicy
!!!

Avec QSizePolicy.Expanding on indique que l'on souhaite permettre aux boutons de prendre toute la largeur et la hauteur disponible à l'intérieur des cellules du QGridLayout.

Voici le code final de cette partie :

from PySide6 import QtCore
from PySide6.QtGui import QShortcut, QKeySequence
from PySide6.QtWidgets import QApplication, QWidget, QGridLayout, QLineEdit, QPushButton, QSizePolicy

BUTTONS = {"C": (1, 0, 1, 1),
           "/": (1, 3, 1, 1),
           "7": (2, 0, 1, 1),
           "8": (2, 1, 1, 1),
           "9": (2, 2, 1, 1),
           "x": (2, 3, 1, 1),
           "4": (3, 0, 1, 1),
           "5": (3, 1, 1, 1),
           "6": (3, 2, 1, 1),
           "-": (3, 3, 1, 1),
           "1": (4, 0, 1, 1),
           "2": (4, 1, 1, 1),
           "3": (4, 2, 1, 1),
           "+": (4, 3, 1, 1),
           "0": (5, 0, 1, 2),
           ".": (5, 2, 1, 1),
           "=": (5, 3, 1, 1)}

OPERATIONS = ["+", "-", "/", "x"]


class Calculator(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Calculatrice")

        self.buttons = {}

        self.main_layout = QGridLayout(self)
        # On réduit l'espacement et les marges
        self.main_layout.setSpacing(0)
        self.main_layout.setContentsMargins(0, 0, 0, 0)

        self.le_result = QLineEdit("0")
        self.le_result.setMinimumHeight(50)
        self.le_result.setAlignment(QtCore.Qt.AlignRight)
        self.le_result.setEnabled(False)
        self.main_layout.addWidget(self.le_result, 0, 0, 1, 4)

        for button_text, button_position in BUTTONS.items():
            button = QPushButton(button_text)

            # On définit une taille minimum
            button.setMinimumSize(48, 48)
            # On permet aux boutons de prendre toute la largeur et la hauteur possible
            button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

            if button_text not in ["=", "C"]:
                button.clicked.connect(self.number_or_operation_pressed)

            self.main_layout.addWidget(button, *button_position)
            self.buttons[button_text] = button

        self.buttons["C"].clicked.connect(self.clear_result)
        self.buttons["="].clicked.connect(self.compute_result)

        self.connect_keyboard_shortcuts()

    @property
    def result(self):
        return self.le_result.text()

    def number_or_operation_pressed(self):
        # On empêche d'utiliser plusieurs fois de suite un symbole d'opération
        if self.result[-1] in OPERATIONS and self.sender().text() in OPERATIONS:
            return

        # On empêche de commencer par un symbole d'opération
        if self.result == "0" and self.sender().text() in OPERATIONS:
            return

        if self.result == "0":
            self.le_result.clear()

        self.le_result.setText(self.result + self.sender().text())

    def clear_result(self):
        self.le_result.setText("0")

    def compute_result(self):
        try:
            result = eval(self.result.replace("x", "*"))
        except SyntaxError:
            return
        self.le_result.setText(str(result))

    def remove_last_character(self):
        if len(self.result) > 1:
            self.le_result.setText(self.result[:-1])
        else:
            self.le_result.setText("0")

    def connect_keyboard_shortcuts(self):
        for button_text, button in self.buttons.items():
            QShortcut(QKeySequence(button_text), self, button.clicked.emit)

        QShortcut(QKeySequence(QtCore.Qt.Key_Return), self, self.compute_result)
        QShortcut(QKeySequence(QtCore.Qt.Key_Backspace), self, self.remove_last_character)


app = QApplication()
win = Calculator()
win.show()
app.exec()

Ce n'est pas fini...

Tu as complété % du parcours 🔥

Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.

Rechercher sur le site

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.