Logo Mon Club Elec

PyQt Lab’ : Port Série : en réception : Réception de 6 valeurs numériques sur le port série, dans 6 QwtDial, le widget d’affichage analogique « à aiguille », conversion mesure/unité et affichage dans 12 widgets LCD.

PyQt Lab est un outil puissant qui permet aux utilisateurs de créer des applications graphiques avec des fonctionnalités avancées. Dans cet article, nous allons nous concentrer sur l’utilisation de PyQt Lab pour la réception de 6 valeurs numériques sur le port série, leur conversion en mesures et leur affichage dans 12 widgets LCD. Nous verrons comment PyQt Lab peut être utilisé pour afficher ces valeurs numériques dans 6 QwtDial, le widget d’affichage analogique « à aiguille ».

PyQt Lab’ : Port Série : en réception : Réception de 6 valeurs numériques sur le port série, dans 6 QwtDial, le widget d’affichage analogique « à aiguille », conversion mesure/unité et affichage dans 12 widgets LCD.

Par X. HINAULT – Juin 2013

PyQt Lab’ : Port Série : en réception : Réception de 6 valeurs numériques sur le port série, dans 6 QwtDial, le widget d’affichage analogique « à aiguille », conversion mesure/unité et affichage dans 12 widgets LCD.

Ce que l’on va faire ici

  • Dans ce code PyQt, interface permettant la réception de 6 valeurs numériques sur le port série, dans 6 QwtDial, le widget d’affichage analogique « à aiguille », conversion mesure/unité et affichage dans 12 widgets LCD.

Pré-requis

  • python 2.7
  • pyqt4.x
  • modules :
    • python-serial
    • python-qwt5-qt4

Téléchargement :

  • Ces codes sont disponibles ici : ..

Le fichier d’interface *.py

  • Fichier obtenu automatiquement avec l’utilitaire pyuic4 à partir du fichier *.ui créé avec QtDesigner :
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file
#
# Created: Sat Feb  2 09:46:51 2013
#      by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui
from PyQt4.Qwt5 import * # module Qwt

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8(« Form »))
        Form.resize(905, 719)
        self.qwtDial_A0 = QwtDial(Form)
        self.qwtDial_A0.setGeometry(QtCore.QRect(240, 0, 175, 175))
        self.qwtDial_A0.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
        self.qwtDial_A0.setReadOnly(True)
        self.qwtDial_A0.setLineWidth(5)
        self.qwtDial_A0.setFrameShadow(QwtDial.Sunken)
        self.qwtDial_A0.setMode(QwtDial.RotateNeedle)
        self.qwtDial_A0.setOrigin(90.0)
        self.qwtDial_A0.setWrapping(False)
        self.qwtDial_A0.setObjectName(_fromUtf8(« qwtDial_A0 »))
        self.labelDebit = QtGui.QLabel(Form)
        self.labelDebit.setGeometry(QtCore.QRect(10, 45, 111, 16))
        self.labelDebit.setObjectName(_fromUtf8(« labelDebit »))
        self.comboBoxPort = QtGui.QComboBox(Form)
        self.comboBoxPort.setGeometry(QtCore.QRect(5, 20, 151, 24))
        self.comboBoxPort.setEditable(True)
        self.comboBoxPort.setObjectName(_fromUtf8(« comboBoxPort »))
        self.comboBoxPort.addItem(_fromUtf8(«  »))
        self.comboBoxPort.addItem(_fromUtf8(«  »))
        self.comboBoxPort.addItem(_fromUtf8(«  »))
        self.comboBoxPort.addItem(_fromUtf8(«  »))
        self.labelReception = QtGui.QLabel(Form)
        self.labelReception.setGeometry(QtCore.QRect(5, 235, 156, 16))
        self.labelReception.setObjectName(_fromUtf8(« labelReception »))
        self.textEditReception = QtGui.QTextEdit(Form)
        self.textEditReception.setGeometry(QtCore.QRect(5, 255, 156, 111))
        self.textEditReception.setLineWrapMode(QtGui.QTextEdit.NoWrap)
        self.textEditReception.setObjectName(_fromUtf8(« textEditReception »))
        self.pushButtonInitSerial = QtGui.QPushButton(Form)
        self.pushButtonInitSerial.setGeometry(QtCore.QRect(5, 95, 101, 31))
        self.pushButtonInitSerial.setObjectName(_fromUtf8(« pushButtonInitSerial »))
        self.comboBoxDebit = QtGui.QComboBox(Form)
        self.comboBoxDebit.setGeometry(QtCore.QRect(5, 60, 111, 24))
        self.comboBoxDebit.setObjectName(_fromUtf8(« comboBoxDebit »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.comboBoxDebit.addItem(_fromUtf8(«  »))
        self.labelPort = QtGui.QLabel(Form)
        self.labelPort.setGeometry(QtCore.QRect(10, 5, 101, 16))
        self.labelPort.setObjectName(_fromUtf8(« labelPort »))
        self.line = QtGui.QFrame(Form)
        self.line.setGeometry(QtCore.QRect(160, 10, 16, 706))
        self.line.setFrameShape(QtGui.QFrame.VLine)
        self.line.setFrameShadow(QtGui.QFrame.Sunken)
        self.line.setObjectName(_fromUtf8(« line »))
        self.pushButtonStop = QtGui.QPushButton(Form)
        self.pushButtonStop.setGeometry(QtCore.QRect(115, 85, 41, 41))
        self.pushButtonStop.setObjectName(_fromUtf8(« pushButtonStop »))
        self.line_5 = QtGui.QFrame(Form)
        self.line_5.setGeometry(QtCore.QRect(5, 400, 156, 16))
        self.line_5.setFrameShape(QtGui.QFrame.HLine)
        self.line_5.setFrameShadow(QtGui.QFrame.Sunken)
        self.line_5.setObjectName(_fromUtf8(« line_5 »))
        self.labelVoie_A0 = QtGui.QLabel(Form)
        self.labelVoie_A0.setGeometry(QtCore.QRect(180, 170, 121, 16))
        self.labelVoie_A0.setObjectName(_fromUtf8(« labelVoie_A0 »))
        self.lineEditValeurMax_A2 = QtGui.QLineEdit(Form)
        self.lineEditValeurMax_A2.setGeometry(QtCore.QRect(285, 655, 66, 16))
        self.lineEditValeurMax_A2.setObjectName(_fromUtf8(« lineEditValeurMax_A2 »))
        self.labelVoie_A2 = QtGui.QLabel(Form)
        self.labelVoie_A2.setGeometry(QtCore.QRect(175, 635, 121, 16))
        self.labelVoie_A2.setObjectName(_fromUtf8(« labelVoie_A2 »))
        self.lineEditUnite_A0 = QtGui.QLineEdit(Form)
        self.lineEditUnite_A0.setGeometry(QtCore.QRect(495, 195, 41, 23))
        self.lineEditUnite_A0.setObjectName(_fromUtf8(« lineEditUnite_A0 »))
        self.labelValeurMaxMin_A1 = QtGui.QLabel(Form)
        self.labelValeurMaxMin_A1.setGeometry(QtCore.QRect(290, 410, 71, 16))
        self.labelValeurMaxMin_A1.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
        self.labelValeurMaxMin_A1.setObjectName(_fromUtf8(« labelValeurMaxMin_A1 »))
        self.labelVoie_A5 = QtGui.QLabel(Form)
        self.labelVoie_A5.setGeometry(QtCore.QRect(545, 635, 121, 16))
        self.labelVoie_A5.setObjectName(_fromUtf8(« labelVoie_A5 »))
        self.labelUnite_A0 = QtGui.QLabel(Form)
        self.labelUnite_A0.setGeometry(QtCore.QRect(495, 180, 51, 13))
        self.labelUnite_A0.setObjectName(_fromUtf8(« labelUnite_A0 »))
        self.labelValeurMaxMin_A2 = QtGui.QLabel(Form)
        self.labelValeurMaxMin_A2.setGeometry(QtCore.QRect(285, 640, 71, 16))
        self.labelValeurMaxMin_A2.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
        self.labelValeurMaxMin_A2.setObjectName(_fromUtf8(« labelValeurMaxMin_A2 »))
        self.lcdNumberValeurCalc_A4 = QtGui.QLCDNumber(Form)
        self.lcdNumberValeurCalc_A4.setGeometry(QtCore.QRect(735, 410, 121, 51))
        self.lcdNumberValeurCalc_A4.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n« 
« color: rgb(255, 0, 0); »))
        self.lcdNumberValeurCalc_A4.setSmallDecimalPoint(True)
        self.lcdNumberValeurCalc_A4.setMode(QtGui.QLCDNumber.Dec)
        self.lcdNumberValeurCalc_A4.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A4 »))
        self.textEditTraceEnvoiSerie = QtGui.QTextEdit(Form)
        self.textEditTraceEnvoiSerie.setGeometry(QtCore.QRect(5, 600, 156, 111))
        self.textEditTraceEnvoiSerie.setStyleSheet(_fromUtf8(« color: rgb(0, 0, 255);\n« 
« background-color: rgb(170, 255, 255); »))
        self.textEditTraceEnvoiSerie.setLineWrapMode(QtGui.QTextEdit.NoWrap)
        self.textEditTraceEnvoiSerie.setObjectName(_fromUtf8(« textEditTraceEnvoiSerie »))
        self.labelValeurMaxMin_A0 = QtGui.QLabel(Form)
        self.labelValeurMaxMin_A0.setGeometry(QtCore.QRect(295, 175, 71, 16))
        self.labelValeurMaxMin_A0.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
        self.labelValeurMaxMin_A0.setObjectName(_fromUtf8(« labelValeurMaxMin_A0 »))
        self.labelUnite_A2 = QtGui.QLabel(Form)
        self.labelUnite_A2.setGeometry(QtCore.QRect(480, 645, 51, 13))
        self.labelUnite_A2.setObjectName(_fromUtf8(« labelUnite_A2 »))
        self.lineEditUnite_A3 = QtGui.QLineEdit(Form)
        self.lineEditUnite_A3.setGeometry(QtCore.QRect(860, 195, 41, 23))
        self.lineEditUnite_A3.setObjectName(_fromUtf8(« lineEditUnite_A3 »))
        self.labelVoie_A1 = QtGui.QLabel(Form)
        self.labelVoie_A1.setGeometry(QtCore.QRect(180, 405, 121, 16))
        self.labelVoie_A1.setObjectName(_fromUtf8(« labelVoie_A1 »))
        self.labelUnite_A4 = QtGui.QLabel(Form)
        self.labelUnite_A4.setGeometry(QtCore.QRect(860, 415, 51, 13))
        self.labelUnite_A4.setObjectName(_fromUtf8(« labelUnite_A4 »))
        self.lineEditUnite_A2 = QtGui.QLineEdit(Form)
        self.lineEditUnite_A2.setGeometry(QtCore.QRect(480, 660, 41, 23))
        self.lineEditUnite_A2.setObjectName(_fromUtf8(« lineEditUnite_A2 »))
        self.labelVoie_A4 = QtGui.QLabel(Form)
        self.labelVoie_A4.setGeometry(QtCore.QRect(555, 405, 121, 16))
        self.labelVoie_A4.setObjectName(_fromUtf8(« labelVoie_A4 »))
        self.lineEditValeurMin_A4 = QtGui.QLineEdit(Form)
        self.lineEditValeurMin_A4.setGeometry(QtCore.QRect(665, 445, 66, 16))
        self.lineEditValeurMin_A4.setObjectName(_fromUtf8(« lineEditValeurMin_A4 »))
        self.labelTraceEnvoiSerie = QtGui.QLabel(Form)
        self.labelTraceEnvoiSerie.setGeometry(QtCore.QRect(5, 585, 156, 16))
        self.labelTraceEnvoiSerie.setObjectName(_fromUtf8(« labelTraceEnvoiSerie »))
        self.lineEditValeurMin_A1 = QtGui.QLineEdit(Form)
        self.lineEditValeurMin_A1.setGeometry(QtCore.QRect(290, 445, 66, 16))
        self.lineEditValeurMin_A1.setObjectName(_fromUtf8(« lineEditValeurMin_A1 »))
        self.labelValeurMaxMin_A4 = QtGui.QLabel(Form)
        self.labelValeurMaxMin_A4.setGeometry(QtCore.QRect(665, 410, 71, 16))
        self.labelValeurMaxMin_A4.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
        self.labelValeurMaxMin_A4.setObjectName(_fromUtf8(« labelValeurMaxMin_A4 »))
        self.lineEditValeurMin_A5 = QtGui.QLineEdit(Form)
        self.lineEditValeurMin_A5.setGeometry(QtCore.QRect(655, 675, 66, 16))
        self.lineEditValeurMin_A5.setObjectName(_fromUtf8(« lineEditValeurMin_A5 »))
        self.lineEditValeurMax_A5 = QtGui.QLineEdit(Form)
        self.lineEditValeurMax_A5.setGeometry(QtCore.QRect(655, 655, 66, 16))
        self.lineEditValeurMax_A5.setObjectName(_fromUtf8(« lineEditValeurMax_A5 »))
        self.lcdNumberValeurCalc_A2 = QtGui.QLCDNumber(Form)
        self.lcdNumberValeurCalc_A2.setGeometry(QtCore.QRect(355, 640, 121, 51))
        self.lcdNumberValeurCalc_A2.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n« 
« color: rgb(255, 0, 0); »))
        self.lcdNumberValeurCalc_A2.setSmallDecimalPoint(True)
        self.lcdNumberValeurCalc_A2.setMode(QtGui.QLCDNumber.Dec)
        self.lcdNumberValeurCalc_A2.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A2 »))
        self.labelUnite_A3 = QtGui.QLabel(Form)
        self.labelUnite_A3.setGeometry(QtCore.QRect(860, 180, 51, 13))
        self.labelUnite_A3.setObjectName(_fromUtf8(« labelUnite_A3 »))
        self.labelVoie_A3 = QtGui.QLabel(Form)
        self.labelVoie_A3.setGeometry(QtCore.QRect(555, 170, 121, 16))
        self.labelVoie_A3.setObjectName(_fromUtf8(« labelVoie_A3 »))
        self.lcdNumber_A3 = QtGui.QLCDNumber(Form)
        self.lcdNumber_A3.setGeometry(QtCore.QRect(555, 185, 106, 40))
        self.lcdNumber_A3.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n« 
« color: rgb(85, 170, 0); »))
        self.lcdNumber_A3.setFrameShape(QtGui.QFrame.Box)
        self.lcdNumber_A3.setFrameShadow(QtGui.QFrame.Sunken)
        self.lcdNumber_A3.setSegmentStyle(QtGui.QLCDNumber.Filled)
        self.lcdNumber_A3.setObjectName(_fromUtf8(« lcdNumber_A3 »))
        self.labelRacineChaine = QtGui.QLabel(Form)
        self.labelRacineChaine.setGeometry(QtCore.QRect(5, 365, 141, 16))
        self.labelRacineChaine.setObjectName(_fromUtf8(« labelRacineChaine »))
        self.lineEditUnite_A5 = QtGui.QLineEdit(Form)
        self.lineEditUnite_A5.setGeometry(QtCore.QRect(850, 660, 41, 23))
        self.lineEditUnite_A5.setObjectName(_fromUtf8(« lineEditUnite_A5 »))
        self.lcdNumber_A0 = QtGui.QLCDNumber(Form)
        self.lcdNumber_A0.setGeometry(QtCore.QRect(180, 185, 106, 40))
        self.lcdNumber_A0.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n« 
« color: rgb(85, 170, 0); »))
        self.lcdNumber_A0.setFrameShape(QtGui.QFrame.Box)
        self.lcdNumber_A0.setFrameShadow(QtGui.QFrame.Sunken)
        self.lcdNumber_A0.setSegmentStyle(QtGui.QLCDNumber.Filled)
        self.lcdNumber_A0.setObjectName(_fromUtf8(« lcdNumber_A0 »))
        self.lcdNumber_A4 = QtGui.QLCDNumber(Form)
        self.lcdNumber_A4.setGeometry(QtCore.QRect(555, 420, 106, 40))
        self.lcdNumber_A4.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n« 
« color: rgb(85, 170, 0); »))
        self.lcdNumber_A4.setFrameShape(QtGui.QFrame.Box)
        self.lcdNumber_A4.setFrameShadow(QtGui.QFrame.Sunken)
        self.lcdNumber_A4.setSegmentStyle(QtGui.QLCDNumber.Filled)
        self.lcdNumber_A4.setObjectName(_fromUtf8(« lcdNumber_A4 »))
        self.lineEditUnite_A4 = QtGui.QLineEdit(Form)
        self.lineEditUnite_A4.setGeometry(QtCore.QRect(860, 430, 41, 23))
        self.lineEditUnite_A4.setObjectName(_fromUtf8(« lineEditUnite_A4 »))
        self.labelTraceAnalyseChaine = QtGui.QLabel(Form)
        self.labelTraceAnalyseChaine.setGeometry(QtCore.QRect(5, 415, 166, 16))
        self.labelTraceAnalyseChaine.setObjectName(_fromUtf8(« labelTraceAnalyseChaine »))
        self.lineEditRacineChaine = QtGui.QLineEdit(Form)
        self.lineEditRacineChaine.setGeometry(QtCore.QRect(5, 380, 136, 23))
        self.lineEditRacineChaine.setObjectName(_fromUtf8(« lineEditRacineChaine »))
        self.labelValeurMaxMin_A3 = QtGui.QLabel(Form)
        self.labelValeurMaxMin_A3.setGeometry(QtCore.QRect(665, 175, 71, 16))
        self.labelValeurMaxMin_A3.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
        self.labelValeurMaxMin_A3.setObjectName(_fromUtf8(« labelValeurMaxMin_A3 »))
        self.lineEditValeurMin_A0 = QtGui.QLineEdit(Form)
        self.lineEditValeurMin_A0.setGeometry(QtCore.QRect(295, 210, 66, 16))
        self.lineEditValeurMin_A0.setObjectName(_fromUtf8(« lineEditValeurMin_A0 »))
        self.line_4 = QtGui.QFrame(Form)
        self.line_4.setGeometry(QtCore.QRect(5, 575, 156, 16))
        self.line_4.setFrameShape(QtGui.QFrame.HLine)
        self.line_4.setFrameShadow(QtGui.QFrame.Sunken)
        self.line_4.setObjectName(_fromUtf8(« line_4 »))
        self.lineEditValeurMax_A1 = QtGui.QLineEdit(Form)
        self.lineEditValeurMax_A1.setGeometry(QtCore.QRect(290, 425, 66, 16))
        self.lineEditValeurMax_A1.setObjectName(_fromUtf8(« lineEditValeurMax_A1 »))
        self.lineEditValeurMax_A0 = QtGui.QLineEdit(Form)
        self.lineEditValeurMax_A0.setGeometry(QtCore.QRect(295, 190, 66, 16))
        self.lineEditValeurMax_A0.setObjectName(_fromUtf8(« lineEditValeurMax_A0 »))
        self.lcdNumberValeurCalc_A3 = QtGui.QLCDNumber(Form)
        self.lcdNumberValeurCalc_A3.setGeometry(QtCore.QRect(735, 175, 121, 51))
        self.lcdNumberValeurCalc_A3.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n« 
« color: rgb(255, 0, 0); »))
        self.lcdNumberValeurCalc_A3.setSmallDecimalPoint(True)
        self.lcdNumberValeurCalc_A3.setMode(QtGui.QLCDNumber.Dec)
        self.lcdNumberValeurCalc_A3.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A3 »))
        self.lcdNumber_A1 = QtGui.QLCDNumber(Form)
        self.lcdNumber_A1.setGeometry(QtCore.QRect(180, 420, 106, 40))
        self.lcdNumber_A1.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n« 
« color: rgb(85, 170, 0); »))
        self.lcdNumber_A1.setFrameShape(QtGui.QFrame.Box)
        self.lcdNumber_A1.setFrameShadow(QtGui.QFrame.Sunken)
        self.lcdNumber_A1.setSegmentStyle(QtGui.QLCDNumber.Filled)
        self.lcdNumber_A1.setObjectName(_fromUtf8(« lcdNumber_A1 »))
        self.lineEditValeurMax_A3 = QtGui.QLineEdit(Form)
        self.lineEditValeurMax_A3.setGeometry(QtCore.QRect(665, 190, 66, 16))
        self.lineEditValeurMax_A3.setObjectName(_fromUtf8(« lineEditValeurMax_A3 »))
        self.lineEditUnite_A1 = QtGui.QLineEdit(Form)
        self.lineEditUnite_A1.setGeometry(QtCore.QRect(485, 430, 41, 23))
        self.lineEditUnite_A1.setObjectName(_fromUtf8(« lineEditUnite_A1 »))
        self.lineEditValeurMin_A3 = QtGui.QLineEdit(Form)
        self.lineEditValeurMin_A3.setGeometry(QtCore.QRect(665, 210, 66, 16))
        self.lineEditValeurMin_A3.setObjectName(_fromUtf8(« lineEditValeurMin_A3 »))
        self.lcdNumber_A2 = QtGui.QLCDNumber(Form)
        self.lcdNumber_A2.setGeometry(QtCore.QRect(175, 650, 106, 40))
        self.lcdNumber_A2.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n« 
« color: rgb(85, 170, 0); »))
        self.lcdNumber_A2.setFrameShape(QtGui.QFrame.Box)
        self.lcdNumber_A2.setFrameShadow(QtGui.QFrame.Sunken)
        self.lcdNumber_A2.setSegmentStyle(QtGui.QLCDNumber.Filled)
        self.lcdNumber_A2.setObjectName(_fromUtf8(« lcdNumber_A2 »))
        self.lineEditValeurMin_A2 = QtGui.QLineEdit(Form)
        self.lineEditValeurMin_A2.setGeometry(QtCore.QRect(285, 675, 66, 16))
        self.lineEditValeurMin_A2.setObjectName(_fromUtf8(« lineEditValeurMin_A2 »))
        self.labelValeurMaxMin_A5 = QtGui.QLabel(Form)
        self.labelValeurMaxMin_A5.setGeometry(QtCore.QRect(655, 640, 71, 16))
        self.labelValeurMaxMin_A5.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
        self.labelValeurMaxMin_A5.setObjectName(_fromUtf8(« labelValeurMaxMin_A5 »))
        self.lcdNumberValeurCalc_A5 = QtGui.QLCDNumber(Form)
        self.lcdNumberValeurCalc_A5.setGeometry(QtCore.QRect(725, 640, 121, 51))
        self.lcdNumberValeurCalc_A5.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n« 
« color: rgb(255, 0, 0); »))
        self.lcdNumberValeurCalc_A5.setSmallDecimalPoint(True)
        self.lcdNumberValeurCalc_A5.setMode(QtGui.QLCDNumber.Dec)
        self.lcdNumberValeurCalc_A5.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A5 »))
        self.lcdNumberValeurCalc_A1 = QtGui.QLCDNumber(Form)
        self.lcdNumberValeurCalc_A1.setGeometry(QtCore.QRect(360, 410, 121, 51))
        self.lcdNumberValeurCalc_A1.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n« 
« color: rgb(255, 0, 0); »))
        self.lcdNumberValeurCalc_A1.setSmallDecimalPoint(True)
        self.lcdNumberValeurCalc_A1.setMode(QtGui.QLCDNumber.Dec)
        self.lcdNumberValeurCalc_A1.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A1 »))
        self.labelUnite_A1 = QtGui.QLabel(Form)
        self.labelUnite_A1.setGeometry(QtCore.QRect(485, 415, 51, 13))
        self.labelUnite_A1.setObjectName(_fromUtf8(« labelUnite_A1 »))
        self.lineEditValeurMax_A4 = QtGui.QLineEdit(Form)
        self.lineEditValeurMax_A4.setGeometry(QtCore.QRect(665, 425, 66, 16))
        self.lineEditValeurMax_A4.setObjectName(_fromUtf8(« lineEditValeurMax_A4 »))
        self.labelUnite_A5 = QtGui.QLabel(Form)
        self.labelUnite_A5.setGeometry(QtCore.QRect(850, 645, 51, 13))
        self.labelUnite_A5.setObjectName(_fromUtf8(« labelUnite_A5 »))
        self.lcdNumberValeurCalc_A0 = QtGui.QLCDNumber(Form)
        self.lcdNumberValeurCalc_A0.setGeometry(QtCore.QRect(370, 175, 121, 51))
        self.lcdNumberValeurCalc_A0.setStyleSheet(_fromUtf8(« background-color: rgb(255, 255, 0);\n« 
« color: rgb(255, 0, 0); »))
        self.lcdNumberValeurCalc_A0.setSmallDecimalPoint(True)
        self.lcdNumberValeurCalc_A0.setMode(QtGui.QLCDNumber.Dec)
        self.lcdNumberValeurCalc_A0.setObjectName(_fromUtf8(« lcdNumberValeurCalc_A0 »))
        self.lcdNumber_A5 = QtGui.QLCDNumber(Form)
        self.lcdNumber_A5.setGeometry(QtCore.QRect(545, 650, 106, 40))
        self.lcdNumber_A5.setStyleSheet(_fromUtf8(« background-color: rgb(170, 255, 127);\n« 
« color: rgb(85, 170, 0); »))
        self.lcdNumber_A5.setFrameShape(QtGui.QFrame.Box)
        self.lcdNumber_A5.setFrameShadow(QtGui.QFrame.Sunken)
        self.lcdNumber_A5.setSegmentStyle(QtGui.QLCDNumber.Filled)
        self.lcdNumber_A5.setObjectName(_fromUtf8(« lcdNumber_A5 »))
        self.textEditTraceAnalyseChaine = QtGui.QTextEdit(Form)
        self.textEditTraceAnalyseChaine.setGeometry(QtCore.QRect(5, 430, 156, 146))
        self.textEditTraceAnalyseChaine.setStyleSheet(_fromUtf8(« color: rgb(0, 170, 0);\n« 
« background-color: rgb(188, 255, 193);\n« 
«  »))
        self.textEditTraceAnalyseChaine.setLineWrapMode(QtGui.QTextEdit.NoWrap)
        self.textEditTraceAnalyseChaine.setObjectName(_fromUtf8(« textEditTraceAnalyseChaine »))
        self.qwtDial_A3 = QwtDial(Form)
        self.qwtDial_A3.setGeometry(QtCore.QRect(610, 0, 175, 175))
        self.qwtDial_A3.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
        self.qwtDial_A3.setReadOnly(True)
        self.qwtDial_A3.setLineWidth(5)
        self.qwtDial_A3.setFrameShadow(QwtDial.Sunken)
        self.qwtDial_A3.setMode(QwtDial.RotateNeedle)
        self.qwtDial_A3.setOrigin(90.0)
        self.qwtDial_A3.setWrapping(False)
        self.qwtDial_A3.setObjectName(_fromUtf8(« qwtDial_A3 »))
        self.qwtDial_A1 = QwtDial(Form)
        self.qwtDial_A1.setGeometry(QtCore.QRect(240, 235, 175, 175))
        self.qwtDial_A1.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
        self.qwtDial_A1.setReadOnly(True)
        self.qwtDial_A1.setLineWidth(5)
        self.qwtDial_A1.setFrameShadow(QwtDial.Sunken)
        self.qwtDial_A1.setMode(QwtDial.RotateNeedle)
        self.qwtDial_A1.setOrigin(90.0)
        self.qwtDial_A1.setWrapping(False)
        self.qwtDial_A1.setObjectName(_fromUtf8(« qwtDial_A1 »))
        self.qwtDial_A4 = QwtDial(Form)
        self.qwtDial_A4.setGeometry(QtCore.QRect(610, 235, 175, 175))
        self.qwtDial_A4.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
        self.qwtDial_A4.setReadOnly(True)
        self.qwtDial_A4.setLineWidth(5)
        self.qwtDial_A4.setFrameShadow(QwtDial.Sunken)
        self.qwtDial_A4.setMode(QwtDial.RotateNeedle)
        self.qwtDial_A4.setOrigin(90.0)
        self.qwtDial_A4.setWrapping(False)
        self.qwtDial_A4.setObjectName(_fromUtf8(« qwtDial_A4 »))
        self.qwtDial_A2 = QwtDial(Form)
        self.qwtDial_A2.setGeometry(QtCore.QRect(235, 465, 175, 175))
        self.qwtDial_A2.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
        self.qwtDial_A2.setReadOnly(True)
        self.qwtDial_A2.setLineWidth(5)
        self.qwtDial_A2.setFrameShadow(QwtDial.Sunken)
        self.qwtDial_A2.setMode(QwtDial.RotateNeedle)
        self.qwtDial_A2.setOrigin(90.0)
        self.qwtDial_A2.setWrapping(False)
        self.qwtDial_A2.setObjectName(_fromUtf8(« qwtDial_A2 »))
        self.qwtDial_A5 = QwtDial(Form)
        self.qwtDial_A5.setGeometry(QtCore.QRect(605, 465, 175, 175))
        self.qwtDial_A5.setStyleSheet(_fromUtf8(« font: 6pt \ »DejaVu Sans\ »; »))
        self.qwtDial_A5.setReadOnly(True)
        self.qwtDial_A5.setLineWidth(5)
        self.qwtDial_A5.setFrameShadow(QwtDial.Sunken)
        self.qwtDial_A5.setMode(QwtDial.RotateNeedle)
        self.qwtDial_A5.setOrigin(90.0)
        self.qwtDial_A5.setWrapping(False)
        self.qwtDial_A5.setObjectName(_fromUtf8(« qwtDial_A5 »))
        self.labelFinLigne = QtGui.QLabel(Form)
        self.labelFinLigne.setGeometry(QtCore.QRect(0, 180, 71, 16))
        self.labelFinLigne.setObjectName(_fromUtf8(« labelFinLigne »))
        self.labelChaineEnvoi = QtGui.QLabel(Form)
        self.labelChaineEnvoi.setGeometry(QtCore.QRect(0, 140, 121, 16))
        self.labelChaineEnvoi.setObjectName(_fromUtf8(« labelChaineEnvoi »))
        self.pushButtonEnvoi = QtGui.QPushButton(Form)
        self.pushButtonEnvoi.setGeometry(QtCore.QRect(125, 180, 41, 41))
        self.pushButtonEnvoi.setObjectName(_fromUtf8(« pushButtonEnvoi »))
        self.line_2 = QtGui.QFrame(Form)
        self.line_2.setGeometry(QtCore.QRect(0, 125, 166, 16))
        self.line_2.setFrameShape(QtGui.QFrame.HLine)
        self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
        self.line_2.setObjectName(_fromUtf8(« line_2 »))
        self.lineEditChaineEnvoi = QtGui.QLineEdit(Form)
        self.lineEditChaineEnvoi.setGeometry(QtCore.QRect(0, 155, 166, 23))
        self.lineEditChaineEnvoi.setObjectName(_fromUtf8(« lineEditChaineEnvoi »))
        self.comboBoxFinLigne = QtGui.QComboBox(Form)
        self.comboBoxFinLigne.setGeometry(QtCore.QRect(0, 195, 121, 24))
        self.comboBoxFinLigne.setObjectName(_fromUtf8(« comboBoxFinLigne »))
        self.comboBoxFinLigne.addItem(_fromUtf8(«  »))
        self.comboBoxFinLigne.addItem(_fromUtf8(«  »))
        self.comboBoxFinLigne.addItem(_fromUtf8(«  »))
        self.comboBoxFinLigne.addItem(_fromUtf8(«  »))
        self.line_3 = QtGui.QFrame(Form)
        self.line_3.setGeometry(QtCore.QRect(0, 220, 166, 16))
        self.line_3.setFrameShape(QtGui.QFrame.HLine)
        self.line_3.setFrameShadow(QtGui.QFrame.Sunken)
        self.line_3.setObjectName(_fromUtf8(« line_3 »))

        self.retranslateUi(Form)
        self.comboBoxFinLigne.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate(« Form », « PyQt + PyQwt +PySerial : QwtDial x6 affiche can brute (0-1023) convertie en unité voulue. « , None, QtGui.QApplication.UnicodeUTF8))
        self.labelDebit.setText(QtGui.QApplication.translate(« Form », « Débit Série (bauds) : », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxPort.setItemText(0, QtGui.QApplication.translate(« Form », « /dev/ttyACM0 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxPort.setItemText(1, QtGui.QApplication.translate(« Form », « /dev/ttyACM1 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxPort.setItemText(2, QtGui.QApplication.translate(« Form », « /dev/ttyUSB0 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxPort.setItemText(3, QtGui.QApplication.translate(« Form », « /dev/ttyUSB1 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelReception.setText(QtGui.QApplication.translate(« Form », « Réception sur le port série : « , None, QtGui.QApplication.UnicodeUTF8))
        self.pushButtonInitSerial.setText(QtGui.QApplication.translate(« Form », « Initialiser », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(0, QtGui.QApplication.translate(« Form », « 115200 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(1, QtGui.QApplication.translate(« Form », « 57600 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(2, QtGui.QApplication.translate(« Form », « 38400 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(3, QtGui.QApplication.translate(« Form », « 28800 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(4, QtGui.QApplication.translate(« Form », « 19200 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(5, QtGui.QApplication.translate(« Form », « 14400 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(6, QtGui.QApplication.translate(« Form », « 9600 », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxDebit.setItemText(7, QtGui.QApplication.translate(« Form », « 4800 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelPort.setText(QtGui.QApplication.translate(« Form », « Port Série : », None, QtGui.QApplication.UnicodeUTF8))
        self.pushButtonStop.setText(QtGui.QApplication.translate(« Form », « Stop », None, QtGui.QApplication.UnicodeUTF8))
        self.labelVoie_A0.setText(QtGui.QApplication.translate(« Form », « Voie analogique A0 : », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditValeurMax_A2.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelVoie_A2.setText(QtGui.QApplication.translate(« Form », « Voie analogique A2 : », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditUnite_A0.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
        self.labelValeurMaxMin_A1.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
        self.labelVoie_A5.setText(QtGui.QApplication.translate(« Form », « Voie analogique A5 : », None, QtGui.QApplication.UnicodeUTF8))
        self.labelUnite_A0.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
        self.labelValeurMaxMin_A2.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
        self.labelValeurMaxMin_A0.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
        self.labelUnite_A2.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditUnite_A3.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
        self.labelVoie_A1.setText(QtGui.QApplication.translate(« Form », « Voie analogique A1 : », None, QtGui.QApplication.UnicodeUTF8))
        self.labelUnite_A4.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditUnite_A2.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
        self.labelVoie_A4.setText(QtGui.QApplication.translate(« Form », « Voie analogique A4 : », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditValeurMin_A4.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelTraceEnvoiSerie.setText(QtGui.QApplication.translate(« Form », « Envoi sur le port série : « , None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditValeurMin_A1.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelValeurMaxMin_A4.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditValeurMin_A5.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditValeurMax_A5.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelUnite_A3.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
        self.labelVoie_A3.setText(QtGui.QApplication.translate(« Form », « Voie analogique A3 : », None, QtGui.QApplication.UnicodeUTF8))
        self.labelRacineChaine.setText(QtGui.QApplication.translate(« Form », « Racine à utiliser », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditUnite_A5.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditUnite_A4.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
        self.labelTraceAnalyseChaine.setText(QtGui.QApplication.translate(« Form », « Analyse de la chaine recue : « , None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditRacineChaine.setText(QtGui.QApplication.translate(« Form », « CAN », None, QtGui.QApplication.UnicodeUTF8))
        self.labelValeurMaxMin_A3.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditValeurMin_A0.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditValeurMax_A1.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditValeurMax_A0.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditValeurMax_A3.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditUnite_A1.setText(QtGui.QApplication.translate(« Form », « mV », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditValeurMin_A3.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditValeurMin_A2.setText(QtGui.QApplication.translate(« Form », « 0 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelValeurMaxMin_A5.setText(QtGui.QApplication.translate(« Form », « Valeurs max/min », None, QtGui.QApplication.UnicodeUTF8))
        self.labelUnite_A1.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditValeurMax_A4.setText(QtGui.QApplication.translate(« Form », « 5000 », None, QtGui.QApplication.UnicodeUTF8))
        self.labelUnite_A5.setText(QtGui.QApplication.translate(« Form », « Unité : », None, QtGui.QApplication.UnicodeUTF8))
        self.labelFinLigne.setText(QtGui.QApplication.translate(« Form », « Fin de ligne : », None, QtGui.QApplication.UnicodeUTF8))
        self.labelChaineEnvoi.setText(QtGui.QApplication.translate(« Form », « Chaîne à envoyer : », None, QtGui.QApplication.UnicodeUTF8))
        self.pushButtonEnvoi.setText(QtGui.QApplication.translate(« Form », « Envoi », None, QtGui.QApplication.UnicodeUTF8))
        self.lineEditChaineEnvoi.setText(QtGui.QApplication.translate(« Form », « CAN(12,23,45) », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxFinLigne.setItemText(0, QtGui.QApplication.translate(« Form », « Rien », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxFinLigne.setItemText(1, QtGui.QApplication.translate(« Form », « Saut de ligne (\\n = LF) », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxFinLigne.setItemText(2, QtGui.QApplication.translate(« Form », « Retour Chariot (\\r = CR) », None, QtGui.QApplication.UnicodeUTF8))
        self.comboBoxFinLigne.setItemText(3, QtGui.QApplication.translate(« Form », « Les 2 (LF + CR) », None, QtGui.QApplication.UnicodeUTF8))

from PyQt4.Qwt5 import * # module Qwt

if __name__ == « __main__ »:
    import sys
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

 

Le fichier d’application *Main.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Par X. HINAULT – Tous droits réservés – GPLv3
# Jan 2013 – www.mon-club-elec.fr

# — importation des modules utiles —
from PyQt4.QtGui import *
from PyQt4.QtCore import * # inclut Qtimer..

import os,sys

import serial # communication serie
from PyQt4.Qwt5 import * # module Qwt
import re # module pour analyse de chaîne avec expressions régulières
from PyQt4.Qwt5.anynumpy import * # pour les fonctions math..
from numpy import interp # pour équivalent map

# — importation du fichier de description GUI —
from tuto_pyqt_pyqwt_pyserial_qwtdial_can_brutex6_lineedit import *

# classe principale contenant le code actif
class myApp(QWidget, Ui_Form): # la classe reçoit le Qwidget principal ET la classe définie dans test.py obtenu avec pyuic4

        # Note : ici self représente la classe

        def __init__(self, parent=None):
                QWidget.__init__(self) # initialise le Qwidget principal
                self.setupUi(parent) # Obligatoire

                # —— code actif initial ——

                #Réalisez les connexions supplémentaires entre signaux et slots
                self.connect(self.pushButtonInitSerial, SIGNAL(« clicked() »), self.pushButtonInitSerialClicked)
                self.connect(self.pushButtonEnvoi, SIGNAL(« clicked() »), self.pushButtonEnvoiClicked)
                self.connect(self.pushButtonStop, SIGNAL(« clicked() »), self.pushButtonStopClicked)

                #initialisation Timer
                self.timer=QTimer() # déclare un timer Qt
                self.connect(self.timer, SIGNAL(« timeout() »), self.timerEvent) # connecte le signal timeOut de l’objet timer à l’appel de la fonction voulue

                #— déclaration utiles —
                self.serialPort=None # déclaration initiale
                self.chaineIn=«  » # variable pour réception

                #===== Initialisation QwtDial A0========

                #– définition plage des valeurs du QwtDial
                # void  setRange (double vmin, double vmax, double vstep=0.0, int pagesize=1)
                self.qwtDial_A0.setRange(0, 1023.0)  # modifie la plage de valeurs de l’afficheur

                #– paramétrage initial du QwtDial —
                self.qwtDial_A0.setOrigin(90.0) # point de référence du tracé – 0°=3H, 90° = 6H, etc..
                #self.qwtDial.setScaleArc(90.0, 270.0) # angle début / angle fin du tracé par rapport à l’origine
                self.qwtDial_A0.setScaleArc(45.0, 315.0) # angle début / angle fin du tracé par rapport à l’origine
                self.qwtDial_A0.setScale(0.0,10.0,100.0) # valeur min/max/pas des graduations de l’échelle – ici pas de 10 avec 10 intermédiaires

                #– création de l’aiguille et association au QwtDial
                #QwtDialSimpleNeedle    (       Style   style, bool     hasKnob = true, const QColor &          mid = Qt::gray, const QColor &          base = Qt::darkGray )
                aiguille_A0=QwtDialSimpleNeedle(QwtDialSimpleNeedle.Arrow,True,QColor(Qt.red),QColor(Qt.blue)) # défini un QwtDialSimpleNeedle = aiguille simple
                # .Arrow = style aiguille « flèche » | .Ray = style simple ligne
                self.qwtDial_A0.setNeedle(aiguille_A0) # associe l’aiguille au QwtDial

                #– paramétrage de l’aiguille
                aiguille_A0.setWidth(6.0) # fixe la largeur de l’aiguille

                #===== Initialisation QwtDial A1========

                #– définition plage des valeurs du QwtDial
                # void  setRange (double vmin, double vmax, double vstep=0.0, int pagesize=1)
                self.qwtDial_A1.setRange(0, 1023.0)  # modifie la plage de valeurs de l’afficheur

                #– paramétrage initial du QwtDial —
                self.qwtDial_A1.setOrigin(90.0) # point de référence du tracé – 0°=3H, 90° = 6H, etc..
                #self.qwtDial.setScaleArc(90.0, 270.0) # angle début / angle fin du tracé par rapport à l’origine
                self.qwtDial_A1.setScaleArc(45.0, 315.0) # angle début / angle fin du tracé par rapport à l’origine
                self.qwtDial_A1.setScale(0.0,10.0,100.0) # valeur min/max/pas des graduations de l’échelle – ici pas de 10 avec 10 intermédiaires

                #– création de l’aiguille et association au QwtDial
                #QwtDialSimpleNeedle    (       Style   style, bool     hasKnob = true, const QColor &          mid = Qt::gray, const QColor &          base = Qt::darkGray )
                aiguille_A1=QwtDialSimpleNeedle(QwtDialSimpleNeedle.Arrow,True,QColor(Qt.red),QColor(Qt.blue)) # défini un QwtDialSimpleNeedle = aiguille simple
                # .Arrow = style aiguille « flèche » | .Ray = style simple ligne
                self.qwtDial_A1.setNeedle(aiguille_A0) # associe l’aiguille au QwtDial

                #– paramétrage de l’aiguille
                aiguille_A1.setWidth(6.0) # fixe la largeur de l’aiguille

                #===== Initialisation QwtDial A2========

                #– définition plage des valeurs du QwtDial
                # void  setRange (double vmin, double vmax, double vstep=0.0, int pagesize=1)
                self.qwtDial_A2.setRange(0, 1023.0)  # modifie la plage de valeurs de l’afficheur

                #– paramétrage initial du QwtDial —
                self.qwtDial_A2.setOrigin(90.0) # point de référence du tracé – 0°=3H, 90° = 6H, etc..
                #self.qwtDial.setScaleArc(90.0, 270.0) # angle début / angle fin du tracé par rapport à l’origine
                self.qwtDial_A2.setScaleArc(45.0, 315.0) # angle début / angle fin du tracé par rapport à l’origine
                self.qwtDial_A2.setScale(0.0,10.0,100.0) # valeur min/max/pas des graduations de l’échelle – ici pas de 10 avec 10 intermédiaires

                #– création de l’aiguille et association au QwtDial
                #QwtDialSimpleNeedle    (       Style   style, bool     hasKnob = true, const QColor &          mid = Qt::gray, const QColor &          base = Qt::darkGray )
                aiguille_A2=QwtDialSimpleNeedle(QwtDialSimpleNeedle.Arrow,True,QColor(Qt.red),QColor(Qt.blue)) # défini un QwtDialSimpleNeedle = aiguille simple
                # .Arrow = style aiguille « flèche » | .Ray = style simple ligne
                self.qwtDial_A2.setNeedle(aiguille_A0) # associe l’aiguille au QwtDial

                #– paramétrage de l’aiguille
                aiguille_A2.setWidth(6.0) # fixe la largeur de l’aiguille

                #===== Initialisation QwtDial A3========

                #– définition plage des valeurs du QwtDial
                # void  setRange (double vmin, double vmax, double vstep=0.0, int pagesize=1)
                self.qwtDial_A3.setRange(0, 1023.0)  # modifie la plage de valeurs de l’afficheur

                #– paramétrage initial du QwtDial —
                self.qwtDial_A3.setOrigin(90.0) # point de référence du tracé – 0°=3H, 90° = 6H, etc..
                #self.qwtDial.setScaleArc(90.0, 270.0) # angle début / angle fin du tracé par rapport à l’origine
                self.qwtDial_A3.setScaleArc(45.0, 315.0) # angle début / angle fin du tracé par rapport à l’origine
                self.qwtDial_A3.setScale(0.0,10.0,100.0) # valeur min/max/pas des graduations de l’échelle – ici pas de 10 avec 10 intermédiaires

                #– création de l’aiguille et association au QwtDial
                #QwtDialSimpleNeedle    (       Style   style, bool     hasKnob = true, const QColor &          mid = Qt::gray, const QColor &          base = Qt::darkGray )
                aiguille_A3=QwtDialSimpleNeedle(QwtDialSimpleNeedle.Arrow,True,QColor(Qt.red),QColor(Qt.blue)) # défini un QwtDialSimpleNeedle = aiguille simple
                # .Arrow = style aiguille « flèche » | .Ray = style simple ligne
                self.qwtDial_A3.setNeedle(aiguille_A0) # associe l’aiguille au QwtDial

                #– paramétrage de l’aiguille
                aiguille_A3.setWidth(6.0) # fixe la largeur de l’aiguille

                #===== Initialisation QwtDial A4========

                #– définition plage des valeurs du QwtDial
                # void  setRange (double vmin, double vmax, double vstep=0.0, int pagesize=1)
                self.qwtDial_A4.setRange(0, 1023.0)  # modifie la plage de valeurs de l’afficheur

                #– paramétrage initial du QwtDial —
                self.qwtDial_A4.setOrigin(90.0) # point de référence du tracé – 0°=3H, 90° = 6H, etc..
                #self.qwtDial.setScaleArc(90.0, 270.0) # angle début / angle fin du tracé par rapport à l’origine
                self.qwtDial_A4.setScaleArc(45.0, 315.0) # angle début / angle fin du tracé par rapport à l’origine
                self.qwtDial_A4.setScale(0.0,10.0,100.0) # valeur min/max/pas des graduations de l’échelle – ici pas de 10 avec 10 intermédiaires

                #– création de l’aiguille et association au QwtDial
                #QwtDialSimpleNeedle    (       Style   style, bool     hasKnob = true, const QColor &          mid = Qt::gray, const QColor &          base = Qt::darkGray )
                aiguille_A4=QwtDialSimpleNeedle(QwtDialSimpleNeedle.Arrow,True,QColor(Qt.red),QColor(Qt.blue)) # défini un QwtDialSimpleNeedle = aiguille simple
                # .Arrow = style aiguille « flèche » | .Ray = style simple ligne
                self.qwtDial_A4.setNeedle(aiguille_A0) # associe l’aiguille au QwtDial

                #– paramétrage de l’aiguille
                aiguille_A4.setWidth(6.0) # fixe la largeur de l’aiguille

                #===== Initialisation QwtDial A5========

                #– définition plage des valeurs du QwtDial
                # void  setRange (double vmin, double vmax, double vstep=0.0, int pagesize=1)
                self.qwtDial_A5.setRange(0, 1023.0)  # modifie la plage de valeurs de l’afficheur

                #– paramétrage initial du QwtDial —
                self.qwtDial_A5.setOrigin(90.0) # point de référence du tracé – 0°=3H, 90° = 6H, etc..
                #self.qwtDial.setScaleArc(90.0, 270.0) # angle début / angle fin du tracé par rapport à l’origine
                self.qwtDial_A5.setScaleArc(45.0, 315.0) # angle début / angle fin du tracé par rapport à l’origine
                self.qwtDial_A5.setScale(0.0,10.0,100.0) # valeur min/max/pas des graduations de l’échelle – ici pas de 10 avec 10 intermédiaires

                #– création de l’aiguille et association au QwtDial
                #QwtDialSimpleNeedle    (       Style   style, bool     hasKnob = true, const QColor &          mid = Qt::gray, const QColor &          base = Qt::darkGray )
                aiguille_A5=QwtDialSimpleNeedle(QwtDialSimpleNeedle.Arrow,True,QColor(Qt.red),QColor(Qt.blue)) # défini un QwtDialSimpleNeedle = aiguille simple
                # .Arrow = style aiguille « flèche » | .Ray = style simple ligne
                self.qwtDial_A5.setNeedle(aiguille_A0) # associe l’aiguille au QwtDial

                #– paramétrage de l’aiguille
                aiguille_A5.setWidth(6.0) # fixe la largeur de l’aiguille

        #— les fonctions appelées, utilisées par les signaux
        def pushButtonInitSerialClicked(self):
                print(« Bouton Init cliqué »)
                if self.serialPort: # si le port existe déjà
                        self.serialPort.close() # ferme le port si existe

                # — initialise paramètres initialisation
                if self.comboBoxPort.currentText()==«  » : # si le champ d’initialisation Port est vide = initialisation par défaut
                        strPortInit=« /dev/ttyACM0 » # port par défaut
                else :
                        strPortInit=str(self.comboBoxPort.currentText()) #sinon utilise paramètre champ texte pour le port

                strDebitInit=str(self.comboBoxDebit.currentText()) # paramètre champ texte pour debit

                #— initialisation série avec gestion erreur —                      
                try: # essaie d’exécuter les instructions
                        # initialise port serie avec délai attente en réception en sec
                        self.serialPort=serial.Serial(strPortInit, strDebitInit, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE, 0.100)                     
                        #self.serialPort=serial.Serial(strPortInit, strDebitInit) # initialise port serie forme réduite
                        self.serialPort.flushInput() # vide la file d’attente série
                        print(« Initialisation Port Série : «  + strPortInit + » @ «  + strDebitInit + » = OK « ) # affiche debug

                        #– change aspect bouton init
                        self.pushButtonInitSerial.setStyleSheet(QString.fromUtf8(« background-color: rgb(0, 255, 0); »)) # bouton en vert
                        self.pushButtonInitSerial.setText(« Connexion OK »)  # change titre bouton

                except: # si erreur initialisation
                        print(« Erreur initialisation Série »)           

                        #– change aspect bouton init
                        self.pushButtonInitSerial.setStyleSheet(QString.fromUtf8(« background-color: rgb(255, 127, 0); »)) # bouton en orange
                        self.pushButtonInitSerial.setText(QString.fromUtf8(« Non connecté »))  # change titre bouton

                self.timer.start(100) # lance le timer avec délai en ms – 10 pour réception rapide
                # pour optimiser la réception d’une chaîne envoyée à répétition, utiliser une valeur similaire à la valeur d’émission sur le port série

        #– bouton envoi
        def pushButtonEnvoiClicked(self): # lors appui bouton envoi série du champ du Terminal Série
                print(« Bouton ENVOI appuyé »)
                self.envoiChaineSerie(str(self.lineEditChaineEnvoi.text())) # envoi le contenu du champ texte sur le port série

                #—– fonction de classe commune d’envoi d’une chaîne sur le port série —-
        def envoiChaineSerie(self, chaineIn): # la fonction reçoit un objet chaîne Str

                if self.serialPort: # seulement si le port série existe – n’existe pas (=None) tant que pas initialisé

                        self.timer.stop() # stoppe le timer le temps d’envoyer message sur le port série               

                        # combobox avec index 0 = rien, 1=saut de ligne (LF), 2=retour chariot (CR), 3= les 2 LF+CR
                        if self.comboBoxFinLigne.currentIndex()==0: # si rien sélectionné
                                # self.serialPort.write(str(self.lineEditChaineEnvoi.text())+’\n’  ) # envoie la chaine sur le port serie              
                                self.serialPort.write(chaineIn)  # envoie la chaine sur le port serie   – variante ascii       
                                print(« Envoi Série : «  + chaineIn )
                                self.textEditTraceEnvoiSerie.append(chaineIn) # ajoute texteEdit de visualisation

                        if self.comboBoxFinLigne.currentIndex()==1: # si saut de ligne sélectionné
                                self.serialPort.write(chaineIn +chr(10) ) # envoie la chaine sur le port serie  – variante ascii       
                                print(« Envoi Série : «  + chaineIn + \n)
                                self.textEditTraceEnvoiSerie.append(chaineIn) # ajoute texteEdit de visualisation

                        if self.comboBoxFinLigne.currentIndex()==2: # si retour chariot sélectionné
                                self.serialPort.write(chaineIn+chr(13)  ) # envoie la chaine sur le port serie  – variante ascii       
                                print(« Envoi Série : «  + chaineIn + \r)
                                self.textEditTraceEnvoiSerie.append(chaineIn) # ajoute texteEdit de visualisation

                        if self.comboBoxFinLigne.currentIndex()==3: # si saut de ligne + retour chariot sélectionné
                                self.serialPort.write(chaineIn+chr(10)+chr(13)  ) # envoie la chaine sur le port serie  – variante ascii
                                print(« Envoi Série : «  + chaineIn + \n+\r)
                                self.textEditTraceEnvoiSerie.append(chaineIn) # ajoute texteEdit de visualisation

                        self.timer.start() # redémarre le timer – laisse délai pour réception en réinitialisation Timer à 0
                        # car sinon l’appui survient n’importe quand et si survient peu de temps avant fin délai
                        # la réception est hachée

        #— fin envoiChaineSerie

        #– bouton stop
        def pushButtonStopClicked(self):
                print(« Bouton Stop cliqué »)

                #– stoppe la réception série —
                if self.serialPort: # si le port existe déjà
                        self.serialPort.close() # ferme le port si existe
                        self.timer.stop() # stoppe le timer

                #– change aspect bouton init
                self.pushButtonInitSerial.setStyleSheet(QString.fromUtf8(« background-color: rgb(255, 127, 0); »)) # bouton en orange
                self.pushButtonInitSerial.setText(QString.fromUtf8(« Non connecté »))  # change titre bouton

        #—– fonction de gestion du signal timeout du QTimer
        def timerEvent(self): # fonction appelée lors de la survenue d’un évènement Timer – nom fonction indiférrent
                #– variables de réception —
                self.chaineIn=«  »;
                self.char=«  »;

                # lecture des données reçues           
                if self.serialPort: # seulement si le port série existe
                        self.timer.stop() # stoppe le timer le temps de lire les caractères et éviter « réentrée »

                        while (self.serialPort.inWaiting()): # tant que au moins un caractère en réception
                                self.char=self.serialPort.read() # on lit le caractère
                                #self.chaineIn=self.chaineIn+self.char          # forme minimale…

                                if self.char==\n: # si saut de ligne, on sort du while
                                        print(« saut ligne reçu ») # debug
                                        break # sort du while
                                else: #tant que c’est pas le saut de ligne, on l’ajoute à la chaine
                                        self.chaineIn=self.chaineIn+self.char                                  

                        if len(self.chaineIn)>0: # … pour ne pas avoir d’affichage si «  »     
                                print(self.chaineIn) # affiche la chaîne
                                self.textEditReception.append(self.chaineIn[:-1]) # ajoute le texte au textEdit en enlevant le dernier caractère (saut de ligne)
                                valeursCan=self.analyseChaine(self.chaineIn[:-1], str(self.lineEditRacineChaine.text())) # appelle la fonction d’analyse de chaine – renvoie liste Arguments
                                # l’utilisation de :-1 couplé à l’utilisation de )$ ci-dessous impose une fin de chaîne par ) une fois le saut de ligne enlevé

                                # — affiche les valeurs dans les LCDNumbers —
                                if valeursCan!=None: # si la liste des arguments n’est pas vide
                                        for i in range(0,len(valeursCan)): # défile indice args – attention range c’est valeur de départ, nombre de valeur donc range(0,3) défile de 0 à 2 !
                                                valeur=int(valeursCan[i])
                                                if i==0 :
                                                        self.lcdNumber_A0.display(valeur) # affiche la valeur dans le LCDNumber voulu
                                                        self.qwtDial_A0.setValue(valeur) # fixe la valeur du qwtDial à partir de la valeur reçue sur port série
                                                        # équiv map : interp(256,[1,512],[5,10]) (package numpy)
                                                        valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A0.text()),float(self.lineEditValeurMax_A0.text())]) # équiv map
                                                        self.lcdNumberValeurCalc_A0.display(valeurCalc)

                                                if i==1 :
                                                        self.lcdNumber_A1.display(valeur) # affiche la valeur dans le LCDNumber voulu
                                                        self.qwtDial_A1.setValue(valeur) # fixe la valeur du qwtDial à partir de la valeur reçue sur port série
                                                        # équiv map : interp(256,[1,512],[5,10]) (package numpy)
                                                        valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A1.text()),float(self.lineEditValeurMax_A1.text())]) # équiv map
                                                        self.lcdNumberValeurCalc_A1.display(valeurCalc)

                                                if i==2 :
                                                        self.lcdNumber_A2.display(valeur) # affiche la valeur dans le LCDNumber voulu
                                                        self.qwtDial_A2.setValue(valeur) # fixe la valeur du qwtDial à partir de la valeur reçue sur port série
                                                        # équiv map : interp(256,[1,512],[5,10]) (package numpy)
                                                        valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A2.text()),float(self.lineEditValeurMax_A2.text())]) # équiv map
                                                        self.lcdNumberValeurCalc_A2.display(valeurCalc)

                                                if i==3 :
                                                        self.lcdNumber_A3.display(valeur) # affiche la valeur dans le LCDNumber voulu
                                                        self.qwtDial_A3.setValue(valeur) # fixe la valeur du qwtDial à partir de la valeur reçue sur port série                                                
                                                        # équiv map : interp(256,[1,512],[5,10]) (package numpy)
                                                        valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A3.text()),float(self.lineEditValeurMax_A3.text())]) # équiv map
                                                        self.lcdNumberValeurCalc_A3.display(valeurCalc)

                                                if i==4 :
                                                        self.lcdNumber_A4.display(valeur) # affiche la valeur dans le LCDNumber voulu
                                                        self.qwtDial_A4.setValue(valeur) # fixe la valeur du qwtDial à partir de la valeur reçue sur port série
                                                        # équiv map : interp(256,[1,512],[5,10]) (package numpy)
                                                        valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A4.text()),float(self.lineEditValeurMax_A4.text())]) # équiv map
                                                        self.lcdNumberValeurCalc_A4.display(valeurCalc)

                                                if i==5 :
                                                        self.lcdNumber_A5.display(valeur) # affiche la valeur dans le LCDNumber voulu
                                                        self.qwtDial_A5.setValue(valeur) # fixe la valeur du qwtDial à partir de la valeur reçue sur port série
                                                        # équiv map : interp(256,[1,512],[5,10]) (package numpy)
                                                        valeurCalc=interp(valeur, [0,1023],[float(self.lineEditValeurMin_A5.text()),float(self.lineEditValeurMax_A5.text())]) # équiv map
                                                        self.lcdNumberValeurCalc_A5.display(valeurCalc)

                                        # fin for

                                # fin if valeursCan!= None

                        self.timer.start() # redémarre le timer

        #—- fin timerEvent

        #—- fonction analyse de chaine —
        def analyseChaine(self, chaineIn, chaineRacineIn): # fonction reçoit chaine à analyser et la racine à utiliser – reconnaît fonction racine(**,**, ..,**)

                args=None # valeur par défaut de args
                flagRacine=False # drapeau racine OK

                self.textEditTraceAnalyseChaine.setText(QString.fromUtf8(« Chaine à analyser : «  + chaineIn)) # trace analyse chaine

                #result=re.findall(r’^.*\((.*)\).*$’,chaineIn) # extrait ** de la chaine au format –(**) si la chaîne est au format valide  
                result=re.findall(r‘^.*\((.*)\)$’,chaineIn) # extrait ** de la chaine au format –(**) si la chaîne est au format valide  
                self.textEditTraceAnalyseChaine.append(str(len(result)) + QString.fromUtf8( » chaine valide »)) # trace analyse chaine

                #racine=re.findall(r’^(.*)\(.*\).*$’,chaineIn) # extrait ** de la chaine au format **(–) si la chaîne est au format valide  
                racine=re.findall(r‘^(.*)\(.*\),chaineIn) # extrait ** de la chaine au format **(–) si la chaîne est au format valide  
                self.textEditTraceAnalyseChaine.append(str(len(racine)) + QString.fromUtf8( » racine valide »)) # trace analyse chaine

                #– analyse racine —          
                if len(racine)==1:
                        self.textEditTraceAnalyseChaine.append(QString.fromUtf8(« Racine reçue : « )+ racine[0]) # trace analyse chaine

                        if racine[0] == str(chaineRacineIn):
                                self.textEditTraceAnalyseChaine.append(QString.fromUtf8(« Racine reçue conforme »))# trace analyse chaine
                                flagRacine=True # flag racine OK
                        else:
                                self.textEditTraceAnalyseChaine.append(QString.fromUtf8(« Racine reçue non conforme »))# trace analyse chaine
                        # fin else

                # fin if

                if len(result)==1 and flagRacine: # si une seule chaine valide détectée et que la racine OK
                        #self.textEditTraceAnalyseChaine.append(QString.fromUtf8(result[0])) # trace analyse chaine : affiche la chaine des arguments
                        self.textEditTraceAnalyseChaine.append(QString.fromUtf8(« Paramètres reçus : »)) # trace analyse chaine : affiche la chaine des arguments
                        args=result[0].split(‘,’) # récupère la liste des arguments séparés par une parenthèse
                        self.textEditTraceAnalyseChaine.append(QString.fromUtf8(str(args))) # trace analyse chaine : affiche la liste des arguments

                        # boucle sans l’indice
                        #for valeur in args: # défile les arguments de la liste
                                #self.textEditTraceAnalyseChaine.append(QString.fromUtf8(str(valeur))) # trace analyse chaine : affiche la liste des arguments

                        # boucle avec indice
                        for i in range(0,len(args)): # défile indice args – attention range c’est valeur de départ, nombre de valeur donc range(0,3) défile de 0 à 2 !
                                valeur=int(args[i])
                                self.textEditTraceAnalyseChaine.append(QString.fromUtf8(str(valeur))) # trace analyse chaine : affiche la liste des valeurs int des arguments

                return args # renvoie la liste des arguments – None si pas d’arguments

                # pour tester en Terminal Python
                # analyse de la chaine
                        #chaine= »CAN(123,122,121) »
                        # result=re.findall(r’^.*\((.*)\)’,chaine) # extrait –(**)
                        # result=re.findall(r’^.*\((.*,.*,.*)\)’,chaine) # extrait –(*,*,*) = 3 paramètres
                        # sub=result[0].split(‘,’)
                        # print sub
                        # => 123, 122, 121
                        # print len(sub)
                        # => 3
                        # print int(sub[0])
                        # => 123

# fonction principale exécutant l’application Qt                       
def main(args):
        a=QApplication(args) # crée l’objet application
        f=QWidget() # crée le QWidget racine
        c=myApp(f) # appelle la classe contenant le code de l’application
        f.show() # affiche la fenêtre QWidget
        r=a.exec_() # lance l’exécution de l’application
        return r

# pour rendre le fichier *.py exécutable
if __name__==« __main__ »: # pour rendre le code exécutable
        main(sys.argv) # appelle la fonction main
 

Code Arduino d’exemple

// — constantes des broches —

const int RVar=0; //declaration constante de broche analogique

// — Déclaration des variables globales —
int mesureBrute=0;// Variable pour acquisition résultat brut de conversion analogique numérique

//**************** FONCTION SETUP = Code d’initialisation *****

void setup()   { // debut de la fonction setup()

Serial.begin(115200); // initialise connexion série à 115200 bauds
// IMPORTANT : régler le terminal côté PC avec la même valeur de transmission

} // fin de la fonction setup()

//***** FONCTION LOOP = Boucle sans fin *****

void loop(){ // debut de la fonction loop()

// envoi de la chaine sous la forme CAN(xxx,xxx,xxx,xxx,xxx,xxx)
  Serial.print(« CAN(« );

for (int i=0; i<6; i++) {

  // acquisition conversion analogique-numerique (CAN) sur la voie analogique
  mesureBrute=analogRead(i);

  // affiche valeur numerique entière ou à virgule au format décimal
  if (i>0 ) Serial.print(« , »);
  Serial.print(mesureBrute);
} // fin for

Serial.println(« ) »);

delay(500);

} // fin de la fonction loop() – le programme recommence au début de la fonction loop sans fin
 

Utilisation

  • Les 2 fichiers suivants sont à enregistrer dans un même répertoire, l’un en nom.py et l’autre en nomMain.py.
  • Puis lancer l’application depuis Geany ou équivalent, en exécutant le fichier nomMain.py
  • Les 6 afficheurs à aiguilles varient en fonction de l’état des broches analogiques.
Noter cet article

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Archive Mon Club Elec

Articles populaires

Newsletter

Inscrivez-vous maintenant et bénéficiez d'un soutien continu pour réaliser vos travaux électriques en toute sécurité.