0

I have been trying for the past 8 hours to get my image to show up in my .exe built using pyinstaller. My program is written in kivy. Everything else works, but the image doesn't show up. I have read [this][2] question. That has not worked for me. Or I just followed the answer wrong. If someone can please explain to me how to do it step by step, I would be very grateful. Also, if there is another answer, please consider telling me that as well.

I will include my main.py file:

#!/usr/bin/env python3

import os
import sys
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.image import Image
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.slider import Slider

class SayHello(App):
    def build(self):
        self.window = GridLayout()
        self.window.cols = 1
        self.window.size_hint = (0.6,0.7)
        self.window.pos_hint = {"center_x": 0.5, "center_y": 0.5}

        self.window.add_widget(Image(source = "say.png"))

        self.greeting = Label(
                        text = "Hello",
                        font_size = 40,
                        color = "#00FFCE"
                        )
        self.window.add_widget(self.greeting)
    
        self.slid = Slider(min = 0, max = 300, orientation = "horizontal")
        self.window.add_widget(self.slid)
    
    
        
    
        
        self.user = TextInput(
                    multiline = False,
                    padding_y = (20,20),
                    size_hint = (1, 0.4)
                    )
        self.window.add_widget(self.user)

        self.button = Button(
                      text = "Click me to greet you!",
                      size_hint = (1,0.5),
                      bold = True,
                      background_color = "00FFCE",
                      )
        
        self.button.bind(on_press = self.callback)
        self.window.add_widget(self.button)

        return self.window


    def slided(self, event):
        self.slid
    
    
    
    def callback(self, event):
        self.greeting.text = "Hello " + self.user.text + "!"



def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    base_path = getattr(
        sys,
        '_MEIPASS',
        os.path.dirname(os.path.abspath(__file__)))
    return os.path.join(base_path, relative_path)

path = resource_path("say.png")
        





    

if __name__ == "__main__":
    SayHello().run()  


  [1]: https://stackoverflow.com/questions/31836104/pyinstaller-and-onefile-how-to-include-an-image-in-the-exe-file
  [2]: https://stackoverflow.com/questions/48467917/include-kv-json-files-while-packaing-kivy-with-pyinstaller-onefile

Thanks in advance!

Mahe
  • 17
  • 5

1 Answers1

1

The problem is with your attempt to fix the path:

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    base_path = getattr(
        sys,
        '_MEIPASS',
        os.path.dirname(os.path.abspath(__file__)))
    return os.path.join(base_path, relative_path)

path = resource_path("say.png")

just replace that code with:

import kivy.resources

if getattr(sys, 'frozen', False):
    # this is a Pyinstaller bundle
    kivy.resources.resource_add_path(sys._MEIPASS)
John Anderson
  • 29,140
  • 2
  • 12
  • 33
  • That worked! Thanks. Also, will the same EXE work on a different computer with same OS while including the image? – Mahe Mar 31 '22 at 01:24
  • I have built `exe` files for `Windows` and sent them to people who could run them on other versions of `Windows`, but haven't had much experience along those lines with Linux. – John Anderson Mar 31 '22 at 02:33
  • Does this only work with image files or does it work with any type of file? – Mahe Mar 31 '22 at 18:35
  • According to the [documentation](https://kivy.org/doc/stable/api-kivy.resources.html): "almost all Kivy resources are looked up using the resource_find()". But I don't know specifically what this includes. It does not have a file type limitation. – John Anderson Mar 31 '22 at 19:33