IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GUI Python Discussion :

Moniteur série Python/Arduino


Sujet :

GUI Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 24
    Points : 11
    Points
    11
    Par défaut Moniteur série Python/Arduino
    Bonjour, j'aimerai réaliser une sorte de moniteur série sur tkinter qui recoit les infos envoyées sur le port série par l'Arduino et les affiche sur un widget texte. J'ai déjà ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    from tkinter import *
    import tkinter as tk
    import tkinter.messagebox
    import tkinter.filedialog
    from PIL import ImageTk, Image
    import serial
     
     
    #CRéation de la fenetre
    root = tk.Tk() #On initialise la fenetre
    root.title('Inetrface')#On nomme la fenetre
     
     
     
     
    #Creation de l'arriere plan et de la taille de la fenetee
    image1 = ImageTk.PhotoImage(Image.open("Fichiers annexes\Fondd.png"))
    w = image1.width()
    h = image1.height()
    root.geometry("%dx%d+0+0" % (w, h))
    fond = tk.Label(root, image=image1)
    fond.pack()
     
    log = Text( root, width=30, height=30, takefocus=0)
    log.place(x=1300, y=300, anchor='w')
     
    # make a scrollbar
    scrollbar = Scrollbar(root)
    scrollbar.pack(side=RIGHT, fill=Y)
     
    # attach text box to scrollbar
    log.config(yscrollcommand=scrollbar.set)
    scrollbar.config(command=log.yview)
     
     
     
    arduinoData = serial.Serial('COM8',9600)
     
    def quitter():
        root.destroy()
     
     
    def Acqard():
        arduinoData.write(b'1')
     
    def stopacq():
        arduinoData.write(b'2')
     
     
    #Creation du bouton de validation
    Bouton = tk.Button(root, text ="LANCER L'ACQUISITION",command = Acqard, font = ('Calibri', 15),  overrelief= 'ridge', bg= "#922c17", fg ="white")
    Bouton.place(x=765, y=530, anchor='w')
     
    #Création du bouton d'arret de la focntion
    Bouton = tk.Button(root, text ="Arreter le scan",command = stopacq, font = ('Calibri', 15),  overrelief= 'ridge', bg= "#922c17", fg ="white")
    Bouton.place(x=365, y=530, anchor='w')
     
    #Création du bouton de quitter
    Bouton = tk.Button(root, text ='Quitter',command = quitter, font = ('Calibri', 15), overrelief= 'ridge', bg= "#47280C", fg ="white")
    Bouton.place(x=1550, y=900, anchor='se' )
     
     
     
     
    root.mainloop()
     
    while 1:
        var = arduinoData.read()
        log.insert('0.0', var)
     
     
    root.update

    Seulement, le while ne fonctionne pas...

    Des idées?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 435
    Points : 37 020
    Points
    37 020
    Par défaut
    Salut,

    Citation Envoyé par Armusclor Voir le message
    Seulement, le while ne fonctionne pas...

    Des idées?
    Ca ne peut pas fonctionner parce que "root.mainloop()" bloque: les instructions qui viennent après ne sont pas exécutées (ajoutez un "print" pour vous en assurer).

    Après ben, il faut apprendre à programmer avec tkinter, c'est pas si trivial et votre problème ne se résout pas en bougeant 2/3 lignes de code: c'est un soucis côté "conception", penser avec tkinter (et l'Arduino).

    - W

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Ouais je comprends pour la mainloop....
    après je comprends le module tkinter et sait l'utiliser mais je ne vois pas comment arriver à mes fins.
    Evidemment, je ne vous demande pas de faire tout le code a ma place mais est ce que vous auriez au moins des pistes pour m'aiguiller ?
    Merci à vous

  4. #4
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 897
    Points : 3 731
    Points
    3 731
    Par défaut
    Salut,

    J'ai voulu tester mais il manque des choses (les images...).

    Mais tu pourrais ajouter un bouton "start" pour démarrer l’acquisition...

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 435
    Points : 37 020
    Points
    37 020
    Par défaut
    Salut,

    Citation Envoyé par Armusclor Voir le message
    Evidemment, je ne vous demande pas de faire tout le code a ma place mais est ce que vous auriez au moins des pistes pour m'aiguiller ?
    Je peux vous suggérer la lecture des chapitres du Swinnen qui expliquent comment réaliser des taches répétitives avec Tkinter. (çà peut aider à remplacer le while).

    - W

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Salut,

    J'ai voulu tester mais il manque des choses (les images...).

    Mais tu pourrais ajouter un bouton "start" pour démarrer l’acquisition...
    J'ai déja un bouton start qui fonctionne

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 125
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par Armusclor Voir le message
    Bonjour, j'aimerai réaliser une sorte de moniteur série sur tkinter qui recoit les infos envoyées sur le port série par l'Arduino et les affiche sur un widget texte.
    Vu la date de la question je doute que tu sois toujours en quête de réponse (soit tu as trouvé soit tu es passé à autre chose) mais on ne sait jamais...
    Comme j'ai réalisé un programme à la fonction identique voici une piste :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #! /usr/bin/python3
    #  -*- coding: utf-8 -*-
     
    import serial
    from tkinter import *
     
     
    # Creation de la fiche
    form = Tk()
    form.title("read serial with Tkinter")
    form.geometry('800x480')
     
    # Label qui affiche la dernière donnée
    v = StringVar()
    Label(form, textvariable=v).grid(column=0, row=0, sticky = W)
    v.set("no data")
     
     
    # text box
    log = Text (form, width=15, height=20)
    log.grid(column=0, row=1, sticky = W)
     
     
    #configuration du port série
    ser = serial.Serial(
            port='/dev/ttyACM0',
            baudrate = 9600,
            parity = serial.PARITY_NONE,
            stopbits = serial.STOPBITS_ONE,
            bytesize = serial.EIGHTBITS,
            timeout=1
    )
     
    # affichage de la donnée si elle existe        
    def readser():
        x=ser.readline().decode("ascii")
        if len(x) > 0:
            v.set(x)                    # affiche tel que dans le label
            log.insert('0.0', x + '\n') # data + retour chariot dans le widget text
        form.after(10, readser)
     
     
    form.after(100, readser)
     
     
    # On démarre la boucle Tkinter qui s'interrompt quand on ferme la fenêtre
    form.mainloop()
    Notez que ce programme minimaliste à été créé pour tourner sur un raspberry pi, aussi la partie série doit être adaptée si votre programme doit tourner sur un pc windows par exemple.

    Néanmoins les 2 lignes importantes dans l'affichage sont les form.after(100, readser) ligne 40 et 43.

    La méthode .after() dit à TKinter d'appeler une seule fois la fonction de lecture après un temps donné (en ms)

    Ici l'astuce c'est de l'utiliser une première fois pour appeler la fonction de lecture (mais on peut aussi faire un appel de fonction classique, j'ai procédé ainsi pour laisser un délai de 100ms) et une seconde fois dans la fonction de lecture, à la fin dans le but que la fonction s'appelle elle même toute les 10ms.

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/03/2017, 13h27
  2. Réponses: 2
    Dernier message: 19/03/2016, 12h55
  3. [Python 3.X] Communication Serie Python - Arduino : Quelques questions avec Tkinter
    Par litepixel dans le forum Tkinter
    Réponses: 1
    Dernier message: 04/08/2015, 11h42
  4. Réponses: 0
    Dernier message: 21/04/2014, 18h22
  5. [pyserial] lecture port série sur arduino
    Par blaster68 dans le forum Déploiement/Installation
    Réponses: 1
    Dernier message: 07/03/2013, 10h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo