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 :

Boucle Tkinter et polling série


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 24
    Points : 18
    Points
    18
    Par défaut Boucle Tkinter et polling série
    Bonjour,

    Ce programme (qui m'a déjà été bien débuggé ici même, merci encore) tourne bien jusqu'à mon idée de faire du polling sur le port série de mon Raspberry Pi (ttyAMA0).

    J'ai testé le port série, et il fonctionne.

    C'est pour la boucle de Tkinter que quelque chose m'échappe.

    Si je comprends bien cette boucle là, tout est en permanence relu entre:
    app = tk.Tk() et cette dernière ligne tk.mainloop() et ceci sans fin. C'est bien cela ?

    Alors il m'est venu l'idée d'utiliser "after" pour aller executer une fonction qui scrute le port série en lecture et affiche s'il y a du nouveau, toutes les 500mSec. Après je m'occuperais d'analyser cette lecture, mais c'est autre chose.
    Seulement, je remarque que cela ne fonctionne qu'une seule fois et pas toutes les 500mSec. (J'avais mis un print "je lis" pour voir si je passais dans ma fonction. Cela s'écrit une seule fois)

    Alors c'est sans doute que je n'ai pas compris comment fonctionnait la boucle , ou qu'il manque quelque chose.

    Les évènements que j'attends arrivent de manière innatendue, sans timing précis. Je dois pouvoir ne rien rater, et de plus je vais monter d'autres ports série en plus.

    Merci pour votre éclairage

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    import time
    import sys
    import serial, glob
    import Tkinter as tk
    from socket import *
     
    IP = "0.0.0.0"
    MODE = "Unknow"
     
    ports = glob.glob('/dev/ttyA*') + glob.glob('/dev/ttyU*')
    print "ports trouves:",ports
     
     
    def find_tibbo():
        s = socket(AF_INET, SOCK_DGRAM)     #UDP with DGRAM
        s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
        s.sendto('X', ('<broadcast>', 65535))
        data , addr = s.recvfrom(1024)
        print "RECU: ", data, " depuis:",addr #pour debug
        s.close()
        return addr[0]
     
    def do_find_tibbo():
        '''dans ce cas, on récupère la variable par son nom tk'''
        ip = find_tibbo()
        ip_label.config(text=ip)
     
    def find_mod(IP):
        print "l'IP passee est:",IP
        s = socket(AF_INET, SOCK_STREAM)    #TCP with STREAM
        s.connect((IP,10001))
        time.sleep(.1)
        s.send("MODE?\n")
        time.sleep(.1)
        mode = s.recv(1024)
        print mode
        s.close()
        return mode
     
    def do_find_mode():
        ''' on récupère la variable par son nom tk '''
        # print IP n'afficherait que la variable globale 0.0.0.0
        # print "the label is", ip_label.cget("text")  ca, ca marche
        mod = find_mod(ip_label.cget("text"))
        mod_label.config(text=mod)
     
    def send_value(value):
        IP = ip_label.cget("text")
        s = socket(AF_INET, SOCK_STREAM)    #TCP with STREAM
        s.connect((IP,10001))               #port 10001
        time.sleep(.05)
        s.send("ATT 0 "+ value +"\n")
        print "0 fait"
        s = socket(AF_INET, SOCK_STREAM)    #TCP with STREAM
        s.connect((IP,10002))               #port 10002
        time.sleep(.05)
        s.send("ATT 1 "+ value +"\n")
        print "1 fait"
        s = socket(AF_INET, SOCK_STREAM)    #TCP with STREAM
        s.connect((IP,10003))               #port 10003
        time.sleep(.05)
        s.send("ATT 2 "+ value +"\n")
        print "2 fait"
        s = socket(AF_INET, SOCK_STREAM)    #TCP with STREAM
        s.connect((IP,10004))               #port 10004
        time.sleep(.05)
        s.send("ATT 3 "+ value +"\n")
        print "3 fait" + value
        s.close()
     
    def value5():
        send_value("005")
     
    def value10():
        send_value("010")    
     
     
    def sortie():
        app.destroy()
     
    def readserie():
        #print "je lis\n"
        ser =serial.Serial('/dev/ttyAMA0',9600,timeout=1)
        string = ser.read(10)
        if len(string) != 0:
            print (string)    
     
     
    if __name__ == '__main__':          # 
        app = tk.Tk()
     
        app.geometry('400x400+800+300')
        app.title('subrack controler')
     
        tk.Label(text='Search for IP address').place(x=18,y=15)
        ip_label = tk.Label(text=IP)            # l'adresse IP
        ip_label.place(x=250,y=15)
        tk.Button(text = 'Go',command=do_find_tibbo ,fg = "blue").place(x=200,y=10)
     
        tk.Label(text='Search for mode').place(x=18,y=45)
        mod_label = tk.Label(text=MODE)
        mod_label.place(x=250,y=45)
        tk.Button(text= 'Go',command=do_find_mode ,fg = "blue").place(x=200,y=40)
     
        tk.Label(text='send 0.5dB').place(x=18,y=75)
        tk.Button(text= 'Go',command=value5 ,fg = "red").place(x=200,y=70)
     
        tk.Label(text='send 1.0dB').place(x=18,y=105)
        tk.Button(text= 'Go',command=value10 ,fg = "red").place(x=200,y=100)
     
        tk.Button(text= 'QUIT',command=sortie).place(x=195,y=340)    
     
        app.after(500,readserie)
     
     
        tk.mainloop()

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,
    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
    import Tkinter as tk
     
     
    IP = "0.0.0.0"
    MODE = "Unknow"
     
     
    def readserie():
        app.after(500, readserie)
        print('Lecture')
     
     
    if __name__ == '__main__':          # 
        app = tk.Tk()
        app.geometry('400x400+800+300')
        app.title('subrack controler')
        tk.Label(text='Search for IP address').pack()
        tk.Label(text=IP).pack()
        tk.Button(text='QUIT', command=app.destroy).pack()
        app.after(500, readserie)
        app.mainloop()
    C'est la basse mais n'oubliez pas que c'est l'interpréteur Tcl qui gère cela...

    A noter que je reste plus que septique sur l'utilité du gestionnaire de géométrie place ici.
    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
    import Tkinter as tk
     
     
    IP = "0.0.0.0"
    MODE = "Unknow"
     
     
    if __name__ == '__main__':
        app = tk.Tk()
        app.title('subrack controler')
        tk.Label(app, text='Search for IP address').grid(row=0, column=0, sticky='W', padx=5)
        tk.Button(app, text='Go', fg="blue").grid(row=0, column=1, sticky='EW')
        tk.Label(app, text=IP).grid(row=0, column=2, padx=5)
        tk.Label(app, text='Search for mode').grid(row=1, column=0, sticky='W', padx=5)
        tk.Button(app, text='Go', fg="blue").grid(row=1, column=1, sticky='EW')
        tk.Label(app, text=MODE).grid(row=1, column=2, padx=5)
        tk.Label(app, text='send 0.5dB').grid(row=2, column=0, sticky='W', padx=5)
        tk.Button(app, text= 'Go',fg = "red").grid(row=2, column=1, sticky='EW')
        tk.Label(app, text='send 1.0dB').grid(row=3, column=0, sticky='W', padx=5)
        tk.Button(app, text= 'Go',fg = "red").grid(row=3, column=1, sticky='EW')
        tk.Button(app, text= 'QUIT',command=app.destroy).grid(row=4, column=1, sticky='EW')
        app.mainloop()
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Janvier 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Super, Patrice. Ca marche.

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/03/2016, 13h01
  2. boucle while et liaison série
    Par ben1015 dans le forum LabVIEW
    Réponses: 5
    Dernier message: 22/10/2009, 18h09
  3. Réponses: 1
    Dernier message: 27/09/2007, 15h31
  4. [VBA-E] Ouvrir une série de fichiers à l'aide d'une boucle
    Par Tiki40 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/12/2006, 14h34
  5. [Tkinter] Méthode get() dans une boucle while
    Par Thundie dans le forum Tkinter
    Réponses: 2
    Dernier message: 04/02/2006, 00h06

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