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

Calcul scientifique Python Discussion :

Problème numpy.reshpape dans un script sous tkinter (an integer is required)


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut Problème numpy.reshpape dans un script sous tkinter (an integer is required)
    Bonjour à tous
    Voila pour faire simple disons que je veux creer un exe (sous tkinter afin d'eviter l'affreuse console ms dos) qui transforme une matrice ligne du type [0,1,2,3,4,5,6,7,8] en une matrice

    array([[1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]])

    pour cela j'utilise la billbiothèque numpy

    le script est le suivant

    voila les modules
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
    import PIL
    import Image
    import numpy
    et voila le coprs du script:
    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
    def matrixx(event):  # on applique le numpy.reshape à l'aide des informations collectées ci dessous.
        matrix= numpy.reshape(filtre,(hauteur,largeur))
     
     
    def valider_filtre (event): # on récupere dans la variable "largeur" le nombre de colonne de la matrice.
        global entree4, texte7, texte8, largeur
        largeur = entree3.get()
        texte5.destroy()
        texte6.destroy()
        entree3.destroy()
        texte7=Label(fenetre, text='le filtre est maintenant près à être reconstruit.')
        texte7.pack(side=TOP)
        texte8=Label(fenetre, text='faut il reconstruire le filtre (y ou n)?')
        texte8.pack(side=LEFT)
        entree4=Entry(fenetre)
        entree4.pack(side=RIGHT)
        entree4.bind("<Return>", matrixx)
     
     
    def valider_filtre2 (event):  # on récupère dans la variable "hauteur"  le nombre de lignes de la matrice qu'il faut construire.
        global entree3, texte5, texte6, hauteur
        hauteur = entree2.get()
        texte3.destroy()
        texte4.destroy()
        entree2.destroy()
        texte5=Label(fenetre, text='le filtre comporte ' + str(hauteur)+' lignes.')
        texte5.pack(side=TOP)
        texte6=Label(fenetre, text='combien comporte-t-il de colonnes?')
        texte6.pack(side=LEFT)
        entree3=Entry(fenetre)
        entree3.pack(side=RIGHT)
        entree3.bind("<Return>", valider_filtre)
     
    def valider_filtre_ligne (event): # on récupère dans la variable "filtre" la matrice en ligne.
        global entree2, texte3, texte4, filtre
        filtre= entree1.get()
        texte1.destroy()
        texte2.destroy()
        entree1.destroy()
        texte3=Label(fenetre, text='le filtre '+ str(filtre) +' à été defini.')
        texte3.pack(side=TOP)
        texte4=Label(fenetre, text='Nous allons reconstruire le filtre,\n entrer le nombre de lignes que comporte ce filtre.')
        texte4.pack(side=LEFT)
        entree2=Entry(fenetre)
        entree2.pack(side=RIGHT)
        entree2.bind("<Return>",valider_filtre2)
     
     
     
    # Programme principal
    fenetre = Tk()
    texte1 = Label(fenetre, text='application de filtre')
    texte1.pack(side=TOP)
    texte2 = Label(fenetre, text='Entrez votre filtre en ligne :')
    texte2.pack(side=LEFT)
    entree1 = Entry(fenetre)
    entree1.pack(side=RIGHT)
    entree1.bind("<Return>", valider_filtre_ligne)
    fenetre.mainloop()
    le fichier setup est classique:
    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
    #python
    from distutils.core import setup 
    import py2exe
    import Tkinter
     
    setup(name="TIPE 2007", 
          version="1.0", 
          description="traitement d'images numeriques", 
          author="Remy, MPSI 2", 
          windows = [
            {
                "script": "script.py",
                "icon_resources": [(1, "Globe.ico")]
            }
        ],)
    le problème est le suivant, l'execution se passe bien jusqu'à la dernière étape, c'est à dire que le programme collecte bien les iformations "filtre", "hauteur" et "largeur" mais une erreur se produit lors de l'execution de matrixx:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def matrixx(event):
        matrix= numpy.reshape(filtre,(hauteur,largeur))
    le message est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "Tkinter.pyc", line 1403, in __call__
      File "erreur.py", line 11, in matrixx
      File "numpy\core\fromnumeric.pyc", line 104, in reshape
      File "numpy\core\fromnumeric.pyc", line 36, in _wrapit
    TypeError: an integer is required
    quelqu'un peut m'aider??
    d'avance merci .
    Rémy

  2. #2
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Question simple, est ce que ton code fonctionne en mode console?

    C'est a dire est ce que si tu run ton programme .py il fonctionne?


    Ca va permettre de savoir si ca vient de ton code ou si ca vient de la compilation avec py2exe.

    Il y a une autre solutions de faire des exe.

    Je sais que Guigui utilise un installer.
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Hello, avant tout, merci beaucoup de vous interresser à mon problème, j'avou que je suis bien paumé en se moment

    en fait j'ai créé un programme en console à l'aide du module py2exe qui permet d'appliquer un filtre du type
    [[0, 1, 0],
    [1,-4, 1],
    [0, 1, 0]]

    sur une image bmp.
    Le programme fonctionne super bien en console, on rentre quand c'est demandé l'adresse du dossier ou se trouve l'image, le filtre à appliquer (que l'on rentre en ligne suivi de sa hauteur et sa largeur et que le programme reconstruit en matrice à l'aide de numpy.reshape) puis l'adresse d'enregistrement.

    la fonction "filtre" prend en argument toutes les input entrés par l'utilisateur et s'execute alors tout simplement... le programme n'a pas grand interet en fait il serait équivalent d'ouvrir python et d'écrire

    def filtre(adresse,filtre,hauteur,largeur,sortie): blabla

    puis d'executer la fonction mais bon j'ai tout de même voulu après l'avoir transformé en exe sous console en faire un "windows"

    j'utilise donc désormais Tkinter, la fonction "filtre" reste la même, le principe est le même:
    on demande successivement à l'utilisateur d'entrer les infos mais dans des "Entry" enfin des champs quoi...

    jusque là pas de problème , c'est un peu laborieux mais j'arrive a choper toutes les données nécessaire à l'application de la fonction....
    cad: adresse, filtre_en_ligne, hauteur, largeur, sortie

    reste plus qu'a exécuter "filtre" mais là sa coince et c'est au niveau du numpy.reshape qu'il y a un problème...

    les seuls post au sujet d'un "Integer is required" parlait du fait que différents modules définissaient des fonctions ayant le même nom ce qui pouvait poser probleme

    J'ai alors enlevé le
    que j'ai remplacé en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from Tkinter import Tk
    from Tkinter import Label
    from Tkinter import TOP
    from Tkinter import LEFT
    from Tkinter import RIGHT
    from Tkinter import Entry
    from Tkinter import Button #bref toutes les fonctions de Tkinter don j'ai besoin.
     
    #puis les autres modules necessaires...
    import PIL
    import Image
    import numpy
    rien n'y fait j'ai toujours à la fin de l'execution de l'exe (à l'étape critique d'execution de filtre(adresse,filtre,hauteur,largeur,sortie) le message suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "Tkinter.pyc", line 1403, in __call__
      File "tk2.py", line 138, in <lambda>
      File "tk2.py", line 103, in appl
      File "numpy\core\fromnumeric.pyc", line 104, in reshape
      File "numpy\core\fromnumeric.pyc", line 36, in _wrapit
    TypeError: an integer is required
    Je viens à peine de commencer à creer des exe.. si vous savez ce qui se passe merci de me répondre

    je commence à me documenter sur ce qui s'appelle wxPython
    ça semble plus sympathique et mieux expliqué sur le net que me conseillez vous?
    je n'ai jamais entendu parler d'installer, serait-ce ce qui permet de creer des programmes sous python que l'on peut executer sans que python soit installé sur la machine??

    Encore merci pour le temps que vous me consacrez.
    Rémy

  4. #4
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Donc ton probleme ne survient pas lorsque de la création de ton exe. Ton programme ne fonctionne pas meme en mode debug.


    Tu est sur que tes entry sont des integers.

    Je pense que ce sont des strings;

    Donc je ferai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Colonne= int(Entry1.text)
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    merci beaucoup, le problème n'est pas encore résolu mais je commence à comprendre ce qui coince (les arguments de la fonctions ne doivent pas être de type string et la fonction .get() dans entree.get() récupère une string c'est ça??)

    je pense cependant que la fonction numpy.reshpape n'est plus la même que celle que j'utilise d'habitude...

    Pensez vous que lorsque j'importe numpy et Tkinter la fonction soit définie par les 2 modules et qu'il peut y avoir ainsi confusion ??

    Je posterai demain le script exact que j'utilise, le plus tôt possible.

    Merci pour tout.
    Rémy

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par remya
    je commence à me documenter sur ce qui s'appelle wxPython
    ça semble plus sympathique et mieux expliqué sur le net que me conseillez vous?
    Je trouve wxPython très sympatique, mais au début tu n'en as pas forcément besoin... C'est un toolkit relativement complet, qui ne se contente pas de gérer ton interface graphique, mais contient aussi des classes permettant de gérer le réseau, les bdd, etc...

    Pour l'instant, rien ne t'empêche de continuer à explorer Tkinter en profondeur, et de passer ensuite à wxPython... L'avantage de Tkinter c'est qu'il est intégré à Python, donc a partir du moment ou l'interpréteur Python est installé, tu pourras faire tourner ton soft en Tkinter...Ce n'est pas le cas de wxPython, il faudra distribuer la librairie avec ton script

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut liste dans l'entry
    Bonjour, me re-voila ^^

    J'ai un peu avancé, si j'ai bien compris quand on fait
    la variable a contient la chaine de caractère de ce qui à été tapé dans entree1

    ainsi pour récupérer un nombre dant l'Entry entree1
    j'écris
    car rend 3

    le problème est que:

    Je dois collecter 5 informations pour pouvoir appliquer ma fonction "filtre"

    l'adresse de l'image à traiter:
    c'est un path donc dans l'entree1 j'écris c:\monimage.bmp
    et int(entree1.get()) rend "c:\\monimage.bmp" (je ne sais pas trop pourquoi le \ devien \\ mais bon... le premier argument de la fonction filtre est bien collecté...)

    le filtre: et là ça coince: j'entre un truc du type [0,-1,1]
    la le int() ne s'applique pas int("[0,-1,1]") génere une erreur... cet argument n'est donc pas défini....

    largeur , hauteur, sont des nombres que l'on obtient à l'aide de la fonction int()

    le dernier argument est le fichier de destination de l'image filtrée: on fait pareil que pour adresse.


    ainsi mon probleme est maintenant de collecter des éléments de type liste

    Voilà voila j'espere que je n'est pas été trop vague.
    Bonne journée

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut Résolu
    Hello, j'ai résolu le problème mais c'est du bricolage

    au lieu de rentrer une liste dans l'Entry j'entre les nombres séparés par des espaces

    au lieu de rentrer [0,-1,1]
    j'entre 0 -1 1

    l'entry fournit donc la chaine "0 -1 1"
    à partir de là j'ai créé une fonction qui à partir d'une chaîne de ce type renvoie la liste correspondante..

    C'est du bricolage mais ça marche, n'hésitez pas à me demander les sources si vous en avez besoins, bien que les fonctions ne soient pas méchantes à programmer, je me ferais un plaisir de vous les faire parvenir.

    Merci @ tous.
    Rémy.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/04/2008, 17h17
  2. Problème éléments vides dans du XML sous VB6
    Par matteli dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 21/11/2007, 16h01
  3. Problème d'insertion dans une table sous oracle
    Par admcent dans le forum Administration
    Réponses: 4
    Dernier message: 24/10/2007, 13h58
  4. [MySQL] Problème de pagination dans un script.
    Par Scurz dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 13/08/2006, 12h47
  5. problème de connect dans un .bat sous winXP
    Par sher56 dans le forum Connexion aux bases de données
    Réponses: 3
    Dernier message: 28/06/2006, 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