Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > GUI > Tkinter
Tkinter Forum d'entraide sur Tkinter et compatible (Tix, Pmw, ...). Avant de poster -> FAQ Tkinter
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/02/2013, 20h59   #1
hherve
Invité de passage
 
Inscription : janvier 2005
Messages : 9
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 9
Points : 0
Points : 0
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 :
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()
hherve est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2013, 21h57   #2
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 608
Détails du profil
Informations personnelles :
Nom : Homme Patrice BLANGARIN
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 608
Points : 3 715
Points : 3 715
Bonsoir,
Code :
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 :
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.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2013, 10h41   #3
hherve
Invité de passage
 
Inscription : janvier 2005
Messages : 9
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 9
Points : 0
Points : 0
Super, Patrice. Ca marche.
hherve est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h08.


 
 
 
 
Partenaires

Hébergement Web