Icono en python con tkinter

Iniciado por Jhon2019, 24 Enero 2019, 18:46 PM

0 Miembros y 1 Visitante están viendo este tema.

Jhon2019

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 "




Cuando copio el icono estrella.ico (el icono lo puse con tkinter) junto al exe, si se ejecuta perfectamente con su icono.



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

EdePC

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í:

Código (dos) [Seleccionar]
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:

Código (python) [Seleccionar]
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

Jhon2019

#2
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

EdePC

#3
- 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:

Código (python) [Seleccionar]
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:

Código (dos) [Seleccionar]
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

Jhon2019

Muchisimas gracias  ;-)  EdePC, Si funciona  :o
Voy a leer los libros.