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

wxPython Discussion :

caractères qui ne s'affichent pas dans wxpython


Sujet :

wxPython

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 25
    Points : 14
    Points
    14
    Par défaut caractères qui ne s'affichent pas dans wxpython
    Salut a vous tous,
    Est-ce que quelqu'un aurait la solution a savoir que j'ai créé un petit logiciel pour entrer des numéros de téléphone ainsi que leur nom et quand j'écris un caractère accentué j'ai un message d'erreur a l'entrer dasns la base de donné et.
    Toutefois si j'utilise cette même routine dans le mode console, cela fonctionne très bien.
    Voici le code en espérant que vous trouverez une solution.
    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
    #!/usr/bin/python
    # *- coding: iso-8859-1 -*
    import sys
    import os
    import string
    import wx #importation du modulegraphique wx
    import winsound
    ID_PARENT = 1000 #control ID de la fenetre principale
     
     
     
    #classe fenetre principalemenus et boutons
    class LesMenus(wx.Frame):
     def __init__(self, titre):
      wx.Frame.__init__(self, None, ID_PARENT, title = titre, size = (800, 600))
      self.panel = wx.Panel(self, -1, pos=(10,50),size=(300,400))
      self.panel.SetBackgroundColour('black')
      menuFichier = wx.Menu(style = wx.MENU_TEAROFF)
      menuFichier.Append(wx.ID_EXIT, "&Quitter\tCTRL+q") 
      menuAide = wx.Menu(style = wx.MENU_TEAROFF)
      menuAide.Append(wx.ID_ABOUT, "&A propos ...\tCTRL+N")
     
      #Barre de menu et affichage des menus dans cette barre
      menuBarre = wx.MenuBar() 
      menuBarre.Append(menuFichier, "&Fichier") 
      menuBarre.Append(menuAide, "&Aide") 
      self.SetMenuBar(menuBarre) 
     
      #creation des boutons
      boutonNiveau1 = wx.Button(self.panel, -1, "Recherche", pos=(200, 200))
      boutonNiveau2 = wx.Button(self.panel, -1, "Ajouter", pos=(200, 250))
     
      boutonAide = wx.Button(self.panel, -1, "Aide", pos=(600, 415))
      boutonExit = wx.Button(self.panel, -1, "Quitter", pos=(700, 415))
     
      #evenements des menus
      wx.EVT_MENU(self, wx.ID_EXIT, self.OnExit) 
      wx.EVT_MENU(self, wx.ID_ABOUT, self.OnAbout) 
     
      #evenements des boutons
      self.Bind(wx.EVT_BUTTON, self.OnExit, boutonExit)
      self.Bind(wx.EVT_BUTTON, self.OnAbout, boutonAide)
      self.Bind(wx.EVT_BUTTON, self.search, boutonNiveau1)
      self.Bind(wx.EVT_BUTTON, self.EcrireFichier, boutonNiveau2)
     
     
     #definition du menu quitter
     def OnExit(self, evt): 
     
      self.Destroy() 
     
     #definition du menu a propos
     def OnAbout(self, evt):
      d = wx.MessageDialog(self, "Petit ageinda", "A propos :Diagnostique ", wx.OK)
      d.ShowModal()
      d.Destroy()
     
     
     def search(self, evt):
    #nmf est nom de mon fichier
      nmf = 'lecture.txt'
    #db est un variable quelconque, don le nom de mon fichier et un paramètre r pour read 
      db = file(nmf,'r')
    #Db.readlines pour lire tous les lignes. A ne pas oublier le s a la fin de line
      liste = db.readlines()
     
    #Db.close veut dire fermer le fichier.
      db.close()
      n = wx.TextEntryDialog(self,"Entrez le nom ici","",style = wx.OK | wx.CANCEL | wx.CENTRE)
    #afficher la fenêtre tant et aussi longtemps que l'on ne la fermera pas
      reponse = n.ShowModal()
    #Récupération du text entré
      nn = n.GetValue()
      if reponse == wx.ID_OK or n == "":
       winsound.PlaySound('c:/Python25/wav_tel/bing.wav', winsound.SND_NODEFAULT)
     
       #n.Destroy()
      #recuperation du nombre en string
      for i in liste:
       if i.find(nn) <> -1:
        winsound.PlaySound('c:/Python25/wav_tel/bing.wav', winsound.SND_NODEFAULT)
        n = wx.MessageDialog(self, "le résultat est:  "+i, "affichage du résultat", wx.OK) 
        n.ShowModal()
        n.Destroy()
        return
     
     
     def EcrireFichier(self, evt):
     
      fichier = open('lecture.txt', 'a')
      ligne = wx.TextEntryDialog(self,"Entrez le texte ici","",style = wx.OK | wx.CANCEL | wx.CENTRE)
    #afficher la fenêtre tant et aussi longtemps que l'on ne la fermera pas
      reponse = ligne.ShowModal()
    #Récupération du text entré
      nn = ligne.GetValue()
      #recuperation du nombre en string
      if nn != '':
       fichier.write(nn +"\n")
       fichier.close()
       ligne.Destroy()
       return
     
    #la classe de l'application
    class MonApp(wx.App): 
     def OnInit(self): 
      fen = LesMenus("Numéro de Téléphone") 
      fen.Show(True) 
      self.SetTopWindow(fen) 
      return True 
     
    #boucle principale
    app = MonApp()
    app.MainLoop()

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 139
    Points
    139
    Par défaut
    Bonjour,

    ca a l'air d'un probleme de gestion de l'unicode. Merci d'envoyer le message d'erreur.

    A verifier en attendant: il y a deux versions de wxpython: avec et sans unicode. Laquelle as tu installée? Par ailleurs, tes strings devraient etre précédées d'un u (u"Téléphone"). En python 3, toutes les strings seront unicode, mais d'ici la...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Merci et ci-joint le message d'erreur.
    wxPython: stdout/stderr
    Traceback (most recent call last):
    File "rechercheText.py", line 102, in EcrireFichier
    fichier.write(nn +"\n")
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 1: ordinal
    Le même message du code range 128 s'affiche si j'écris manuellement dans le fichier et que j'écris un accent.
    J'utilise la version 2.5 avec uni code.
    regimari

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 139
    Points
    139
    Par défaut
    Manifestement, tu essaies d'écrire des caractères accentués directement dans un fichier ASCII. Voila un explication détaillée des problemes d'encoding en python: http://www.pyzine.com/Issue008/Secti...Encodings.html

    Pour faire simple, ceci devrait faire l'affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fichier.write(nn.encode("latin-1") +"\n")
    par exemple. (ou un autre encoding suivant tes besoins).

    Mais ca n'explique pas pourquoi ca marche en mode console...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 25
    Points : 14
    Points
    14
    Par défaut Caractère qui ne s'affiche pas!
    Un grand merci pour ta réponse!
    Cela a très bien fonctionné.
    Effectivement, je ne sais pas pourquoi cela fonctionne bien en mode console, mais je vais m'en souvenir.
    regimari

  6. #6
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut wx et accents donne UnicodeEncodeError
    Bonjour,
    Je reprends ce poste car j'ai eu le message d'erreur suivant en écrivant un fichier txt :
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 2: ordinal not in range(128)
    j'ai appliqué la méthode donné dans le lien suivant :
    http://www.developpez.net/forums/sho...hlight=unicode
    J'ai installé la version ansii et cela fonctionne maintenant.
    Mais..quand je ne comprend pas (au moins un peu) je ne suis pas rassuré car cela finit toujours par poser pb.
    Auriez vous une explication svp
    Alex

  7. #7
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    si tu utilises de l'unicode (donc accents ou caractères spéciaux) avec wxPython, installer la version unicode.
    Par contre, quand tu veux ecrire dans un fichier texte, s'il s'agit de l'unicode, il faut tout d'abord l'encoder en chaîne normale ( http://python.developpez.com/faq/?page=Unicode )

  8. #8
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut L'unicode=anormal sous python 25 ?
    D'accord !!! merci Guigui
    Dans la FAQ il est mentionné la différence entre les chaines ''normales'' (ISO-8859-1,utf...) et l'unicode.
    Je croyais que l'unicode pouvais (quand même) être utilisé aussi sous python directement.
    Mais non, si je comprend bien python travaille en mode encodé standard et le mode unicode est un encodage supplémentaire (utilisé par wx) mais à reconvertir pour tout ce qui est python...Donc wx est en avance sur python 2.5 ?

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/usr/bin/env python
    # -*- coding: iso-8859-1 -*-
    eAccent='é'
    print eAccent," : en iso-8859-1 est affiché sans pb"
     
    eAccent=unicode(eAccent, 'iso-8859-1')
    print "eAccent est unicode ? : ",isinstance(eAccent, unicode)
    #print eAccent
    #Provoque : UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 0:ordinal not in range(128)
     
    print eAccent.encode('iso-8859-1') # affiche é

  9. #9
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Non, Python travaille aussi bien en chaîne normal qu'en unicode.
    Simplement, 'toto' est une chaîne normale alors que u'toto' est une chaîne unicode. Donc on a tendance à travailler en chaîne normale.
    Si on veut être sûr de travailler qu'avec des chaînes unicodes, dès que tu as une chaîne, il faut tout de suite penser à la convertir en unicode (si elle ne l'est pas encore).
    C'est vrai que c'est assez pénible et qu'il faut faire attention. Mais en travaillant avec wxPython unicode, toute chaîne sorti de wxPython est en unicode, soit on la transforme directement en chaîne normale, soit on pense à utiliser dans Python que des chaînes unicode pour être sûr qu'il n'y est pas d'embrouille. Il me semble que dans Python 3, toute chaîne sera unicode (enfin, j'en suis pas très sûr).

    Par contre, toutes les bibliothèques externes que tu utilises, ne sont pas forcément compatible unicode (donc, de ce côté-là, il fautfaire attention)
    Certaines fonctions aussi de Python ne sont pas forcément compatibles unicode aussi

    Dans tout les cas, pour écrire dans un fichier texte, il faut que la chaîne soit une chaîne normale (donc à convertir avant d'écrire dans le fichier texte).
    Et ce qu'il faut penser, c'est qu'il faut toujours travailler avec un unique système d'encodage pour éviter tout problème

    Je te rassure, j'ai aussi des problèmes d'encodage (qui ne sont pas tous réglés) dans mes applis (j'utilise wxPython unicode et les chaînes extraite de wxPython (genre celles des grids) que je traite dans Python, je les encode auparavant.

  10. #10
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut
    C'est chaud dès qu'il y a des mélanges ... un simple print d'une variable string unicode (sans conversion) provoque un message d'erreur.
    Je ne comprenais pas pourquoi j'avais ce message quand je débuguai mes applis wx
    Le top serait de mettre en tête de programme :
    # -*- coding: unicode -*-
    Comme cela il n'y aurais pas de conversion à faire

Discussions similaires

  1. Réponses: 15
    Dernier message: 23/01/2007, 15h27
  2. données qui ne s'affichent pas dans le formulaire
    Par zeloutre dans le forum Access
    Réponses: 16
    Dernier message: 04/10/2006, 15h29
  3. Page PHP qui ne s'affiche pas dans le site
    Par cyberdevelopment dans le forum Langage
    Réponses: 2
    Dernier message: 11/08/2006, 11h49
  4. excel: colonne qui ne s'affiche pas dans une liste
    Par fast&furious dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/07/2006, 18h12
  5. Champs qui ne s'affichent pas dans formulaire
    Par capitaine dans le forum Access
    Réponses: 1
    Dernier message: 02/06/2006, 15h00

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