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 :

Utilisation de Tkinter


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Utilisation de Tkinter
    Bonjour à tous !

    Il m'a été donné un exercice en cours qui, je cite, consistait à :
    "Réaliser un programme en langage Python pour :

    "Créer une image 8x8 au format pgm ou png permettant de coder 8 caractères de telle sorte que sur chaque ligne, on retrouve le code binaire de la lettre. On codera par un pixel 'noir' le '0' et un pixel 'blanc' le '1'.
    Afficher une image représentant un flashcode à l'aide du module Tkinter à partir d'un fichier image 8x8 au format pgm ou png.
    Lire une image 8x8 au format pgm ou png pour afficher le message ainsi codé.
    "
    Je suis alors arrivé, avec beaucoup de difficulté, au programme suivant :

    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
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    import os
    from PIL import Image
    from tkinter import Tk
    from tkinter import Canvas
    from tkinter import Button
    from tkinter import Label
     
    def puissance(base, exposant):   #On définit la fonction puissance
        S = 1
        for i in range(1, exposant+1):
            S = S * base
        return S
     
    while 1:                    # boucle sur le choix
     
        print("         1 - Créer un flash-code à partir d'un mot de 8 caractères ASCII\n")          
        print("         2 - Afficher un flash-code à partir d'un fichier image png8x8\n")
        print("         3 - Décoder un flash-code à partir d'un fichier image png8x8\n")
        print("         4 - Sortie\n")
     
        Choix = input("Faites votre choix :\n")
     
     
        #Choix 1 : Création du fichier png à partir de la saisie de 8 caractères
     
     
        if Choix=='1':                               
            Mot_binaire =[[]]
            for i in range(8):    # boucle pour entrer les 8 caractères
                lettre=input("Entrez une lettre : ")
                chiffrebin=bin(ord(lettre))
                #print("numero de la lettre=",ord(lettre),'\n')
                #print("chiffrebin=",chiffrebin,'\n')
                #print("len=",len(chiffrebin),'\n')
                Mot_binaire.append(chiffrebin)
            #
            L,H=8,8
            im1=Image.new("RGB",(L,H))  # creation d'une image 8x8
            for y in range(H):
                #print("Mot_binaire[y+1]=",Mot_binaire[y+1])
                longmot = len(Mot_binaire[y+1])
                x=0
                r,v,b=0,0,0   # 0,0,0 correspond à un pixel noir
                im1.putpixel((x,y),(r,v,b))     # on met un pixel Noir en premier
                if longmot == 8:
                    im1.putpixel((x+1,y),(r,v,b)) # si 8, alors on met 2eme pixel Noir
                for x in range(2,longmot,1):          # pour chaque bit
                    if Mot_binaire[y+1][x]=='0': 
                        gris=0              # si bit = 0 ,on met pixel noir
                    else:
                        gris=255            # si bit = 1 , on met pixel blanc
                    r,v,b=gris,gris,gris
                    if longmot == 9:
                        im1.putpixel((x-1,y),(r,v,b))
                    else:
                        im1.putpixel((x,y),(r,v,b))
            fichier = input("Entrez le nom du fichier image à créer (.png) ? ")
            chemin  = input("Entrez le nom du répertoire ou stocker l'image ? ")
            NomComplet = chemin+fichier         
            im1.save(NomComplet)             # Sauvegarde du fichier png
            print("Le fichier ",NomComplet," a été correctement sauvé\n")
     
        #-----------------------------------------------------#
        #                                                     #
        #  Choix 2 : Lecture d'un fichier png                 #
        #           Affichage du Flashcode 8x8                #
        #                                                     #
        #-----------------------------------------------------#
        elif Choix == '2':                            
            fichier = input("Entrez le nom du fichier image à lire (.png)? ")
            chemin  = input("Entrez le nom du répertoire ou est stocké l'image? ")
            NomComplet = chemin + fichier
            print("Nom du fichier à lire :",NomComplet)
            #
            if os.path.isfile(NomComplet):
                # print("Le fichier existe")
                im1 = Image.open(NomComplet)	# ouverture du fichier image
                fenetre = Tk()
                texte=Label(fenetre, text="Flash-code",fg='black',bg='cyan')
                texte.pack()
                fenetre.attributes('-fullscreen', 1)
                #
                # Définit les dimensions du canevas 
                zone_dessin = Canvas(fenetre, width=400, height=400,bg="white")
                zone_dessin.pack() #Affiche le canevas
                L,H = im1.size                  # L = largeur de l’image,
                                                # H = sa hauteur, en pixels
                # print(" L=",L,"H=",H)
                if L==8 and H==8:
                    for y in range(H):	# on balaie toutes les lignes de l’image
                        #print (y)		
                        #
                        for x in range(H):
                            p = im1.getpixel((x,y))
                            # on calcule le niveau de gris (gris « moyenne » ici)
                            gris = (p[0]+p[1]+p[2])//3
                            #print(" valeur de gris",gris)
                            X = x*50
                            Y = y*50+25
                            if gris == 0:
                                zone_dessin.create_line(X,Y,X+50,Y,width=50,fill='black')
                    #
                    # fin de la boucle sur Y
                    # affichage de la fenetre avec un bouton Quit pour quitter
                    Button(fenetre, text="Quit", command=fenetre.destroy).pack()
                    fenetre.mainloop()
                else:
                    print("Erreur, le fichier png n'est pas de dimension 8x8\n")
            else:   # cas d'erreur de saisie sur le nom du fichier
                print("Le fichier n'existe pas")        
            #            
        #-----------------------------------------------------#
        #                                                     #
        #  Choix 3 : Lecture d'un fichier png (Flashcode)     #
        #            Decodage des caractères                  #
        #                                                     #
        #-----------------------------------------------------#
        elif Choix == '3':
            #
            fichier = input("Entrez le nom du fichier image à lire (.png)? ")
            chemin  = input("Entrez le nom du répertoire ou est stocké l'image? ")
            NomComplet = chemin + fichier
            print("Nom du fichier à lire :",NomComplet,"\n")
            #
            if os.path.isfile(NomComplet):
                # print("Le fichier existe")     
                im1 = Image.open(NomComplet)    # ouverture du fichier image
                L,H = im1.size                  # L = largeur de l’image,
                                                # H = sa hauteur, en pixels
                mot = ''                        # initialisation du mot
                for y in range(H):	  # on balaie toutes les lignes de l’image 
                    codeASCII = 0     # on initialise le codeASCII de la lettre
                    #print (y)		
                    #
                    for x in range(L): # pour chaque ligne,
                                       # on balaie toutes les colonnes (bit)
                        p = im1.getpixel((x,y)) 
                        # p[0] est la composante rouge
                        # p[1] la composante verte, et p[2] la composante bleue
                        # on calcule le niveau de gris (gris « moyenne » ici)
                        gris = (p[0]+p[1]+p[2])//3	
                        #   print(" valeur de gris",gris)
                        if gris == 255:   # si gris = 255 alors on a un blanc
                            # on ajouter la puissance de 2
                            codeASCII=codeASCII+puissance(2,7-x) 
                    #
                    #print("chiffre=",chiffre)
                    #print(" en caractere=",chr(chiffre),'\n')
                    # conversion du codeASCII en caractere , on l'ajoute au mot                
                    mot = mot +chr(codeASCII) 
                #
                print("Le fichier contient les caractères :",mot,'\n')
            else: # le fichier n'existe pas
                print("Le fichier n'existe pas")
            #
        #-----------------------------------------------------#
        #                                                     #
        #  Choix 4 : Sortie de la boucle                      #
        #                                                     #
        #-----------------------------------------------------#
        elif Choix == '4':
            break; 
        else:   
            print("Valeur Invalide : Choix à faire parmi 1, 2, 3 ou 4")
     
        os.system("pause")
    Dans la suite de l'exercice, il est demandé d'ajouter dans le programme l'affichage d'une boîte de dialogue à l'aide de Tkinter qui permette de choisir les différentes options : création/codage du flashcode, lecture du flashcode et décodage du flashcode.



    Je n'ai malheureusement pas réussi à effectuer cette dernière requête. Quelqu'un pourrait-il m'aider ou me mettre sur la voie ? Merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 121
    Points : 80
    Points
    80
    Par défaut
    Bonsoir,

    Je n'ai pas bien compris ce que tu voulais faire. Voici un exemple basique d'une fenetre Tk qui contient un bouton et qui excécute une action sur le clic :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import tkinter as tk
     
    def fonc() :
        print('Aie')
     
     
    fenetre = tk.Tk()
     
     
    tk.Button(fenetre,text='clic',command=fonc).grid(column=1,row=1)
    fenetre.mainloop()
    C'est un début, on peut ensuite placer bien d'autres widgets que des boutons.

    Vincent

    EDIT : Je n'ai rien dit... j'avais pas vu qu'il y avait déjà des boutons sur la fenêtre du coup, j'ai pas compris ce que tu voulais faire de plus....

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Je trouve ton truc intéressant (cela me donne des idées).
    Je ne connais que très peu tkinter.
    J'ai fait cela pour essayer de t'avancer.
    Les commandes sont bien sûr à changer.

    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
    import tkinter as tk
     
    def repondre1():
        affichage_fich['text'] = reponse_fich.get()	
     
    def repondre2():
        affichage_rep['text'] = reponse_doss.get()
     
    Fenetre = tk.Tk()
    Fenetre.title('Mon fichier')
     
    affichage_fich = tk.Label(Fenetre, width=40,height=6) 
    fich = tk.Label(Fenetre, text = 'Votre fichier :')
    reponse_fich = tk.Entry(Fenetre)
    valeur_fich = tk.Button(Fenetre, text =' Valider', command=repondre1)
    votre_fich = tk.Label(Fenetre, text='Votre fichier est :')
    fich.pack()
    reponse_fich.pack()
    valeur_fich.pack()
    votre_fich.pack()
    affichage_fich.pack()
     
    affichage_rep = tk.Label(Fenetre, width=40,height=6) 
    doss = tk.Label(Fenetre, text = 'Votre dossier :')
    reponse_doss = tk.Entry(Fenetre)
    valeur_doss = tk.Button(Fenetre, text =' Valider', command=repondre2)
    #affichage = tk.Label(Fenetre, width=40)
    votre_doss = tk.Label(Fenetre, text='Votre dossier est :')
    doss.pack()
    reponse_doss.pack()
    valeur_doss.pack()
    votre_doss.pack()
    affichage_rep.pack()
     
    Fenetre.mainloop()
    Pas d'aide par mp.

  4. #4
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Petite modif pour alléger selon moi (extension .png automatique) et on va dans le répertoire courant sauf si on souhaite le préciser dans le nom de fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fichier = input("Entrez le nom du fichier image à créer (.png) ? ")
    # chemin  = input("Entrez le nom du répertoire ou stocker l'image ? ")
    NomComplet = fichier + '.png'
    Pas d'aide par mp.

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/01/2014, 07h50
  2. Utiliser tkinter pour afficher une boite de dialogue
    Par AmFaye dans le forum Odoo (ex-OpenERP)
    Réponses: 2
    Dernier message: 17/12/2013, 14h17
  3. [Tkinter] Python 2.6 - Quel outil utiliser en remplacement du print()
    Par sir_nebuchadnezzar dans le forum Général Python
    Réponses: 16
    Dernier message: 20/11/2012, 09h51
  4. Utilisation de class Tkinter et OpenCV+Tkinter
    Par Gakusei dans le forum Tkinter
    Réponses: 4
    Dernier message: 17/06/2012, 17h04
  5. Réponses: 1
    Dernier message: 03/01/2011, 15h19

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