Путь к файлам в приложении kivy недействителен после сборки с помощью buildozer

Я пытаюсь создать приложение kivy с помощью виртуальной машины buildozer. Он отлично работает, пока мой main.py не содержит конкретных путей к файлам. Например, в моем приложении я хочу отображать изображение. Если бы я работал в Windows, я бы указал источник как

C:\pathtoapp\img\image.png

В Ubuntu это было бы

/home/pathtoapp/img/image.png

Если я попытаюсь создать приложение с помощью buildozer, я получаю сообщение об ошибке:

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

а затем по указанному выше пути. Вот пример, который работает в Ubuntu, но при развертывании на моем телефоне 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()

Теперь я озадачен, так как не знаю, как правильно указать путь в моем коде.


person Jobiwan    schedule 12.06.2016    source источник


Ответы (1)


Конечно, выдает сообщение об ошибке. У вас нет такого пути ни на Android, ни на Windows. С Kivy вы можете использовать относительные пути, которые должны работать, если вы используйте что-то вроде:

self.image = 'g3347.png'

если этот файл находится в каталоге с вашим _2 _ / _ 3_. Раньше у меня иногда не работало на Android, поэтому у меня есть «предохранитель», чтобы я больше не сталкивался с этой проблемой (теперь она должна работать, но лучше перестраховаться, чем сожалеть):

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

который вернет путь к папке main.py, и вы можете использовать его так:

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

Я также привык помещать путь в App класс, чтобы всегда иметь к нему доступ.

Чтобы узнать больше о необычных путях, посмотрите App.user_data_dir , который решает эту проблему и для вас, хотя это не очень хорошо, если вы оставите после себя беспорядок, если вы удалите, например, если вы работаете в Windows и решили удалить приложение, но почему-то забыли удалить свою папку из %appdata% или %localappdata%.

person Peter Badida    schedule 12.06.2016
comment
Вау, это я должен был понять сам. Большое спасибо. Он работает с относительными путями, но я буду помнить о предохранителях на случай, если у меня возникнут проблемы в будущем. - person Jobiwan; 12.06.2016