Hola, estoy aprendiendo python y e creado un programa con python y tkinter.
Tengo un problema con el icono, escribo este codigo en el CMD: pyinstaller llaves.py -i cuadrado.ico --noconsole --onefile
Crea el .exe con todo su icono pero a al abrirlo " Failed to execute script llaves "
(http://subirimagen.me/uploads/20190124113341.png)
Cuando copio el icono estrella.ico (el icono lo puse con tkinter) junto al exe, si se ejecuta perfectamente con su icono.
(http://subirimagen.me/uploads/20190124113746.png)
El exe Depende del icono que esta en el script que he creado.
¿Alguien sabe que código me falta para que no dependa del estrella.ico?
Gracias
Saludos,
- Cuando creas un fichero .exe sólido, este se descomprime en %temp% y se ejecuta, PERO las rutas relativas serán del .exe sólido original, por esta razón tus recursos enlazados por rutas relativas deben de estar junto al .exe sólido.
- Puedes agregar recursos adicionales así:
pyinstaller llaves.py -i cuadrado.ico --noconsole --onefile --add-data estrella.ico;.
- Entonces estrella.ico se descomprimirá en %temp%, ahora solo queda solucionar el problema de las rutas relativas.
-- Utiliza esta condicional para hallar la ruta completa de la carpeta descomprimida en el %temp% para especificar la ruta correcta de estrella.ico:
import sys
if getattr(sys, 'frozen', False) :
app.master.iconbitmap(sys._MEIPASS + '\\estrella.ico')
else :
app.master.iconbitmap('estrella.ico')
================
Referencias:
https://pyinstaller.readthedocs.io/en/stable/usage.html#what-to-bundle-where-to-search
https://pyinstaller.readthedocs.io/en/stable/runtime-information.html
Gracias EdePc por ayudarme.
¿Funcionara el exe si lo paso a otro ordenador?
mi objetivo es que funcione en cualquier ordenador con windows y sin python.
te dejo .py y .spec,
No tuve problemas al aprender python y tkinter pero poner un pequeño icono en la ventana esta complicado.
py:
===============================================
from tkinter import *
raiz=Tk()
raiz.title("CRACKME KEYGEN")
raiz.iconbitmap("estrella.ico")
def generar():
user=vartxt1.get()
sum=0
largo=len(user)
if (largo>0xb):
exit()
userMAY=""
for i in range(largo):
if (ord(user)<0x41):
print ("CARACTER INVALIDO")
exit()
if (ord(user) >= 0x5a):
userMAY+= chr(ord(user)-0X20)
else:
userMAY+= chr(ord(user))
for i in range(len(userMAY)):
sum+=ord (userMAY)
xoreado = sum ^ 0x5678
TOTAL = xoreado ^ 0x1234
vartxt2.set(TOTAL)
ventana=Frame(width=350, height=120)
ventana.pack(padx=10, pady=10)
vartxt1 =StringVar()
txt1 = Entry(ventana, textvariable=vartxt1, width=25)
txt1.grid(row=0, column=2, padx=20, pady=10)
vartxt2 =StringVar()
txt2 = Entry(ventana, textvariable=vartxt2, width=25)
txt2.grid(row=2, column=2, padx=20, pady=10)
txta= Label(ventana, text="NOMBRE :")
txta.grid(row=0, column=0)
txtb=Label(ventana, text="SERIAL :")
txtb.grid(row=2, column=0)
bgenerar = Button(ventana,command=generar, text="GENERAR", padx= 25, pady=5)
bgenerar.grid(row=3, column=2)
ventana.mainloop()
=====================================================
spec:
==================================================
# -*- mode: python -*-
block_cipher = None
a = Analysis(['llaves.py'],
pathex=['C:\\Users\\John\\Desktop\\practica'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='llaves',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=False , icon='cuadrado.ico')
===================================================
Gracias
- El problema no es pyhton o tkinter, el detalle está en pyinstaller --onefile
- Para que sea compatible con pyistaller --onefile haces el agregado que comenté antes:
from tkinter import *
raiz = Tk()
raiz.title("CRACKME KEYGEN")
###########################################
import sys
if getattr(sys, 'frozen', False) :
raiz.iconbitmap(sys._MEIPASS + '\\estrella.ico')
else :
raiz.iconbitmap('estrella.ico')
############################################
def generar():
user = vartxt1.get()
sum = 0
largo = len(user)
if (largo > 0xB):
exit()
userMAY = ""
for i in range(largo):
if (ord(user[i]) < 0x41):
print ("CARACTER INVALIDO")
exit()
if (ord(user[i]) >= 0x5A):
userMAY += chr(ord(user[i]) - 0X20)
else:
userMAY += chr(ord(user[i]))
for i in range(len(userMAY)):
sum += ord(userMAY[i])
xoreado = sum ^ 0x5678
TOTAL = xoreado ^ 0x1234
vartxt2.set(TOTAL)
ventana = Frame( width=350, height=120 )
ventana.pack( padx=10, pady=10 )
vartxt1 = StringVar()
txt1 = Entry( ventana, textvariable=vartxt1, width=25 )
txt1.grid( row=0, column=2, padx=20, pady=10 )
vartxt2 = StringVar()
txt2 = Entry( ventana, textvariable=vartxt2, width=25 )
txt2.grid( row=2, column=2, padx=20, pady=10 )
txta = Label( ventana, text="NOMBRE :" )
txta.grid( row=0, column=0 )
txtb = Label( ventana, text="SERIAL :" )
txtb.grid( row=2, column=0 )
bgenerar = Button( ventana,command=generar, text="GENERAR", padx= 25, pady=5 )
bgenerar.grid( row=3, column=2 )
ventana.mainloop()
- Luego con pyinstaller:
pyinstaller llaves.py -i cuadrado.ico --noconsole --onefile --add-data estrella.ico;.
Nombre: pepe
Serial: 17766
- Te podría recomendar también este libro en inglés, pero lo raro es que no está la orden iconbitmap :-\ http://infohost.nmt.edu/tcc/help/pubs/tkinter/tkinter.pdf
-- Y por supuesto este otro buen libro en español, es muy práctico con muchos ejemplos: https://openlibra.com/es/book/download/doma-de-serpientes-para-ninos-edicion-windows
Muchisimas gracias ;-) EdePC, Si funciona :o
Voy a leer los libros.