Recherche…


Remarques

Cette section fournit une vue d'ensemble de ce qu'est pyqt5 et pourquoi un développeur peut vouloir l'utiliser.

Il devrait également mentionner tous les grands sujets dans pyqt5, et établir un lien avec les sujets connexes. La documentation de pyqt5 étant nouvelle, vous devrez peut-être créer des versions initiales de ces rubriques connexes.

Installation ou configuration

  1. Installez Anaconda (PyQt5 est intégré), en particulier pour les utilisateurs de Windows.
  2. Intégrer QtDesigner et QtUIConvert dans PyCharm (outils externes)
    • Ouvrir les Settings PyCharm> Tools > External Tools
    • Create Tool (QtDesigner) - utilisé pour éditer les fichiers * .ui
    • Create Tool (PyUIConv) - utilisé pour convertir * .ui en * .py
  3. Ecrire une démo
    • new window.ui par un outil externe (QtDesigner)
    • convertir en window.py par un outil externe (PyUIConv)
    • démo
      import sys
      from PyQt5.QtWidgets import QApplication,QMainWindow
      from window import Ui_MainWindow
      
      if __name__ == '__main__':
          app = QApplication(sys.argv)
          w = QMainWindow()
          ui = Ui_MainWindow()
          ui.setupUi(w)
          w.show()
          sys.exit(app.exec_())
      

Bonjour Monde Exemple

Cet exemple crée une fenêtre simple avec un bouton et une modification de ligne dans une mise en page. Il montre également comment connecter un signal à un emplacement, de sorte que cliquer sur le bouton ajoute du texte à l'édition de ligne.

import sys
from PyQt5.QtWidgets import QApplication, QWidget


if __name__ == '__main__':
    
    app = QApplication(sys.argv)

    w = QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Hello World')
    w.show()
    
    sys.exit(app.exec_())

Une analyse

app = QtWidgets.QApplication(sys.argv)

Chaque application PyQt5 doit créer un objet d'application. Le paramètre sys.argv est une liste d'arguments provenant d'une ligne de commande. Les scripts Python peuvent être exécutés à partir du shell.

w = QWidget()

Le widget QWidget est la classe de base de tous les objets d'interface utilisateur dans PyQt5. Nous fournissons le constructeur par défaut pour QWidget . Le constructeur par défaut n'a pas de parent. Un widget sans parent est appelé une fenêtre.

w.resize(250, 150)

La méthode resize() redimensionne le widget. Il est large de 250px et haut de 150px.

w.move(300, 300)

La méthode move() déplace le widget à une position sur l'écran à x = 300, y = 300 coordonnées.

w.setWindowTitle('Hello World')

Ici, nous définissons le titre de notre fenêtre. Le titre est affiché dans la barre de titre.

w.show()

La méthode show() affiche le widget à l'écran. Un widget est d'abord créé en mémoire et affiché ultérieurement à l'écran.

sys.exit(app.exec_())

Enfin, nous entrons dans la boucle principale de l'application. La gestion des événements commence à partir de ce point. Le mainloop reçoit les événements du système de fenêtre et les distribue aux widgets d'application. Le mainloop se termine si nous appelons la méthode exit() ou si le widget principal est détruit. La méthode sys.exit() garantit une sortie propre. L'environnement sera informé de la fin de l'application.

La méthode exec_() a un trait de soulignement. C'est parce que exec est un mot clé Python. Et donc, exec_() été utilisé à la place.

Ajouter une icône d'application

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon


class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):
        
        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QIcon('web.png'))        
    
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_()) 

Une analyse

Arguments de fonction en Python

En Python, les fonctions définies par l'utilisateur peuvent prendre quatre types d'arguments différents.

  1. Arguments par défaut:
  • Définition de fonction

    def defaultArg( name, msg = "Hello!"):

  • Appel de fonction

    defaultArg( name)

  1. Arguments requis:
  • Définition de fonction

    def requiredArg (str,num):

  • Appel de fonction:

    requiredArg ("Hello",12)

  1. Arguments de mots clés:
  • Définition de fonction

    def keywordArg( name, role ):

  • Appel de fonction

    keywordArg( name = "Tom", role = "Manager")

    ou

    keywordArg( role = "Manager", name = "Tom")

  1. Nombre variable d'arguments:
  • Définition de fonction

    def varlengthArgs(*varargs):

  • Appel de fonction

    varlengthArgs(30,40,50,60)

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

Trois éléments importants de la programmation orientée objet sont les classes, les données et les méthodes. Ici, nous créons une nouvelle classe appelée Example . La classe Example hérite de la classe QWidget . Cela signifie que nous appelons deux constructeurs: le premier pour la classe Example et le second pour la classe héritée. La méthode super() renvoie l'objet parent de la classe Example et nous appelons son constructeur. La variable self réfère à l'objet lui-même.

Pourquoi avons-nous utilisé __init__ ?

Regarde ça:

class A(object):
    def __init__(self):
        self.lst = []

class B(object):
    lst = []

et maintenant essayez:

>>> x = B()
>>> y = B()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1, 2]
>>> x.lst is y.lst
True

et ça:

>>> x = A()
>>> y = A()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1]
>>> x.lst is y.lst
False

Est-ce que cela signifie que x dans la classe B est établi avant l'instanciation?

Oui, c'est un attribut de classe (il est partagé entre les instances). Alors que dans la classe A, c'est un attribut d'instance.

self.initUI() 

La création de l'interface graphique est déléguée à la méthode initUI() .

self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))  

Les trois méthodes ont été héritées de la classe QWidget . Le setGeometry() fait deux choses: il localise la fenêtre à l'écran et la définit. Les deux premiers paramètres sont les positions x et y de la fenêtre. La troisième est la largeur et la quatrième est la hauteur de la fenêtre. En fait, il combine les méthodes resize() et move() dans une méthode. La dernière méthode définit l'icône de l'application. Pour ce faire, nous avons créé un objet QIcon . Le QIcon reçoit le chemin d'accès à notre icône pour être affiché.

if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

L'application et les objets d'exemple sont créés. La boucle principale est démarrée.

Afficher une infobulle

import sys
from PyQt5.QtWidgets import (QWidget, QToolTip, 
    QPushButton, QApplication)
from PyQt5.QtGui import QFont    


class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):
        
        QToolTip.setFont(QFont('SansSerif', 10))
        
        self.setToolTip('This is a <b>QWidget</b> widget')
        
        btn = QPushButton('Button', self)
        btn.setToolTip('This is a <b>QPushButton</b> widget')
        btn.resize(btn.sizeHint())
        btn.move(50, 50)       
        
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Tooltips')    
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Une analyse

QToolTip.setFont(QFont('SansSerif', 10))

Cette méthode statique définit une police utilisée pour rendre les info-bulles. Nous utilisons une police 10px SansSerif.

self.setToolTip('This is a <b>QWidget</b> widget')

Pour créer une info-bulle, nous appelons la méthode setTooltip() . Nous pouvons utiliser le formatage de texte enrichi.

btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')

Nous créons un widget bouton-poussoir et créons une info-bulle pour cela.

btn.resize(btn.sizeHint())
btn.move(50, 50) 

Le bouton est en cours de redimensionnement et déplacé sur la fenêtre. La méthode sizeHint() donne une taille recommandée pour le bouton.

Transformez votre projet en excutable / installateur

cx_Freeze - un outil peut emballer votre projet à excutable / installateur

  • après l'installer par pip, pour emballer demo.py , nous avons besoin de setup.py ci-dessous.
import sys
from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
    "excludes": ["tkinter"],
    "include_files":[('./platforms','./platforms')] # need qwindows.dll for qt5 application
}

# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "demo",
        version = "0.1",
        description = "demo",
        options = {"build_exe": build_exe_options},
        executables = [Executable("demo.py", base=base)])
  • puis construire
python .\setup.py build
  • alors dist
python .\setup.py bdist_msi


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow