2016-06-12 1 views
1

J'essaye de construire une application kivy en utilisant la machine virtuelle buildozer. Cela fonctionne correctement tant que mon fichier main.py ne contient aucun chemin d'accès spécifique aux fichiers. Par exemple, dans mon application, je souhaite afficher une image. Si je cours sous Windows, je specifiy la source commeChemin d'accès aux fichiers dans l'application kivy non valide après la construction avec buildozer

C:\pathtoapp\img\image.png 

Dans Ubuntu, il serait

/home/pathtoapp/img/image.png 

Si je tente de construire l'application avec buildozer je reçois le message d'erreur:

I/Python (15649): [Error ] [Image ] Error reading file 

puis le chemin ci-dessus. Voici un exemple qui fonctionne sur Ubuntu, mais qui donne le message d'erreur ci-dessus lorsqu'il est déployé sur mon téléphone Android:

from kivy.lang import Builder 
from kivy.app import App 
from kivy.uix.image import Image 


kv = ''' 
BoxLayout: 
    Image: 
     source: app.image 
''' 


class Test(App): 
    def build(self): 
     self.image = '/home/kivy/Desktop/test/img/g3347.png' 
     print(self.image) 
     return Builder.load_string(kv) 

if __name__ == '__main__': 
    Test().run() 

Maintenant, je suis perplexe car je ne sais pas comment définir correctement le chemin dans mon code .

Répondre

1

Bien sûr, cela donne un message d'erreur. Vous n'avez pas un tel chemin sur Android, ni sur Windows. Avec Kivy vous pouvez utiliser relative paths, qui devrait fonctionner si vous utilisez quelque chose comme:

self.image = 'g3347.png' 

si ce fichier est dans le répertoire avec votre main.py/main.pyo. Dans le passé, parfois n'a pas fonctionné pour moi sur Android, j'ai donc un « cran de sûreté » afin que je ne rencontre plus ce problème (il devrait fonctionner, mais mieux prévenir que guérir):

os.path.dirname(os.path.abspath(__file__)) 

qui retourne le chemin vers le dossier main.py et vous pouvez l'utiliser comme ceci:

path = os.path.dirname(os.path.abspath(__file__)) 
self.image = path + '/g3347.png' 

Je suis aussi utilisé pour mettre le chemin dans App classe afin que je puisse toujours y accéder.

Pour plus de chemins de fantaisie, regardez App.user_data_dir, ce qui résout ce problème pour vous aussi, même si ce n'est pas une bonne chose si vous laissez un peu de désordre après vous si vous désinstallez par exemple. si vous êtes sur Windows et que vous décidez de supprimer votre application, mais oubliez d'une manière ou d'une autre de supprimer votre dossier de %appdata% ou de %localappdata%.

+0

Wow, c'est ce que j'aurais dû comprendre moi-même. Merci beaucoup. Cela fonctionne avec des chemins relatifs, mais je garderai la sécurité à l'esprit au cas où je rencontrerais des problèmes dans le futur. – Jobiwan