Test Foro de elhacker.net SMF 2.1

Programación => Scripting => Mensaje iniciado por: Jhon2019 en 24 Enero 2019, 18:46 PM

Título: Icono en python con tkinter
Publicado por: Jhon2019 en 24 Enero 2019, 18:46 PM
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
Título: Re: Icono en python con tkinter
Publicado por: EdePC en 25 Enero 2019, 03:26 AM
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
Título: Re: Icono en python con tkinter
Publicado por: Jhon2019 en 26 Enero 2019, 23:01 PM
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
Título: Re: Icono en python con tkinter
Publicado por: EdePC en 27 Enero 2019, 01:18 AM
- 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
Título: Re: Icono en python con tkinter
Publicado por: Jhon2019 en 27 Enero 2019, 02:54 AM
Muchisimas gracias  ;-)  EdePC, Si funciona  :o
Voy a leer los libros.