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 :

Traitement d'une entrée [Python 3.X]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut Traitement d'une entrée
    Bonjour,

    J'ai réalisé quelques opérations de traitement d'image et j'aimerais passer cela en tkinter.
    tkinter ne peut pas afficher les jpg, d'après ce que j'ai compris.
    Je passe donc les images en gif

    Dans le code 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
    from PIL import Image as Im
    import os
    from tkinter import Entry, Label, Tk
    from tkinter import Canvas, PhotoImage, Button
     
    def jpg_gif(nom1,nom2):
        """ 
        conversion de format, par exemple jpg en gif
        """
        os.system('convert %s %s' % (nom1,nom2))
     
    def negatif_couleur(image1):
        """
        conversion couleur en négatif couleur, donc avec 3 canaux
        """
        image2 = Im.new('RGB',(largeur,hauteur))
        for colonne in range(largeur):
            for ligne in range(hauteur):
                pixel=image1.getpixel((colonne,ligne))
                rouge = 255 - pixel[0]
                vert = 255 - pixel[1]
                bleu = 255 - pixel[2]
                image2.putpixel((colonne,ligne),(rouge,vert,bleu))
        return(image2)
     
    def conv_negatif_couleur():
        """ conversion négatif couleur puis conversion de format
        pour avoir les aperçus dans tkinter"""
        res = negatif_couleur(mon_image)
        res.save(cible_jpg)
        jpg_gif(source_jpg,source_gif)
        jpg_gif(cible_jpg,cible_gif)
     
     
    fen1 = Tk()
     
    # création de widgets 'Label' et 'Entry' :
    txt1 = Label(fen1, text ='Nom de fichier (sans extension)')
    entr1 = Entry(fen1)
    # Mise en page entr1
    txt1.grid(row =1, column=1, sticky ='EW')
    entr1.grid(row =1, column =2)
     
    #champ 2
    txt2 = Label(fen1, text ='Extension')
    entr2 = Entry(fen1)
    # Mise en page entr2
    txt2.grid(row =2, column=1, sticky ='EW')
    entr2.grid(row =2, column =2)
     
    #nom_fich=entr1.get()
    #nom_ext = entr2.get()
    nom_fich = 'lena'
    nom_ext = 'jpg'
    ext1 = '.jpg'
    ext2 = '.gif'
    nom_fichier = nom_fich + '.' + nom_ext
    source_jpg = nom_fich + ext1
    source_gif = nom_fich + ext2
    cible_jpg = nom_fich + 'conv' + ext1
    cible_gif = nom_fich + 'conv' + ext2
     
    mon_image = Im.open(source_jpg)
    largeur,hauteur = mon_image.size
     
    ## Bouton pour convertir
    Button(fen1,text='Négatif couleur',command=conv_negatif_couleur).grid(row=3 , column=1) 
     
    # création d'un widget 'Canvas' contenant les images gif :
    can1 = Canvas(fen1, width =160, height =160, bg ='white')
    photo1 = PhotoImage(file = source_gif)
    image1 = can1.create_image(80, 80, image =photo1)
    can2 = Canvas(fen1, width =160, height =160, bg ='white')
    photo2 = PhotoImage(file = cible_gif)
    image2 = can2.create_image(80, 80, image =photo2)
     
    can1.grid(row =1, column =3, rowspan =3, padx =10, pady =5)
    can2.grid(row =1, column =4, rowspan =3, padx =10, pady =5)
     
    # fermeture
    Button(fen1,text='Quitter',command=fen1.destroy).grid(row=4, column=1) 
    # démarrage :
    fen1.mainloop()
    Tout fonctionne.
    Lorsque je commente / décommente les lignes 51 à 54 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #nom_fich=entr1.get()
    #nom_ext = entr2.get()
    nom_fich = 'lena'
    nom_ext = 'jpg'
    cela ne fonctionne plus.

    J'ai le message suivant (ligne 69 non réelle, en fait 63) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      File "/media/marco3/Données 1,9To/Informatique/python_marco/tkinter/tk-photo_inter.py", line 69, in <module>
        mon_image = Im.open(source_jpg)
     
      File "/usr/lib/python3/dist-packages/PIL/Image.py", line 1991, in open
        fp = builtins.open(fp, "rb")
     
    FileNotFoundError: [Errno 2] No such file or directory: '.jpg'
    Je subodore un souci de variable globale mais j'ai du mal à me dépatouiller.
    Si quelqu'un peut me donner un coup de main, sachant que ma connaissance de tkinter est proche du niveau zéro...
    Bon dimanche

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Je suppose que si tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nom_fich=entr1.get()
    nom_ext = entr2.get()
    alors que tu n'as pas fini de construire ta fenêtre, nom_fich est égal à ''.

    C'eût été mieux d'avoir une erreur, mais bon.

    Ceci explique donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FileNotFoundError: [Errno 2] No such file or directory: '.jpg'

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci VinsS.
    En fait, après quelques recherches, je ne comprends toujours pas.
    Je ne vois pas où je peux mettre ces lignes pour que cela fonctionne.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Salut,

    Citation Envoyé par marco056 Voir le message
    Je ne vois pas où je peux mettre ces lignes pour que cela fonctionne.
    Vous pensez programmation séquentielle alors qu'avec un GUI tel que Tk, on doit programmer piloté par les événements.
    Ajoutez un Bouton qui lorsqu'on clique dessus ira récupérer les chaînes de caractères que l'utilisateur a mis dans entr1 et entr2.
    Le chapitre 10 du Swinnen explique tout cela fort bien.

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

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Ok, merci bien.
    J'avoue ne pas avoir trop de temps pour potasser bien le Swimmen.
    Je regarde cela et je reviens ce soir vous dire quoi

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Bon, grâce à votre aide, j'ai réussi à avancer.

    Voici mon code :

    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
    from PIL import Image as Im
    import os
    from tkinter import Entry, Label, Tk
    from tkinter import Canvas, PhotoImage, Button
     
    def recup():
    #    nom_fich = 'lena'
    #    nom_ext = 'jpg'
        nom_fich=entr1.get()
        nom_ext = entr2.get()
        ext1 = '.jpg'
        ext2 = '.gif'
        global cible_jpg, cible_gif
        global source_jpg, source_gif
        nom_fichier = nom_fich + '.' + nom_ext
        source_jpg = nom_fich + ext1
        source_gif = nom_fich + ext2
        cible_jpg = nom_fich + 'conv' + ext1
        cible_gif = nom_fich + 'conv' + ext2
        global mon_image, largeur, hauteur
        mon_image = Im.open(source_jpg)
        largeur,hauteur = mon_image.size
        # print(nom_fichier)
     
    def jpg_gif(nom1,nom2):
        """ 
        conversion de format, par exemple jpg en gif
        """
        os.system('convert %s %s' % (nom1,nom2))
     
    def negatif_couleur(image1):
        """
        conversion couleur en négatif couleur, donc avec 3 canaux
        """
        image2 = Im.new('RGB',(largeur,hauteur))
        for colonne in range(largeur):
            for ligne in range(hauteur):
                pixel=image1.getpixel((colonne,ligne))
                rouge = 255 - pixel[0]
                vert = 255 - pixel[1]
                bleu = 255 - pixel[2]
                image2.putpixel((colonne,ligne),(rouge,vert,bleu))
        return(image2)
     
    def conv_negatif_couleur():
        """ conversion négatif couleur puis conversion de format
        pour avoir les aperçus dans tkinter"""
        res = negatif_couleur(mon_image)
        res.save(cible_jpg)
        jpg_gif(source_jpg,source_gif)
        jpg_gif(cible_jpg,cible_gif)
     
    def rafraichissement():
        can1 = Canvas(fen1, width =160, height =160, bg ='white')
        if os.path.isfile(source_gif) == True:
            photo1 = PhotoImage(file = source_gif)
            image1 = can1.create_image(80, 80, image =photo1)
        can2 = Canvas(fen1, width =160, height =160, bg ='white')
        if os.path.isfile(cible_gif) == True:
            photo2 = PhotoImage(file = cible_gif)
            image2 = can2.create_image(80, 80, image =photo2)
        can1.grid(row =1, column =3, rowspan =3, padx =10, pady =5)
        can2.grid(row =1, column =4, rowspan =3, padx =10, pady =5)
     
    fen1 = Tk()
    # création de widgets 'Label' et 'Entry' :
    txt1 = Label(fen1, text ='Nom de fichier (sans extension)')
    entr1 = Entry(fen1)
    # Mise en page entr1
    txt1.grid(row =1, column=1, sticky ='EW')
    entr1.grid(row =1, column =2)
     
    #champ 2
    txt2 = Label(fen1, text ='Extension')
    entr2 = Entry(fen1)
    # Mise en page entr2
    txt2.grid(row =2, column=1, sticky ='EW')
    entr2.grid(row =2, column =2)
     
    ## Bouton pour convertir
    Button(fen1,text='Acquisition',command=recup).grid(row=3 , column=1)
     
    ## Bouton pour convertir
    Button(fen1,text='Négatif couleur',command=conv_negatif_couleur).grid(row=4 , column=1) 
    ## Rafraichissement
    Button(fen1,text='Rafraichissement',command=rafraichissement).grid(row=4 , column=3,columnspan=2)
     
    # création d'un widget 'Canvas' contenant les images gif :
    can1 = Canvas(fen1, width =160, height =160, bg ='white')
    if os.path.isfile(source_gif) == True:
        photo1 = PhotoImage(file = source_gif)
        image1 = can1.create_image(80, 80, image =photo1)
    can2 = Canvas(fen1, width =160, height =160, bg ='white')
    if os.path.isfile(cible_gif) == True:
        photo2 = PhotoImage(file = cible_gif)
        image2 = can2.create_image(80, 80, image =photo2)
     
    can1.grid(row =1, column =3, rowspan =3, padx =10, pady =5)
    can2.grid(row =1, column =4, rowspan =3, padx =10, pady =5)
     
    # fermeture
    Button(fen1,text='Quitter',command=fen1.destroy).grid(row=5, column=1) 
    # démarrage :
    fen1.mainloop()
    J'imagine qu'il doit vous faire mal aux yeux mais avec mon niveau, je me contente pour l'instant de cela.
    Je n'ai pas réussi à me passer des variables globales.

    J'ai un souci, c'est que lorsque les fichiers gif existent, ils sont insérés automatiquement (cela, ce n'est pas grave) mais lorsqu'ils existent, je n'arrive pas à les voir (à rafraîchir l'affichage).

  7. #7
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Et bien peut-être qu'en ajoutant un bouton à la suite de ton entry pour lancer le processus de conversion de l'image ce sera le plus simple.

    Quand on clique sur ce bouton, une fonction est appelée, elle relève le contenu de l'entry, vérifie l'existence du fichier (os.path.isfile() et puis lance le travail.

    Mais il faut clairement que ta fenêtre soit affichée avant de faire quoi que ce soit avec les widgets.

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

Discussions similaires

  1. traitement d'une entrée analogique sous Step7
    Par kevary dans le forum Automation
    Réponses: 7
    Dernier message: 31/05/2012, 13h17
  2. Réponses: 2
    Dernier message: 17/04/2010, 23h30
  3. Réponses: 0
    Dernier message: 03/11/2008, 15h12
  4. Réponses: 6
    Dernier message: 31/01/2008, 06h34
  5. Réponses: 3
    Dernier message: 21/06/2004, 11h20

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