[Python-es] Conflicto python-exe

Fernando Garcia riello57 en gmail.com
Lun Oct 21 10:09:09 CEST 2013


Te explico:
De entrada, he cambiado la codificación por defecto para que me admita
acentos en la caja de búsqueda:

# -*- coding: iso-8859-1 -*-

Estos son los módulos que importo:

from Tkinter import*
from PIL import Image, ImageTk
import tkFont
import unicodedata
from unicodedata import normalize
import codecs

Y esta es la parte del código donde da el error:

def ventanaSalidaDatos():
        with open("PersonalCGPJ.txt","a")as PersonalCGPJ:
            nombre=StringVar()
            nombre=texto.get()
            archivo=open("PersonalCGPJ.txt", "r")
            #archivo=codecs.open("PersonalCGPJ.txt","r",
encoding='iso-8859-1')
            root.withdraw()
            ventanaSalidaDatos=Toplevel(root)
            w,h=ventanaSalidaDatos.maxsize()
            ancho=0.9*w
            alto=0.5*h
            centrarVentana(ventanaSalidaDatos, ancho, alto)
            botonFinalizar(ventanaSalidaDatos)
            botonVolver(root, ventanaSalidaDatos)
            ventanaSalidaDatos.title(nombre)
            ventanaSalidaDatos.config(bg="skyblue")
            ventanaSalidaDatos.resizable(0,0)
            datos=[]
            for linea in archivo.readlines():
               (*)linea=unicode(linea)
               (*)nombre=unicode(nombre)
                   pronombre=normalize('NFKD',
unicode(nombre)).encode('ASCII', 'ignore')#esta linea y la siguiente...
                   prolinea=normalize('NFKD',
unicode(linea)).encode('ASCII', 'ignore')#...arreglan los acentos.
                nombre=nombre.title()#esta linea convierte a mayúscula la
primera letra de la búsqueda introducida por el usuario.
                if pronombre in prolinea or nombre in prolinea:
                    datos.append(linea)
            n=len(datos)
            if n==0:
                    etiqueta1=Label(ventanaSalidaDatos, text=nombre+":",
font=fuente2, bg="skyblue", fg="brown").pack(side=TOP, anchor="nw")
                    etiqueta2=Label(ventanaSalidaDatos, text="No hay datos
para esta entrada.  Por favor, revise la ortografía", font=fuente3,
bg="skyblue", justify=LEFT).pack()
            else:
                    entrada.delete(0,END)
            lista=Listbox(ventanaSalidaDatos, height=n)
            scrollbar=Scrollbar(lista, orient=VERTICAL)
            scrollbar.config(command=lista.yview)
            lista.config(font=fuente3, fg="white", bg="royalblue",
yscrollcommand=scrollbar.set)
            for dato in datos:
                lista.insert(END, dato)
            scrollbar.pack(side=RIGHT, fill=BOTH, expand=YES)
            lista.pack(fill=BOTH, expand=YES)


Espero que se entienda.
Quiero aclarar que cuando corro la aplicación desde el IDLE de Python,
funciona perfectamente. Hace las busquedas estupendamente, indiferente a
mayúsculas, minúsculas y acentos. También admite acentos en la caja de
búsqueda. Aunque es innecesario, si a un usuario le da por meter un acento,
evito que de error.
Entonces decido pasar la aplicación a un ejecutable para distribuirla,
utilizando este archivo setup.py:

try:
    from distutils.core import setup
    import py2exe
    from modulefinder import Module
    import glob, fnmatch
    import sys, os, shutil
    import operator
except ImportError, message:
    raise SystemExit,  "Imposible cargar módulo. %s" % message

setup(
    windows = [{"script":"Personal.pyw"}],
    project_name = "Personal",
    project_version = "0.1",
    license = "mi aplicacion",
    author_name = "FGarcia",
    author_email = "riello57 en gmail",
    description = "Aplicación de todo el personal de la empresa",
    icon_file = "icon.ico",
    data_files = [(".", ["Personal.txt", "escudo.gif", "icon.ico"])],
    extra_modules = ["Tkinter", "PIL", "Image", "ImageTk", "tkFont",
"unicodedata", "codecs"],
    dist_dir ='dist'
 )


Utilizo py2exe para hacer el ejecutable. Todo procede normalmente, pero
cuando quiero arrancar la aplicación desde el ejecutable, me da error en la
línea del programa marcada con un asterisco: (*)linea=unicode(linea)

El error es mas o menos así:

UnicodeDecodeError: ascii, codec cant't decode byte 0xef in position 52:
ordinal not in range(128)

No se lo que puede ser. Python no me pone ninguna pega cuando la hago
correr desde el código fuente. Pero desde el ejecutable no lo admite.
¿Alguna idea?. Gracias.


El 21 de octubre de 2013 00:43, Guillermo Vaya <nadaird en gmail.com> escribió:

> Creo que sería más fácil ayudarte si pegas el trozo de código donde se
> genera el error (Con la cantidad suficiente como para poder ver donde
> inicializas cosas y tal) o un ejemplo pequeño que reproduzca el mismo
> error. Te recomiendo usar algún tipo de pastebin, para facilitar la lectura
> de código.
>
> Además, deberías pegar el error concreto, que no cuesta mucho y da más
> información.
>
> Un saludo
>
>
> 2013/10/20 Fernando Garcia <riello57 en gmail.com>
>
>> Estoy escribiendo una aplicación para gestionar una base de datos con el
>> personal de una empresa.
>> Para conseguir que la búsqueda en la bd sea indiferente a mayúsculas y
>> acentos (lo que se llama normalizar texto, vamos) debo convertir cada linea
>> de string a unicode. Haciéndolo así, la aplicación funciona correctamente,
>> ningún problema... siempre que se ejecute desde el código fuente. Desde el
>> intérprete de python, vamos.
>> Pero cuando convierto la aplicación a un ejecutable .exe para su
>> distribución, me da un error, localizado en la linea donde convierto la bd
>> a unicode: el típico ordinal not i  range, etc, etc...
>> ¿Alguien sabe porqué ocurre esto y como se puede solucionar?
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>>
>>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20131021/08cb8def/attachment.html>


Más información sobre la lista de distribución Python-es