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

Tkinter Python Discussion :

Exécuter une mesure jusqu'à un appui sur un bouton


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2022
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Exécuter une mesure jusqu'à un appui sur un bouton
    Bonjour,

    désolé le titre n'est pas très explicite. Alors voilà ce que je cherche à faire :
    J'affiche une IHM sur laquelle je peux rentrer des données. Quand on appui sur un bouton "commencer messure", une trame est envoyé sur la broche Tx du GPIO puis on reçoit la réponse de l'appreil de mesure. Cet envoi/réception se fait tant que l'on a pas appuyé sur le bouton "valider".

    Voilà dans les grandes lignes le but de mon projet. Le problème que je rencontre est que lorsque j'appui sur "Commencer mesure" l'envoi/réception ne se fait qu'une fois or je veux que ça se répète. Sauf qu'en ajoutant une boucle while() on reste dans la boucle et on ne peut pas la stopper.

    Voici mon code pour la fonction mesure :

    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
    def mesure(*value) :
        ser = serial.Serial ("/dev/ttyS0", 9600)    #Open port with baud rate
        ser.write("23".encode())
        print(ser)
        received_data = ser.read()              #read serial port
        sleep(1.0)
        data_left = ser.inWaiting()             #check for remaining byte
        received_data += ser.read(data_left)
        print (received_data)                   #print received data
        ser.write(received_data)                #transmit data serially
        value = received_data.decode("utf-8")
        global a
        a = int(value)
        global labelresultat1
        if (listeCombocurseur.get()== "Lamelles"):
            if (a>=float_MiniLam):
                print("a")
                if (a<=float_MaxLam):
                    labelresultat1 = tk.Label(root, background = 'green', text = a,width=19,height=1)
                    labelresultat1.grid(row=12,column=2,rowspan =1, columnspan=1, pady=10)
                else :
                    labelresultat1 = tk.Label(root, background = 'red', text = a,width=19,height=1)
                    labelresultat1.grid(row=12,column=2,rowspan =1, columnspan=1, pady=10)
            else :
                labelresultat1 = tk.Label(root, background = 'red', text = a,width=19,height=1)
                labelresultat1.grid(row=12,column=2,rowspan =1, columnspan=1, pady=10)
        else :
            if (listeCombocurseur.get()== "Brin") :
                if (a>=float_minibrin):
                    print("a")
                    if (a<=float_maxibrin):
                        labelresultat1 = tk.Label(root, background = 'green', text = a,width=19,height=1)
                        labelresultat1.grid(row=12,column=2,rowspan =1, columnspan=1, pady=10)
                    else :
                        labelresultat1 = tk.Label(root, background = 'red', text = a,width=19,height=1)
                        labelresultat1.grid(row=12,column=2,rowspan =1, columnspan=1, pady=10)
                else :
                    labelresultat1 = tk.Label(root, background = 'red', text = a,width=19,height=1)
                    labelresultat1.grid(row=12,column=2,rowspan =1, columnspan=1, pady=10)    
        return(value)

    Merci de votre aide !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par nana14 Voir le message
    J'affiche une IHM sur laquelle je peux rentrer des données. Quand on appui sur un bouton "commencer messure", une trame est envoyé sur la broche Tx du GPIO puis on reçoit la réponse de l'appreil de mesure. Cet envoi/réception se fait tant que l'on a pas appuyé sur le bouton "valider
    Techniquement, il serait plus avisé de pousser le dialogue avec l'appareil de mesure dans un thread (car on n'a aucune idée de la durée des échanges) contrôlé par le GUI. L'avantage étant de pouvoir tester que ce code là fonctionne même en mode "console" (sans GUI).... et on l'interface avec le GUI après l'avoir testé.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2022
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour votre retour.

    Malheureusement je ne crains qu'un thread ne soit pas possible dans mon cas. La classe thread dois se placer avant ma partie interface à la fonction qui se trouve dans le thread (mesure) à besoin de variable présente dans le code de l'interface.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par nana14 Voir le message
    la fonction qui se trouve dans le thread (mesure) à besoin de variable présente dans le code de l'interface.
    Si différents threads ne pouvaient échanger d'informations/données, elles seraient difficilement utilisables.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2022
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci d'avoir pris le temps de me répondre.

    Pour le moment je reste bloquée...

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par nana14 Voir le message
    Pour le moment je reste bloquée...
    Si vous ne prenez pas l'initiative d'ouvrir la documentation sur les threads (avec Python) et de chercher des exemples sur Internet pour voir comment adapter votre code, vous allez le rester.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    Bonjour,
    Citation Envoyé par nana14 Voir le message

    Voilà dans les grandes lignes le but de mon projet. Le problème que je rencontre est que lorsque j'appui sur "Commencer mesure" l'envoi/réception ne se fait qu'une fois or je veux que ça se répète. Sauf qu'en ajoutant une boucle while() on reste dans la boucle et on ne peut pas la stopper.
    Au delà de la question des threads évoqués par wiztricks, avec tkinter on utilise des callbacks pour la création de boucle.
    exemple de mise en oeuvre:
    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
    import tkinter as tk
     
    def mesures(flag=True):
          if flag:
                  compteur.set(compteur.get() + 1)
                  label['text'] = compteur.get()
                  tk.callback = root.after(1000, mesures)
          else:
                  root.after_cancel(tk.callback)
                  label['text'] = f"Votre selection est {compteur.get()}"
     
     
     
    root = tk.Tk()
    compteur = tk.IntVar()
    compteur.set(0)
    label = tk.Label()
    label.grid()
    btmesure = tk.Button(text="Commencer mesure", command=mesures)
    btmesure.grid(row=2, column=1)
    btselect = tk.Button(text="Selection", command=lambda: mesures(flag=False))
    btselect.grid(row=2, column=2)
    root.mainloop()
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 101
    Points : 4 446
    Points
    4 446
    Par défaut
    Bonjour

    Ta fonction me laisse un peu perplexe

    Comme l'a écrit wiztricks, il est plus que conseillé de différencier code métier (mesure dans ton cas) et interface (graphique ou console)
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def  mesures():
        # ...
        return int(received_data.decode("utf-8"))
     
    new_value = mesures()
    if new_value != value:
         value = new_value
         update_gui(value, listeCombocurseur, labelresultat1)
    bien sûr avec des thread, cet exemple est invalide.

    - ton passage de parametre(s) dans mesure() ?? aucune idée du pourquoi puisque pas utilisé
    - usage intensif de global, c'est un usage intensif de mauvaise pratique... (et avec les thread, c'est explosion à coup sûr )
    $moi= ( !== ) ? : ;

Discussions similaires

  1. Changer la couleur d'une image via un appui sur un bouton
    Par Surchauffe-_- dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 14/08/2019, 20h48
  2. [MySQL] Exécuter une fonction PHP au clique sur un bouton
    Par Valadone dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/09/2015, 17h44
  3. Actualisation d'une liste lors d'appuie sur un bouton
    Par YopMa7e0 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 25/05/2011, 15h19
  4. Réponses: 3
    Dernier message: 26/11/2010, 16h27
  5. Exécuter une requête MySQL en php sur serveur OVH
    Par phebus1204 dans le forum Requêtes
    Réponses: 3
    Dernier message: 15/04/2009, 16h41

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