2016-06-12 15 views
1

Ich versuche, eine Kivy-App mit dem Buildozer virtuellen Maschine zu bauen. Es funktioniert gut, solange meine main.py keine bestimmten Pfade zu Dateien enthält. Zum Beispiel möchte ich in meiner App ein Bild anzeigen. Wenn ich unter Windows laufen, würde ich die Quelle alsPfad zu Dateien in Kivy-App nicht gültig nach dem Erstellen mit Buildozer

C:\pathtoapp\img\image.png 

In Ubuntu specifiy wäre es

/home/pathtoapp/img/image.png 

sein, wenn ich versuche, die App mit buildozer zu bauen ich die Fehlermeldung:

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

und dann den obigen Pfad. Hier ist ein Beispiel, das auf Ubuntu funktioniert, aber was die oben Fehlermeldung, wenn auf mein Android-Handy im Einsatz:

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() 

Jetzt bin ich verwirre, wie ich weiß nicht, wie richtig den Weg in meinem Code angeben .

Antwort

1

Natürlich gibt es eine Fehlermeldung. Sie haben einen solchen Pfad weder auf Android noch auf Windows. Mit Kivy können Sie relative paths, verwenden Sie das, wenn Sie so etwas wie verwenden sollte funktionieren:

self.image = 'g3347.png' 

, ob die Datei im Verzeichnis mit Ihrem main.py/main.pyo ist. In Vergangenheit so ist es manchmal nicht für mich auf Android nicht funktioniert, so habe ich eine „Sicherheitssperre“, dass ich dieses Problem nicht mehr auftreten würde (sollte es funktionieren jetzt, aber sicher ist sicher):

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

, die den Pfad zu dem Ordner main.py zurückkehren und Sie können es wie folgt verwenden:

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

ich auch verwendet, um den Weg in App Klasse zu setzen, damit ich immer auf sie zugreifen können.

Für mehr Phantasie Wege betrachten Sie App.user_data_dir, die dieses Problem für Sie auch löst, obwohl es nicht ein schönes ist, wenn Sie einige Unordnung nach Ihnen verlassen, wenn Sie z. Wenn Sie unter Windows sind und Sie entscheiden, Ihre Anwendung zu entfernen, aber irgendwie vergessen, Ihren Ordner von %appdata% oder %localappdata% zu entfernen.

+0

Wow, das hätte ich selbst herausfinden sollen. Danke vielmals. Es funktioniert mit relativen Pfaden, aber ich behalte den Sicherheitsfang im Auge, falls ich in der Zukunft auf Probleme stoße. – Jobiwan