- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
Deviens membre Premium magic_button
Débloque cette session en devenant Membre Premium 🚀
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte personStyliser 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)
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.