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 :

Spinbox avec TKinter (Python)


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 25
    Points : 30
    Points
    30
    Par défaut Spinbox avec TKinter (Python)
    Bonjour,

    Je travaille actuellement en langage Python sur le Raspberry Pi. J'ai rédigé le programme ci-dessous avec TKinter pour l'IHM et WiringPi pour les I/O. Ce programme permet de saisir une valeur numérique dans une Spinbox puis de l'envoyer vers un port grâce à un Button.
    Cependant, quelle que soit la valeur choisie dans la Spinbox, mon programme affiche toujours "Voie 1 > 93".

    Pourriez-vous m'aider ?
    Merci d'avance

    Voici le code:

    TKinter_Spinbox.py

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Florian BERTOSSI Voir le message
    Bonjour,

    Je travaille actuellement en langage Python sur le Raspberry Pi. J'ai rédigé le programme ci-dessous avec TKinter pour l'IHM et WiringPi pour les I/O. Ce programme permet de saisir une valeur numérique dans une Spinbox puis de l'envoyer vers un port grâce à un Button.
    Cependant, quelle que soit la valeur choisie dans la Spinbox, mon programme affiche toujours "Voie 1 > 93".

    Pourriez-vous m'aider ?
    Merci d'avance

    Voici le code:

    TKinter_Spinbox.py
    Bonjour,

    Dans :

    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import os
    import wiringpi2
    from time import sleep
    from Tkinter import *
     
    clock = 27 # Pin 27 GPIO
    data = 18 # Pin 18 GPIO
    latch = 24 # Pin 24 GPIO
    global voie1
    voie1 = int
    global attn
    attn = int
    Que vouliez-vous faire avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    global voie1    # ceci est inutile
    voie1 = int    # pourquoi ?
    global attn    # inutile
    attn = int    # étrange
    Sachant qu'ensuite (plus bas), vous écrivez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Saisie1 = Spinbox(fenetre,from_=0,to=93.5,textvariable=voie1) # Saisir la valeur de la voie 1 avec Spinbox
    Saisie1.pack()
    Si je résume, vous avez écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Saisie1 = Spinbox(fenetre,from_=0,to=93.5,textvariable=int) # Saisir la valeur de la voie 1 avec Spinbox
    Saisie1.pack()
    Et je suppose que vous vouliez dire :

    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import os
    import wiringpi2
    from time import sleep
    from Tkinter import *
     
    clock = 27 # Pin 27 GPIO
    data = 18 # Pin 18 GPIO
    latch = 24 # Pin 24 GPIO
     
    voie1 = IntVar()    # variable de contrôle tkinter cf documentation svp
     
    attn = 0    # un entier nul, tout simplement, non ?
    Relisez la doc, svp :

    http://infohost.nmt.edu/tcc/help/pub...b/spinbox.html
    http://infohost.nmt.edu/tcc/help/pub...variables.html
    http://infohost.nmt.edu/tcc/help/pub...web/index.html

    Un dernier conseil : évitez de sans cesse utiliser toujours les mêmes noms de variables dans différents contextes e.g. voie1 est une globale, puis une locale, attn est une globale, puis un paramètre, etc -> vous allez induire la plus grande confusion dans votre code.

    Essayez d'utiliser une notation typique pour les globales, une notation pour les locales et une notation pour les paramètres.

    Exemple :

    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import os
    import wiringpi2 as WP # on peut donner un alias pour abréger un nom long
    from time import sleep
    from Tkinter import *
     
    # on met généralement les constantes en MAJUSCULES
     
    CLOCK = 27      # Pin 27 GPIO
    DATA = 18       # Pin 18 GPIO
    LATCH = 24      # Pin 24 GPIO
     
    # configuration des pins
     
    WP.wiringPiSetupGpio()
     
    # quitte à définir des constantes autant les utiliser :
     
    WP.pinMode(LATCH, 1)     # mode sortie
    WP.pinMode(DATA, 1)      # mode sortie
    WP.pinMode(CLOCK, 1)     # mode sortie
     
    #~ WP.pinMode(24,1) # La pin 24 GPIO du Latch est en sortie
    #~ WP.pinMode(18,1) # La pin 18 GPIO de DATA est en sortie
    #~ WP.pinMode(27,1) # La pin 27 GPIO de CLOCK est en sortie
     
     
    # sauf ambiguité, on note les paramètres simplement
     
    def send_att(attn):
        """
            petit texte pour dire ce qu'on fait dans cette procédure ?
            c'est bien pour les autres, c'est bien aussi pour soi-même,
            quand on revient sur du code longtemps après;
        """
     
        print 'Recu 1: ', attn
     
        if 0 <= attn < 31:
     
            print 'Voie 1 < 31: ', attn
            # le 1 ou le 0 permet d'inverser l'ordre des bits
            WP.shiftOut(DATA, CLOCK, 1, (attn*2))
     
        elif attn < 63:
     
            print 'Voie 1 < 63: ', attn
            WP.shiftOut(DATA, CLOCK, 1, (((attn-31)+32)*2))
     
        elif attn < 93:
     
            print 'Voie 1 > 63:' , attn
            WP.shiftOut(DATA, CLOCK, 1, (((attn-62)+96)*2))
     
        elif attn >= 93:
     
            print 'Voie 1 > 93: ', attn
            # confusion de noms : qui est qui, ici ?
            # que vouliez-vous faire ?
            attn = 93
     
        # end if
     
    # end def
     
     
    # évitez la notation CamelCase pour les noms de fonctions,
    # cette notation est généralement réservée pour les noms de classes
    # cf documentation PEP 8:
    # http://legacy.python.org/dev/peps/pep-0008/
     
    def send():
        """
            idem ici : petit texte pour dire ce qui se fait dans le coin
        """
        # on pourrait noter les locales comme ceci :
     
        _voie1 = saisie1.get()  # Voie 1 = Valeur saisie dans Spinbox
     
        send_att(_voie1)        # Appel de fonction avec attn = _voie1
     
        WP.digitalWrite(LATCH, 1)     # LATCH ON
     
        WP.digitalWrite(LATCH, 0)     # LATCH OFF
     
        print "Recu 2: ", _voie1 # reçu ? où est-ce que _voie1 a été modifiée ?
     
    # end def
     
     
    # on pourrait distinguer les globales ainsi, par exemple :
     
    g_voie1 = IntVar()    # ou... DoubleVar() (cf Spinbox()) ?
     
    g_attn = 0
     
    # création de l'interface IHM
     
    fenetre = Tk()
     
    fenetre.title("Ways Command")
     
    # saisir la valeur de la voie 1 avec Spinbox
     
    saisie1 = Spinbox(
        fenetre,
        from_=0,
        to=93.5,
        textvariable=g_voie1,
    )
     
    saisie1.pack()
     
    # envoyer la valeur de la voie 1 avec Button
     
    bouton_envoi = Button(
        fenetre,
        text="Envoyer",
        bg="green",
        command=send,
    )
     
    bouton_envoi.pack(side=LEFT)
     
    # bouton quitter
     
    bouton_quitter = Button(
        fenetre,
        text="Quitter",
        command=fenetre.destroy,
    )
     
    bouton_quitter.pack(side=LEFT)
     
    # on lance la boucle principale
     
    fenetre.mainloop()
    PEP 8 : http://legacy.python.org/dev/peps/pep-0008/

    @+.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 25
    Points : 30
    Points
    30
    Par défaut Spinbox avec TKinter (Python)
    Bonjour,

    Je vous remercie pour votre aide et pour tous vos conseils. J'ai bien suivi toutes vos instructions mais mon code passe toujours par " attn >= 93 " quelle que soit la valeur choisie dans la Spinbox. Je n'arrive pas à comprendre pourquoi.

    Pourriez-vous m'aider ?
    Merci d'avance


    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
    # -*- coding: cp1252 -*-
    import os
    import wiringpi2 as WR
    from time import sleep
    from Tkinter import *
     
     
    CLOCK = 27 # Pin 27 GPIO
    DATA = 18 # Pin 18 GPIO
    LATCH = 24 # Pin 24 GPIO
     
    WR.wiringPiSetupGpio() # Configuration des pins
     
    WR.pinMode(LATCH,1) # La pin 24 GPIO du Latch est en sortie
    WR.pinMode(DATA,1) # La pin 18 GPIO de data est en sortie 
    WR.pinMode(CLOCK,1) # La pin 27 GPIO de clock est en sortie
     
     
    def send_att(attn): # Fonction de calcul et de transmission des données vers le port
        print 'Voie 1: ',attn
        if 0 <= attn < 31: # Si 0 <= attn < 31
            print 'Voie 1 < 31: ',attn
            WR.shiftOut(DATA,CLOCK,1,(int(attn)*2)) # Le 1 ou le 0 permet d'inverser l'ordre des bits         
     
        elif attn < 63: # Si attn < 63
            print 'Voie 1 < 63: ',attn
            WR.shiftOut(DATA,CLOCK,1,(((int(attn)-31)+32)*2)) # int(attn) évite l'erreur " unsuported operand type for -: 'str' and 'int' "
     
        elif attn < 93: # Si attn < 93
            print 'Voie 1 > 63:' ,attn
            WR.shiftOut(DATA,CLOCK,1,(((int(attn)-62)+96)*2)) 
     
        elif attn >= 93: # Si attn >= 93
            print 'Voie 1 > 93: ',attn
            WR.shiftOut(DATA,CLOCK,1,(((int(attn)-12)+96)*2))
     
        # end if
     
    # end def
     
     
    def send(): # Fonction pour récupérer la valeur de la Spinbox
        _voie1 = saisie1.get() # Voie 1 = Valeur saisie dans la Spinbox
        send_att(_voie1) # Appel de fonction avec attn = _voie1
        WR.digitalWrite(LATCH,1) # LATCH ON
        WR.digitalWrite(LATCH,0) # LATCH OFF
     
    # end def
     
     
    # Création de l'IHM
    fenetre = Tk()
    fenetre.title("Ways Command")
     
    g_voie1 = IntVar() # Déclaration des variables après Tk(). Evite l'erreur " 'NoneType' object has no attribute 'tk' "
    g_attn = IntVar()
     
    saisie1 = Spinbox(fenetre,from_=0,to=93,increment=5,textvariable=g_voie1) # Saisir la valeur de la voie 1 avec la Spinbox
    saisie1.pack()
     
    bouton_envoi = Button(fenetre,text="Envoyer",bg='green',command=send) # Envoyer la valeur de la voie 1 avec Button
    bouton_envoi.pack(side=LEFT)
     
    bouton_quitter = Button(fenetre,text="Quittter",command=fenetre.destroy) # Boutton quitter
    bouton_quitter.pack(side=LEFT)
     
    fenetre.mainloop()# Boucle principale

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Florian BERTOSSI Voir le message
    Bonjour,

    Je vous remercie pour votre aide et pour tous vos conseils. J'ai bien suivi toutes vos instructions mais mon code passe toujours par " attn >= 93 " quelle que soit la valeur choisie dans la Spinbox. Je n'arrive pas à comprendre pourquoi.

    Pourriez-vous m'aider ?
    Merci d'avance


    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
    # -*- coding: cp1252 -*-
    import os
    import wiringpi2 as WR
    from time import sleep
    from Tkinter import *
     
     
    CLOCK = 27 # Pin 27 GPIO
    DATA = 18 # Pin 18 GPIO
    LATCH = 24 # Pin 24 GPIO
     
    WR.wiringPiSetupGpio() # Configuration des pins
     
    WR.pinMode(LATCH,1) # La pin 24 GPIO du Latch est en sortie
    WR.pinMode(DATA,1) # La pin 18 GPIO de data est en sortie 
    WR.pinMode(CLOCK,1) # La pin 27 GPIO de clock est en sortie
     
     
    def send_att(attn): # Fonction de calcul et de transmission des données vers le port
        print 'Voie 1: ',attn
        if 0 <= attn < 31: # Si 0 <= attn < 31
            print 'Voie 1 < 31: ',attn
            WR.shiftOut(DATA,CLOCK,1,(int(attn)*2)) # Le 1 ou le 0 permet d'inverser l'ordre des bits         
     
        elif attn < 63: # Si attn < 63
            print 'Voie 1 < 63: ',attn
            WR.shiftOut(DATA,CLOCK,1,(((int(attn)-31)+32)*2)) # int(attn) évite l'erreur " unsuported operand type for -: 'str' and 'int' "
     
        elif attn < 93: # Si attn < 93
            print 'Voie 1 > 63:' ,attn
            WR.shiftOut(DATA,CLOCK,1,(((int(attn)-62)+96)*2)) 
     
        elif attn >= 93: # Si attn >= 93
            print 'Voie 1 > 93: ',attn
            WR.shiftOut(DATA,CLOCK,1,(((int(attn)-12)+96)*2))
     
        # end if
     
    # end def
     
     
    def send(): # Fonction pour récupérer la valeur de la Spinbox
        _voie1 = saisie1.get() # Voie 1 = Valeur saisie dans la Spinbox
        send_att(_voie1) # Appel de fonction avec attn = _voie1
        WR.digitalWrite(LATCH,1) # LATCH ON
        WR.digitalWrite(LATCH,0) # LATCH OFF
     
    # end def
     
     
    # Création de l'IHM
    fenetre = Tk()
    fenetre.title("Ways Command")
     
    g_voie1 = IntVar() # Déclaration des variables après Tk(). Evite l'erreur " 'NoneType' object has no attribute 'tk' "
    g_attn = IntVar()
     
    saisie1 = Spinbox(fenetre,from_=0,to=93,increment=5,textvariable=g_voie1) # Saisir la valeur de la voie 1 avec la Spinbox
    saisie1.pack()
     
    bouton_envoi = Button(fenetre,text="Envoyer",bg='green',command=send) # Envoyer la valeur de la voie 1 avec Button
    bouton_envoi.pack(side=LEFT)
     
    bouton_quitter = Button(fenetre,text="Quittter",command=fenetre.destroy) # Boutton quitter
    bouton_quitter.pack(side=LEFT)
     
    fenetre.mainloop()# Boucle principale
    Bonjour,

    Au temps pour moi, je n'avais pas fait attention.

    Il faut corriger la fonction send() comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def send ():
        """
            fonction pour récupérer la valeur de la Spinbox
        """
     
        _voie1 = g_voie1.get() # Voie 1 = Valeur saisie dans la Spinbox mais gérée par g_voie1
     
        send_att(_voie1) # Appel de fonction avec attn = _voie1
     
        WR.digitalWrite(LATCH,1) # LATCH ON
     
        WR.digitalWrite(LATCH,0) # LATCH OFF
     
    # end def
    C'est la variable de contrôle g_voie1 qu'il faut utiliser pour récupérer la valeur entière (integer) de la Spinbox et non pas saisie1.get() qui retourne une chaîne de caractères (string), ce qui fausse complètement les tests e.g. print "50" < 93 --> False.

    Maintenant, ça devrait fonctionner OK.

    @+.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 25
    Points : 30
    Points
    30
    Par défaut Spinbox avec TKinter (Python)
    Super ça fonctionne !
    Merci beaucoup pour votre aide !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Florian BERTOSSI Voir le message
    Super ça fonctionne !
    Merci beaucoup pour votre aide !
    Merci de cliquer sur "Résolu" pour fermer ce fil de discussion si votre problème a trouvé solution.

    @+.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Courbe avec TKinter (Python)
    Par Florian BERTOSSI dans le forum Tkinter
    Réponses: 4
    Dernier message: 21/05/2014, 18h40
  2. Moteur de recherche interne avec zope/python
    Par tunix dans le forum Zope
    Réponses: 3
    Dernier message: 01/05/2006, 15h45
  3. [Tkinter] Python sous Linux
    Par PMdomine dans le forum Tkinter
    Réponses: 7
    Dernier message: 06/03/2006, 20h56
  4. [Tkinter] Plusieurs fenêtre avec Tkinter
    Par cyrpaut dans le forum Tkinter
    Réponses: 2
    Dernier message: 04/01/2006, 22h24
  5. [Tkinter] Un petit souçis d'event avec Tkinter
    Par fire.stone dans le forum Tkinter
    Réponses: 4
    Dernier message: 29/10/2005, 20h56

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