Afin de pouvoir personnaliser votre classeur sans détruire le classeur sur lequel travaille votre voisin, vous allez tout d'abord aller dans le menu File puis Make a copy.... Renommez le classeur en ajoutant votre nom à la fin du nom de fichier par exemple.

Boutons et SpinBox

Lien vers la doc

On commence bien sûr par rappeler le lien vers la doc PySide...

https://deptinfo-ensip.univ-poitiers.fr/ENS/pyside-docs/index.html

On importe les librairies Qt comme d'habitude

In [ ]:
from PySide.QtCore import *
from PySide.QtGui import *
import sys

Le but de l'activité

Nous souhaitons réaliser une application permettant de simuler le lancer d'un dé à un nombre arbitraire de faces :

Capture

Nous voyons un label, deux boutons et un champ de saisie contenant le nombre de faces. Nous allons détailler l'usage de ces nouveaux objets.

Conception de l'interface

Une recherche dans le Fantastic Manual nous montre que QPushButton est la classe permettant de créer des boutons sur une interface graphique.

Le champ de saisie pour le nombre de faces est un peu particulier car il contient des curseurs pour augmenter ou diminuer le nombre de faces. C'est un QSpinBox.

Pour la disposition des widgets, on constate qu'ils sont principalement répartis sur 3 lignes :

  • le label
  • la rangée centrale avec le SpinBox et le bouton
  • le bouton Quitter Nous utiliserons donc un layout vertical.

Pour la rangée centrale, nous utiliserons un second layout horizontal cette fois-ci. La procédure est assez simple puisqu'il suffit d'utiliser la méthode addLayout() à la place d'addWidget() sur le layout principal.

Voici donc le code permettant de créer cette interface :

In [ ]:
class MainWindow(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        
        self.monLabel=QLabel("Résultat : ")
        self.nbFaces=QSpinBox()
        self.lancerBtn=QPushButton("Lancer le dé")
        self.quitterBtn=QPushButton("Quitter")
        
        # Disposition des widgets
        layout=QVBoxLayout()
        layout.addWidget(self.monLabel)
        # On crée une layout horizontale
        layout1=QHBoxLayout()
        layout1.addWidget(self.nbFaces)
        layout1.addWidget(self.lancerBtn)
        
        # On ajoute la layout horizontale à la layout principale
        layout.addLayout(layout1)
        layout.addWidget(self.quitterBtn)
        # On associe la layout à la fenetre principale
        self.setLayout(layout)
        
        self.setWindowTitle("Lancer de dé")

On donne vie à notre application

In [ ]:
try:
    app = QApplication(sys.argv)
except RuntimeError:
    app=QApplication.instance()
form = MainWindow()
form.show()
app.exec_()

Et voila ! L'interface est conforme à nos attente, mais notre application ne fait rien !

C'est tout à fait normal, car nous n'avons pas défini les méthodes à appeler lors de l'appui des boutons et nous n'avons pas non plus établi les connexion entre les événements et les méthodes.

Le signal (événement) correspondant à un clic sur un bouton se nomme clicked. On le retrouve sous signaux dans le Fantastic Manual sur l'objet QAbstractButton qui contient l'essentiel des méthodes des objets boutons de toute sortes.

Le code ci-dessous implémente la fonction quitter. Ce sera à vous de jouer pour donner vie au bouton Lancer le dé.

A vous de jouer

In [ ]:
class MainWindow(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        
        self.monLabel=QLabel("Résultat : ")
        self.nbFaces=QSpinBox()
        self.lancerBtn=QPushButton("Lancer le dé")
        self.quitterBtn=QPushButton("Quitter")
        
        # Disposition des widgets
        layout=QVBoxLayout()
        layout.addWidget(self.monLabel)
        # On crée une layout horizontale
        layout1=QHBoxLayout()
        layout1.addWidget(self.nbFaces)
        layout1.addWidget(self.lancerBtn)
        
        # On ajoute la layout horizontale à la layout principale
        layout.addLayout(layout1)
        layout.addWidget(self.quitterBtn)
        # On associe la layout à la fenetre principale
        self.setLayout(layout)
        
        self.setWindowTitle("Lancer de dé")
        
        # On connecte le bouton quitter à la méthode self.Quitter()
        self.quitterBtn.clicked.connect(self.Quitter)
        
    def Quitter(self):
        self.close()
        app.quit()
    
    # Compléter ce programme pour donner vie au bouton Lancer

Et pour tester notre programme ...

In [ ]:
form = MainWindow()
form.show()
app.exec_()

Une fois le bouton bouton Lancer le dé activé vous pourrez compléter l'application

  • en initialisant le nombre de faces dans la SpinBox à 6 RTFM
  • en effaçant le label lorsque le nombre de faces a changé
  • en vous assurant de ne pas crasher l'application quand le nombre de faces est 0 :)
In [ ]: