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 :

Problème pour éxécuter un programme utilisant tkinter et pyserial


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Problème pour éxécuter un programme utilisant tkinter et pyserial
    Bonjour,

    J' utilise python-3.1.3 et le module pyserial-py3k-2.5.win32 pour développer une appli qui doit me permettre de commander un analyseur de spectre par l'intermédiaire de la liaison série.
    Dans un premier temps, je n'ai pas utilisé tkinter :
    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
    #1er jet concernant la prog de l'as avec des paramètres déjà injectés
    # -*- coding: utf-8 -*-
    import serial #importe le module serial pour communiquer avec la voie série
     
    se = serial.Serial() #définition de la variable -se- communiquant avec le port série
    se.baudrate = 115200 #sélection de la vitesse de transmission à 115200 bauds
    se.bytesize = 8 #Transmission des informations sur 8 bits
    se.parities = 0 #sans parité
    se.stopbits = 1 #bit de stop 1
    se.xonxoff = 0 #pas de contrôle logiciel
    se.rtscts = 0 #pas de contrôle RTS/CTS
    se.timeout = 1 #timeout à la lecture 
    se.port = 0 #le port com 1
    se.writeTimeout = 1 #timeout à l écriture
     
    se.open() #ouverture du port
    a = 'CF X GHz;' #variable type string
    se.write(a.encode())
    b = 'SP X MHz;' #variable type string
    se.write(b.encode())
    c = 'RL X DBM;' #variable type string
    se.write(c.encode())
    d = 'PCAL OFF;\r\n' #variable type string
    se.write(bytes(d, "utf-8"))
    se.close() #fermeture
    Ca marche très bien.
    Dans un deuxième temps, j'ai voulu aller plus loin en utilisant une interface graphique:
    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
    #1er jet concernant la prog de l'as avec des paramètres entres par interface
    # -*- coding: utf-8 -*-
    import serial #importe le module serial pour communiquer avec la voie série
    from tkinter import *#ajoute toutes les options du module graphique tkinter
     
    root = Tk()
    entr1 = StringVar()
    entr2 = StringVar()
    entr3 = StringVar()
    edit1 = Entry(root, textvariable = entr1).grid(row = 0, column = 1)
    edit2 = Entry(root, textvariable = entr2).grid(row = 1, column = 1)
    edit3 = Entry(root, textvariable = entr3).grid(row = 2, column = 1)
     
     
    def portserie():
            global se
            se = serial.Serial() #définition de la variable -se- communiquant avec le port série
            se.baudrate = 115200 #sélection de la vitesse de transmission à 115200 bauds
            se.bytesize = 8 #Transmission des informations sur 8 bits
            se.parities = 0 #sans parité
            se.stopbits = 1 #bit de stop 1
            se.xonxoff = 0 #pas de contrôle logiciel
            se.rtscts = 0 #pas de contrôle RTS/CTS
            se.timeout = 1 #timeout à la lecture 
            se.port = 0 #le port com 1
            se.writeTimeout = 1 #timeout à l écriture
            se.open() #ouverture du port
     
    def chxfreq():
            a = StringVar()
            a = "CF " + entr1.get() + ";"
            se.write(a.encode())
            print(a)
            print(a.encode())
     
    def chxbp():
            b = StringVar()
            b = "SP " + entr2.get() + ";"
            se.write(b.encode())
     
    def chxniv():
            c = StringVar()
            c = "RL " + entr3.get() + ";"
            se.write(c.encode())
     
    def autocalabort():
            d = StringVar()
            d = "PCAL OFF;\r\n"
            se.write(bytes(d, "utf-8"))
     
    def quitter():
    	se.close()
    	root.quit()
     
     
    portserie()
     
    label1 = Label(root, text = "Frequence").grid(row = 0, column = 0)
    btn1 = Button(root, text = "validez", command = chxfreq).grid(row = 0, column = 2)
     
    label2 = Label(root, text = "Bande passante").grid(row = 1, column = 0)
    btn2 = Button(root, text = "validez", command = chxbp).grid(row= 1, column = 2)
     
    label3 = Label(root, text = "niveau").grid(row = 2, column = 0)
    btn3 = Button(root, text = "validez", command = chxniv).grid(row = 2, column = 2)
     
    label4 = Label(root, text = "Quitter").grid(row = 3, column = 0)
    btn4 = Button(root, text = "Bien sur", command = quitter).grid(row = 3, column = 2)
     
    autocalabort()
     
    root.mainloop()
    root.destroy()
    Lorsque je rentre les données dans chaque fenêtre et que les valide, rien ne se passe.
    Il faut que je quitte et que je redémarre le programme pour que les paramêtres soient pris en compte.

    Est-ce que quelqu'un a une petite idée de l'endroit ou ça ne va pas, svp ?
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Citation Envoyé par zebulon99 Voir le message
    Il faut que je quitte et que je redémarre le programme pour que les paramêtres soient pris en compte.
    Je viens d'essayer ton programme sous python 2.7, il marche. A priori, il n'y a pas de raison qu'il ne marche pas sous 3.X. il manque un T majuscule à Tkinter dans la ligne import, a moins que python ne soit plus case sensitive depuis 3.X que je ne connais pas. Je l'ai un peu remanié pour ajouter une trace visuelle de ce qui est envoyé. Une chose me titille, ta fonction autocalabort envoie un \n\r, mais pas les autres fonctions.

    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
    # -*- coding: utf-8 -*-
     
    import serial
    import Tkinter
    import sys
     
    class SERIAL(serial.Serial):
        """ uart encapsulation to add a trace"""
        def __init__(self, *args, **kwds):
            serial.Serial.__init__(self, *args, **kwds)
     
        def write(self, *args, **kwds):
            for car in args[0]:
                sys.stdout.write("%x "%ord(car))
            sys.stdout.write("<%s>\n"%args[0].replace('\n','\\n').replace('\r','\\r'))# trace
            return serial.Serial.write(self, *args, **kwds) # send to device
     
    def getOpenedPort(baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0, rtscts=0, timeout=1.0, port=0, writeTimeout = 1):
        device = SERIAL()
        device.baudrate = baudrate
        device.bytesize = bytesize
        device.parity = parity
        device.stopbits = stopbits
        device.xonxoff = xonxoff
        device.rtscts = rtscts
        device.timeout = timeout
        device.port = port
        device.writeTimeout = writeTimeout
        device.open()
        return device
     
    def sendFrame(device, format, var):
        device.write(format%var.get())
     
    def autocalabort(device):
        device.write("PCAL OFF;\r\n")
     
    def quitter():
        global root, device
        device.close()
        root.quit()
     
    def createGui(device):
        tempwin = Tkinter.Tk()
        for index, (label, format, defaultvalue, function) in enumerate([
        ("Frequency", "CF %s;", '14000', sendFrame),
        ("Bandwidth", "SP %s;", '20000', sendFrame),
        ("Level", "RL %s;", '-3', sendFrame)
        ]):
            tempvar = Tkinter.IntVar(value=defaultvalue)
            Tkinter.Label(tempwin, text=label).grid(column=0, row=index)
            Tkinter.Entry(tempwin, textvar=tempvar).grid(column=1, row=index)
            Tkinter.Button(tempwin, text='SEND', command=lambda device=device, format=format, var=tempvar:sendFrame(device, format, var)).grid(column=2, row=index)
        Tkinter.Button(tempwin, text='QUIT', command=quitter).grid(column=0, columnspan=3, row=index+1, sticky="ew")
     
        return tempwin
     
    device = getOpenedPort(baudrate=115200)
    root = createGui(device)
    autocalabort(device)
    print device
    root.mainloop()
    P.S. Finalement, j'ai trouvé un truc, quand tu écris
    tu rajoutes simplement un attribut à l'instance se car se.parities n'existe pas. Du coup, la parité de cette instance est celle par défaut, ce qui ne t'arrange pas forcément.

    A+

    Pfeuh

Discussions similaires

  1. Problème pour éxécuter un programme externe
    Par anthonystaltaro dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 06/04/2009, 17h42
  2. Problème pour éxécuter des jobs automatiquement
    Par Flipmode dans le forum Alimentation
    Réponses: 2
    Dernier message: 26/04/2007, 10h20
  3. Réponses: 1
    Dernier message: 12/03/2007, 07h54
  4. Problème pour faire un programme
    Par Kypper_667 dans le forum C++
    Réponses: 4
    Dernier message: 26/06/2006, 18h53
  5. Réponses: 14
    Dernier message: 25/11/2005, 12h50

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