¿Ruta de archivo para las imágenes empaquetadas de pyinstaller?

Estoy tratando de comstackr un archivo exe con pyinstaller pero no estoy seguro de cuáles deberían ser las rutas de archivo para las imágenes en el archivo principal de python.

En la parte superior de mi archivo principal de Python utilicé el código MEIPASS:

def resource_path(relative_path): """ Get absolute path to resource, works for dev and for PyInstaller """ try: # PyInstaller creates a temp folder and stores path in _MEIPASS base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) 

Desde esta pagina

Este es el código actual que tengo para cada archivo de imagen:

 root.iconbitmap('C:\\Users\\username\\Downloads\\TripApp\\BennySM.ico') filename = PhotoImage(file = 'C:\\Users\\username\\Downloads\\TripApp\\BgSM.gif') 

Sé que estas no son las mejores rutas de archivo, pero no estoy seguro de qué debo agregar para que el archivo de python sepa dónde buscar. Las imágenes se agrupan con el archivo exe y, si agrego el archivo exe al archivo de datos, encuentra las imágenes y se ejecuta.

¡Gracias! Intenté agregar resource_path antes pero faltaba la ruta del archivo en la sección de definición en la parte superior.

¡Gracias de nuevo!

Pregunta: ¿Cómo uso un archivo de datos en un progtwig construido con pyinstaller?

Primero asummos que el script de Python está funcionando actualmente cuando se ejecuta como un script, y que la siguiente línea está en el script:

 filename = PhotoImage(file='C:\\Users\\username\\Downloads\\TripApp\\BgSM.gif') 

Esta línea indica que la secuencia de comandos está recuperando un archivo de un directorio fijo (probablemente no es la mejor práctica, pero está bien para un ejemplo), y convierte ese archivo .gif en una instancia de objeto PhotoImage() . Esta será nuestra línea de base.

Será necesario hacer tres cosas para usar este archivo con éxito cuando nuestro script se ejecute como un progtwig creado por pyinstaller .

1. Durante la comstackción de pyinstaller, mueva el archivo a una ubicación conocida

Este paso se realiza agregando una directiva de datas al archivo `.spec ‘. Consulte esta publicación para obtener más información sobre cómo hacerlo. Pero en definitiva, esto será necesario:

 datas=[ ('C:\\Users\\test\\Downloads\\TripApp\\BgSM.gif', 'data'), ... ], 

Tenga en cuenta que hay dos elementos en la tupla. El primer elemento es la ruta de acceso de nuestro archivo .gif tal como existe en el script de trabajo de python antes de empaquetarlo en un ejecutable de pyinstaller. El segundo elemento de la tupla es el directorio en el que estará el archivo cuando se ejecute el archivo ejecutable.

2. En tiempo de ejecución, encuentra nuestro archivo .gif

Aquí está la función del ejemplo en la pregunta, refundida para usar:

  1. La ruta de acceso absoluta del ejemplo, cuando el script se ejecuta como un script o,
  2. La ruta especificada en la tupla de datas cuando el script se ejecuta como un progtwig creado por pyinstaller.

Código:

 def resource_path(relative_path): """ Get absolute path to resource, works for dev and for PyInstaller """ try: # PyInstaller creates a temp folder and stores path in _MEIPASS, # and places our data files in a folder relative to that temp # folder named as specified in the datas tuple in the spec file base_path = os.path.join(sys._MEIPASS, 'data') except Exception: # sys._MEIPASS is not defined, so use the original path base_path = 'C:\\Users\\test\\Downloads\\TripApp' return os.path.join(base_path, relative_path) 

3. Refundir la línea de base para trabajar en nuestro progtwig construido de pyinstaller.

Así que ahora que podemos construir un camino a nuestro. archivo gif cuando se ejecuta como un script, o como un progtwig construido por pyinstaller, nuestra línea de base se convierte en:

 filename = PhotoImage(file=resource_path('BgSM.gif'))