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 :

Devoir ISN QR Code Python


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Par défaut Devoir ISN QR Code Python
    Bonjour, je suis un élève de terminal S et je fais spécialité ISN . J'ai en ce moment un problème concernant un devoir d'ISN. Je dois créé un générateur de QR Code sous python en utilisant la bibliothèque Tkinter (je suis débutant !). Je sais que je suis pas très loin de la fin, seulement je suis bloqué devant un problème majeur. Lorsque je convertis les caractères que je veux coder en binaire (dans devoir j'ai choisi de coder un URL), ceux-ci sont censé ce placé dans une grille blanche sous la forme de carrés noirs (si c'est un 1) ou de carré blancs (si c'est un 0). Le problème est que mes carrés se placent n'importe comment dans ma grille (j'utilise une matrice) et je voudrais qu'ils commencent du carré en bas à droite de la grille et que les carrés en montant et en descendant sur ma grille (en allant de la droite vers la gauche). J’espère que j'ai été assez clair
    je vous laisse un lien si vous n'avez pas compris comment le QR Code est codé : http://en.wikiversity.org/wiki/Reed%...des_for_coders

    Merci

    Voici mon Programme :

    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
    140
    #!_*_ coding: latin1 _*_
    #! /usr/bin/python
    # script mot_de_passe.py
    from Tkinter import *
     
     
    #########################################################################
    global x
    global y
     
    #definir la limite de la zone contenant l'information 
     
     
     
     
     
     
     
     
    #on definit la fonction case noire et blanche
     
    def caseNoire(x,y):
        can.itemconfig(listidrec[x][y],fill='black')
     
    def recuperation() :
     
        global a
        a = 0
        for p in reference.get():
            if p=="w" :     #si l'adresse URL ne commence pas par 'www.'=invalide
                a += 1                      
            if p=="." :
                a += 1
            if a==4 :
                break
     
     
        if a==4:
            text2 = Label(fen, text ='Votre adresse URL est valide')
            text2.pack() 
            for t in reference.get():
                g = ('0'+ bin(ord(t))[2:].zfill(7)) #on recupère l'url et on converti ces caracteres en binaire
                print (g)
     
            for x in range(0, 28):
                for y in range(0, 28):
                    for i in range(len(g)):
                        if g[i]=='1':
                            caseNoire(x,y)
                            i=i+1              #1=case noire, 0=case blanche
                            y=y-1           #on détermine le sens de codage des binaire dans la matrice
                            x=x+1
     
     
     
        else:
            text3 = Label(fen, text =' Votre adresse URL est invalide, veuillez recommencer ')
            text3.pack()
            # l'adresse est invalide, un message nous dit de taper un nouvel URL
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    #########################################################################        
    #fenetre principale avec les différents modules
     
    fen=Tk()
    fen.title('Generateur de QR Code')
    text1 = Label(fen, text = 'Entrez votre adresse URL :', font = 'bold')
    bou1 = Button(fen, text = "Quitter",activebackground = 'white', font = 'bold', command = fen.destroy)
    bou2 = Button(fen, text = 'Générer',activebackground = 'white', font = 'bold', command = recuperation)
    reference = StringVar()
    entree = Entry(fen, textvariable = reference)
    can = Canvas(fen,height= 580, width = 580, bg  = 'white')
    can.pack(side=LEFT)
    text1.pack(padx = 7)
    entree.pack(padx = 5, pady = 7)
    bou2.pack(padx = 5)
    bou1.pack(side=BOTTOM, padx = 5)
     
    ########################################################################
    N = 29 
    pas=580/N
     
     
    listidrec=N*[[]] #liste pour la matrice
     
    for x in range(N):   #creation de la grille avec la matrice
        listidrec[x]=N*[-1]
    for x in range(N): 
        for y in range(N): 
            listidrec[x][y] = can.create_rectangle(pas*x, pas*y, pas*(x+1), pas*(y+1), fill='white')
     
    #######################################################################
    #On definit les carrés non variables dans la grille
     
    can.create_rectangle(10,10,130,130,width=20) #dessine le rectangle 7x7 en haut à* gauche
    can.create_rectangle(450,10,570,130,width=20) #en haut à* droite
    can.create_rectangle(10,450,130,570,width=20) #en bas à* gauche
     
    can.create_rectangle(40,40,100,100,fill="black") #dessine le rectangle 3x3 en haut à* gauche
    can.create_rectangle(480,40,540,100,fill="black") #en haut à* droite
    can.create_rectangle(40,480,100,540,fill="black") #en bas à* gauche
     
    can.itemconfig(listidrec[6][8],fill='black') # timing paterns de gauche
    can.itemconfig(listidrec[6][10],fill='black')
    can.itemconfig(listidrec[6][12],fill='black')
    can.itemconfig(listidrec[6][14],fill='black')
    can.itemconfig(listidrec[6][16],fill='black')
    can.itemconfig(listidrec[6][18],fill='black')
    can.itemconfig(listidrec[6][20],fill='black')
     
    can.itemconfig(listidrec[8][6],fill='black') #timing paterns du haut
    can.itemconfig(listidrec[10][6],fill='black')
    can.itemconfig(listidrec[12][6],fill='black')
    can.itemconfig(listidrec[14][6],fill='black')
    can.itemconfig(listidrec[16][6],fill='black')
    can.itemconfig(listidrec[18][6],fill='black')
    can.itemconfig(listidrec[20][6],fill='black')
     
    can.create_rectangle(410,410,490,490,width=20) #dessine le petit rectangle en bas a droite
    can.itemconfig(listidrec[22][22],fill='black')
     
    #####################################################################################
     
     
     
    fen.mainloop()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Si vous n'utilisez pas la balise CODE (voir le '#' qui apparait sous le menu d'édition du message) pas la peine de poster votre code: il est illisible, inutilisable,... et çà ne va pas être facile de vous aider avec çà.

    Le problème est que mes carrés se placent n'importe comment dans ma grille (j'utilise une matrice) et je voudrais qu'ils commence du carré en bas à droite de la grille et que les carrés en montant et en descendant sur ma grille (en allant de la droite vers la gauche).
    Le sujet est de placer des carreaux dans une grille NxN en fonction de leurs indices (i, j).
    Comme ces carreaux seront des "carrés" déssinés dans un Canvas tkinter, il faut (peut être) commencer par écrire une fonction
    "dessine(canvas, i, j, color)" qui ira calculer les x0, y0, x1, y1 pour créer le carré à l'endroit souhaité.
    Pas la peine de sortir le reste du programme!

    Initialement, çà commence avec:
    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
     
    def draw(canvas, i, j, color):
        x = i * SIZE
        y = j * SIZE
        canvas.create_rectangle(x, y, x+SIZE, y+SIZE, fill=color)
        canvas.create_text(x+5, y+5, text='%d, %d' % (i, j), anchor='nw')
     
    COUNT = 10
    SIZE = 50
     
    width = COUNT*SIZE
    canvas = tk.Canvas(width=width, height=width)
    canvas.pack()
     
    COLORS = 'grey80', 'white'
    for i in range(COUNT):
        for j in range(COUNT):
            color = COLORS[(i+j)%2]
            draw(canvas, i, j, color)
     
    tk.mainloop()
    Après, il vous faut comprendre et adapter à votre cas.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Par défaut
    Mon programme possède déjà ce type de fonction et de boucle. c'est le placement des caractères en binaire que je n'arrive pas à déterminer. Dans un QR Code, la zone qui admet le codage se situe au centre et fait le contour des éléments non variables (que j'ai dessiner avec de can.create_rectangle). Je pense qu'il faudrait dire de coder les carrés jusqu'à un certain point du tableau, puis de redescendre et ainsi de suite.
    comme ceci: http://www.lama.univ-savoie.fr/~hyve...e-data-big.png
    Par contre cela monterai et descendrais sur une seul colonne de carre (pas comme dans l'image du lien ou c'est par 2 colonnes).

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par Tenerreip Voir le message
    Mon programme possède déjà ce type de fonction et de boucle. c'est le placement des caractères en binaire que je n'arrive pas à déterminer. Dans un QR Code, la zone qui admet le codage se situe au centre et fait le contour des éléments non variables (que j'ai dessiner avec de can.create_rectangle). Je pense qu'il faudrait dire de coder les carrés jusqu'à un certain point du tableau, puis de redescendre et ainsi de suite
    Le placement des caractères est donné ici.
    Chaque caractère affiche la valeurs des bits b0,b1,... d'un byte suivant une disposition qui dépend de l'emplacement.

    Une fois que vous savez afficher un carré en fonction de (i, j).
    Il faut écrire les fonctions qui écriront des bytes suivant ces différentes dispositions.
    Exemple: draw_Dx_up(canvas, i, j, byte), draw_Dx_down(canvas, i, j, byte)

    A partir de là, vous pouvez associer la position de l'"emplacement" à une fonction.
    Le plus simple serait une liste, genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    drawers = [
         lambda canvas, byte: draw_Dx_up(canvas, 27, 25, byte),
         lambda canvas, byte: draw_Dx_down(canvas, 27, 21, byte),
         ...
     
    ]
    "lambda" est une instruction qui permet de fabriquer une fonction à partir d'une autre. Ici, je m'en sers pour geler la position.

    Puis si vous avez une suite de "bytes" à "dessiner", il suffit d'appeler la fonction qui va bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ix, b in enumerate(suite_bytes):
         drawers[ix](canvas, b)
    Est ce que cela vous parle?

    - W
    PS: n'oubliez pas de lire l'article: vous ne transformez pas directement les caractères de l'url en bytes!
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Par défaut
    Oui ça me parle déjà plus merci
    Je vais essayer ça de suite !

    Je vois l'idée mais je n'arrive pas à l'adapter à mon programme

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par Tenerreip Voir le message
    Je vois l'idée mais je n'arrive pas à l'adapter à mon programme
    Votre programme intègre d'autres fonctionnalités le dialogue avec l'utilisateur pour saisir l'URL a encoder.
    Avant de pouvoir dessiner le qr-code, il va falloir fabriquer la séquence de bytes à encoder. Il faut encoder les "caractères" dans la suite de bytes qui devront être dessinés aux différentes positions. Il faut aussi encoder la longueur, il y a un ECC,...

    Pour l'instant vous en êtes à afficher un byte avec la disposition attendue
    Puis, il faudra construire la liste drawers pour avoir la disposition au bon emplacement.
    Avant de pouvoir "intégrer" çà avec l'interface utilisateur, il va falloir vous assurer que çà fonctionne.
    Et pour çà, vous avez besoin d'afficher des bytes ou des suites de bytes qui seront simples à interpréter pour vous assurer que vous avez placé le bit0 au bon endroit,....
    Ca va se faire à coup de affiche('01010101'), affiche('11110000') i.e. des constantes bien choisies.
    Le reste viendra plus tard.

    - W

    PS: votre projet est intéressant car assez compliqué pour que vous deviez réfléchir plusieurs coups à l'avance. La ou çà craint, c'est que si vous saviez faire çà, vous ne seriez plus débutant "programmeur".
    Mais les spécifications du qrcode vous forcent à dessiner un qrcode qui soit "conforme". Le test ultime pourrait être de faire lire le qrcode par un reader sur un smartphone.
    A vous de voir si vous pouvez oser fabriquer un truc qui "ressemble" à un qrcode sans avoir a faire tout le boulot.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Par défaut
    Je reconnais en effet la difficulté du projet
    C'est pourquoi je pense changer de suite la façon dont je vais coder mon QR Code. Je ne vais donc pas créer un Qr Code "conforme", il sera faux. Ce que j'aimerai c'est juste coder les binaires que je récupère du haut vers le bas et ainsi de suite.

Discussions similaires

  1. Récupérer le code source d'une page HTML
    Par phyn04 dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 24/11/2016, 14h45
  2. Réponses: 3
    Dernier message: 08/03/2009, 10h50
  3. conversion d'indentation dans un code python
    Par KINENVEU dans le forum Général Python
    Réponses: 2
    Dernier message: 26/02/2009, 04h04
  4. Réponses: 1
    Dernier message: 24/05/2008, 17h04
  5. [SWIG] dialogue entre code C et code python
    Par dmichel dans le forum Interfaçage autre langage
    Réponses: 12
    Dernier message: 19/12/2007, 21h19

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