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

Python Discussion :

LCD Python create_polygon()


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2015
    Messages : 16
    Par défaut LCD Python create_polygon()
    Bonjour,

    je cherche a reproduire l'image ci-dessus avec Tk.
    Nom : image.L8BX1X.png
Affichages : 383
Taille : 3,6 Ko

    J'ai réussi a le faire avec la fonction create_line() mais j'aimerais le faire aussi avec la fonction create_polygon(). Mon problème étant qu'a chaque fois je n'arrive pas a avoir le même rendu que sur l'image. Soit c'est trop petit soit c'est décalé soit c'est incliné...

    Voici mon code pour la fonction create_line() :
    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
    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
     
    # description des sept segments LCD
    segments = \
    [ # X1, Y1, X2, Y2
    	[15, 10, 55, 10],
    	[15, 60, 55, 60],
    	[15, 110, 55, 110],
    	[10, 15, 10, 55],
    	[10, 65, 10, 105],
    	[60, 15, 60, 55],
    	[60, 65, 60, 105],
    ]
     
    # description des lettres en termes de leurs segments
    description = {'L' : [3, 4, 2], 'P' : [0, 3, 5, 1, 4], 'U' : [3, 4, 5, 6, 2]} # etc...
     
    # construction des widgets
    from Tkinter import *
     
    top = Tk()
    canevas = Canvas(top, height=150, width=325)
    canevas.pack()
     
    # dessin des segments
    offset = 70
    ep = 10
    couleur = '"blue"'
    decal = 20
     
    for K in 'PULL' :
    	les_segments = description [K]
    	for SG in les_segments :
    		S = segments [SG]
    		X1 = repr(S [0] + decal) ; Y1 = repr(S [1])
    		X2 = repr(S [2] + decal) ; Y2 = repr(S [3])
    		args = '%s, %s, %s, %s' % (X1, Y1, X2, Y2)
    		args += ', width=%s, fill=%s' % (repr(ep), couleur)
    		eval('canevas.create_line(%s)' % args)
    	decal += offset
     
    top.mainloop()
    Et voici celui de la fonction create_polygon() :
    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
    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from sys import *
     
    # description des sept segments LCD
    segments = \
    [ # X1, Y1, X2, Y2, X3, Y3
    	[15, 10, 55, 10],
    	[15, 60, 55, 60],
    	[15, 110, 55, 110],
    	[10, 15, 10, 55],
    	[10, 65, 10, 105],
    	[60, 15, 60, 55],
    	[60, 65, 60, 105],
    ]
     
    # description des lettres en termes de leurs segments
    description = {'L' : [3, 4, 2], 'P' : [0, 3, 5, 1, 4], 'U' : [3, 4, 5, 6, 2],
    			   'D' : [0, 5, 3, 4, 6, 2], 'E' : [0, 3, 2, 1, 4], 'S' : [3, 1, 0, 6, 2], 
    			   'C' : [0, 3, 4, 2], 'R' : [0, 6, 3, 5, 1, 4], 'I' : [3, 4], 'P' : [0, 3, 4, 5, 1], 
    			   'T' : [0, 3, 4], 'O' : [0, 3, 4, 2, 5, 6], 'N' : [6, 3, 4, 1], 'G' : [0, 3, 4, 2, 6, 1], 
    			   'M' : [6, 3, 4, 1, 5]}
     
    from Tkinter import *
     
    def Affich_LCD(mot) :
    	top = Tk()
    	canevas = Canvas(top, height=150, width=800)
    	canevas.pack()
    	offset = 70
    	ep = 20
    	couleur = '"blue"'
    	decal = 20
    	for K in mot :
    		les_segments = description [K]
    		for SG in les_segments :
    			S = segments [SG]
    			X1 = repr(S [0] + decal) ; Y1 = repr(S [1])
    			X2 = repr(S [2] + decal) ; Y2 = repr(S [3])
    			X3 = repr(S [4] + decal) ; Y3 = repr(S [5])
    			args = '%s, %s, %s, %s, %s, %s' % (X1, Y1, X2, Y2, X3, Y3)
    			args += ', width=%s, fill=%s' % (repr(ep), couleur)
    			eval('canevas.create_polygon(%s)' % args)
    		decal += offset
    	top.mainloop()
     
    if len(argv) > 1 : Affich_LCD(argv[1])
    else : exit('Mot manquant')

  2. #2
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par Bolboaa Voir le message
    Bonjour,

    je cherche a reproduire l'image ci-dessus avec Tk.
    Nom : image.L8BX1X.png
Affichages : 383
Taille : 3,6 Ko

    J'ai réussi a le faire avec la fonction create_line() mais j'aimerais le faire aussi avec la fonction create_polygon(). Mon problème étant qu'a chaque fois je n'arrive pas a avoir le même rendu que sur l'image. Soit c'est trop petit soit c'est décalé soit c'est incliné...

    Voici mon code pour la fonction create_line() :
    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
    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
     
    # description des sept segments LCD
    segments = \
    [ # X1, Y1, X2, Y2
    	[15, 10, 55, 10],
    	[15, 60, 55, 60],
    	[15, 110, 55, 110],
    	[10, 15, 10, 55],
    	[10, 65, 10, 105],
    	[60, 15, 60, 55],
    	[60, 65, 60, 105],
    ]
     
    # description des lettres en termes de leurs segments
    description = {'L' : [3, 4, 2], 'P' : [0, 3, 5, 1, 4], 'U' : [3, 4, 5, 6, 2]} # etc...
     
    # construction des widgets
    from Tkinter import *
     
    top = Tk()
    canevas = Canvas(top, height=150, width=325)
    canevas.pack()
     
    # dessin des segments
    offset = 70
    ep = 10
    couleur = '"blue"'
    decal = 20
     
    for K in 'PULL' :
    	les_segments = description [K]
    	for SG in les_segments :
    		S = segments [SG]
    		X1 = repr(S [0] + decal) ; Y1 = repr(S [1])
    		X2 = repr(S [2] + decal) ; Y2 = repr(S [3])
    		args = '%s, %s, %s, %s' % (X1, Y1, X2, Y2)
    		args += ', width=%s, fill=%s' % (repr(ep), couleur)
    		eval('canevas.create_line(%s)' % args)
    	decal += offset
     
    top.mainloop()
    Bonsoir,
    Et en utilisant les options "arrow=BOTH" et "arrowshape=(x, y, z) de "create_line", cela ne serait pas suffisant?

    Clodion

  3. #3
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Bonsoir,
    En utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    segments = \
    [ # X1, Y1, X2, Y2
    	[10, 10, 60, 10],
    	[10, 60, 60, 60],
    	[10, 110, 60, 110],
    	[10, 11, 10, 59],
    	[10, 61, 10, 109],
    	[60, 11, 60, 59],
    	[60, 61, 60, 109],
    ]
    Ainsi que (en insertion, ligne 40):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    args += ", arrow=BOTH, arrowshape=(0, 5, 0)"
    J'obtiens:
    Nom : Capture du 2015-07-22 21:17:10.png
Affichages : 265
Taille : 1,1 Ko

    C'est le but recherché ou bien je n'ai pas tout compris?

    Clodion

    PS: pourquoi utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		X1 = repr(S [0] + decal) ; Y1 = repr(S [1])
    		X2 = repr(S [2] + decal) ; Y2 = repr(S [3])
    		args = '%s, %s, %s, %s' % (X1, Y1, X2, Y2)
    		args += ', width=%s, fill=%s' % (repr(ep), couleur)
    		eval('canevas.create_line(%s)' % args)
    Et pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		X1 = S[0] + decal ; Y1 = S[1]
    		X2 = S[2] + decal ; Y2 = S[3]
    		canevas.create_line(
                        X1, Y1, X2, Y2, width=10, fill="blue",
                        arrow=BOTH, arrowshape=(0, 5, 0)
                        )

  4. #4
    Membre averti
    Femme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2015
    Messages : 16
    Par défaut
    Bonsoir,

    Merci pour vos réponses. Mais mon cahier de charge précise qu'il faut obtenir ce même résultat mais en utilisant la fonction create_polygon()...

  5. #5
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Bonjour,
    À convertir, si besoin, pour Python2:
    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
    import tkinter as tk
     
    mot = "PUxLL" # mot à écrire
    larg = 10   # largeur des segments
    prof = 10   # profondeur de la pointe d'un segment
    haut_y = 60   # longueur totale d'un segment vertical
    haut_x = 60   # longueur totale d'un segment horizontal
     
    nb_let = len(mot)       # nombre de lettres dans le LCD: ici, ajusté au mot
    #nb_let = 15             # pour tout tester (toutes les lettres)
    sep_let = 10+2*larg     # espace entre lettres
    x_pan, y_pan = 15, 15   # espace entre lettres et bord du LCD
     
    # caractéristiques d'un segment (vertical ou horizontal)
    # les deux segments sont définis pour pouvoir les modifier séparément
    lst_seg_v = [(0, 0), (larg/2, prof), (larg/2, haut_y-prof),
                 (0, haut_y), (-larg/2, haut_y-prof), (-larg/2, prof)]
    lst_seg_h = [(0, 0), (prof, larg/2), (haut_x-prof, larg/2),
                 (haut_x, 0), (haut_x-prof, -larg/2), (prof, -larg/2)]
     
    # segments possibles 0->2 horizontaux, 3->7 verticaux
    lst_seg_tot = [(0, 0, False), (0, haut_y, False), (0, haut_y*2, False),
                   (0, 0, True), (0, haut_y, True), (haut_x, 0, True), (haut_x, haut_y, True)]
     
    # description des lettres
    description = {'L' : [3, 4, 2], 'P' : [0, 3, 5, 1, 4], 'U' : [3, 4, 5, 6, 2],
                   'D' : [0, 5, 3, 4, 6, 2], 'E' : [0, 3, 2, 1, 4], 'I' : [3, 4],
                   'S' : [3, 1, 0, 6, 2], "B" : [0, 1, 2, 3, 4, 5, 6], "_" : [2],
                   'C' : [0, 3, 4, 2], 'R' : [0, 6, 3, 5, 1, 4], 'H' : [6, 3, 4, 1, 5],
                   'T' : [0, 3, 4], 'N' : [6, 3, 4, 1], 'G' : [0, 3, 4, 2, 6, 1]}
     
    # fenetre
    app = tk.Tk()
    # le canvas est ajusté au nombre de lettres
    can = tk.Canvas(app, height = (haut_y+y_pan)*2,
                    width = (haut_x*nb_let+sep_let*(nb_let-1)+ x_pan*2))
    can.pack()
     
    def affiche_seg(x, y, v=True):
        """Affichage d'un segment à partir du point (x, y).
        v=True pour vertical/False pour horizontal"""
        pts = [(x+x1, y+y1) for x1, y1 in (lst_seg_v if v else lst_seg_h)]
        can.create_polygon(*pts, fill = "red")
     
    #mot = "".join(description.keys())     # test de toutes les lettres possibles
    pos_let = 0     # position de la lettre horizontalement (dans la phrase)
    for lett in mot:
        if lett not in description.keys():      # pour éviter les lettres non définies
            lett = "_"
        for seg in description[lett]:
            x, y, v = lst_seg_tot[seg]
            affiche_seg(x+x_pan+pos_let*(haut_x+sep_let), y+y_pan, v)
        pos_let += 1
     
    app.mainloop()
    et à améliorer…

    Clodion

  6. #6
    Membre averti
    Femme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2015
    Messages : 16
    Par défaut
    Merci pour ton aide Clodion !

    Une dernière question, aurait-tu une idée sur la façon de faire pour distinguer un 8 d'un B avec un afficheur LCD ?

    Est-ce que pour faire ça je devrais utiliser create_polygon combinée a une autre fonction ? (create_oval...)

Discussions similaires

  1. [langage] traduction d'un fonction python en perl
    Par ay_pepito dans le forum Langage
    Réponses: 3
    Dernier message: 04/12/2007, 15h06
  2. CORBA & PYTHON
    Par stan91stan dans le forum CORBA
    Réponses: 5
    Dernier message: 10/06/2004, 12h32
  3. module .so pour python... ?!
    Par totoetlititi dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 09/03/2004, 14h51
  4. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59

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