View  Edit  Attributes  History  Attach  Print  Search

PYQTLAB

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

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.