Foro de elhacker.net

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
  1. 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
  1. import sys
  2. if getattr(sys, 'frozen', False) :
  3.  app.master.iconbitmap(sys._MEIPASS + '\\estrella.ico')
  4. else :
  5.  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
  1. from tkinter import *
  2.  
  3. raiz = Tk()
  4. raiz.title("CRACKME KEYGEN")
  5.  
  6. ###########################################
  7. import sys
  8. if getattr(sys, 'frozen', False) :
  9.  raiz.iconbitmap(sys._MEIPASS + '\\estrella.ico')
  10. else :
  11.  raiz.iconbitmap('estrella.ico')
  12. ############################################
  13.  
  14. def generar():
  15.  
  16.    user = vartxt1.get()
  17.    sum = 0
  18.    largo = len(user)
  19.    if (largo > 0xB):
  20.        exit()
  21.    userMAY = ""
  22.    for i in range(largo):
  23.        if (ord(user[i]) < 0x41):
  24.            print ("CARACTER INVALIDO")
  25.            exit()
  26.        if (ord(user[i]) >= 0x5A):
  27.            userMAY += chr(ord(user[i]) - 0X20)
  28.        else:
  29.            userMAY += chr(ord(user[i]))
  30.    for i in range(len(userMAY)):
  31.        sum += ord(userMAY[i])
  32.  
  33.    xoreado = sum ^ 0x5678
  34.    TOTAL = xoreado ^ 0x1234
  35.    vartxt2.set(TOTAL)
  36.  
  37. ventana = Frame( width=350, height=120 )
  38. ventana.pack( padx=10, pady=10 )
  39.  
  40. vartxt1 = StringVar()
  41. txt1 = Entry( ventana, textvariable=vartxt1, width=25 )
  42. txt1.grid( row=0, column=2, padx=20, pady=10 )
  43.  
  44. vartxt2 = StringVar()
  45. txt2 = Entry( ventana, textvariable=vartxt2, width=25 )
  46. txt2.grid( row=2, column=2, padx=20, pady=10 )
  47.  
  48. txta = Label( ventana, text="NOMBRE :" )
  49. txta.grid( row=0, column=0 )
  50.  
  51. txtb = Label( ventana, text="SERIAL :" )
  52. txtb.grid( row=2, column=0 )
  53.  
  54. bgenerar = Button( ventana,command=generar, text="GENERAR", padx= 25, pady=5 )
  55. bgenerar.grid( row=3, column=2 )
  56.  
  57. ventana.mainloop()
  58.  

- Luego con pyinstaller:

Código
  1. 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.