使用 buildozer 构建后,kivy 应用程序中的文件路径无效

Path to files in kivy app not valid after building with buildozer

我正在尝试使用 buildozer 虚拟机构建一个 kivy 应用程序。只要我的 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 phone:

时会给出上述错误消息
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()

现在我很困惑,因为我不知道如何在我的代码中正确指定路径。

当然是报错了。您在 Android 上没有这样的路径,在 Windows 上也没有。在 Kivy 中,你可以使用 relative paths,如果你使用像这样的东西应该可以工作:

self.image = 'g3347.png'

如果该文件在您的 main.py/main.pyo 目录中。过去它有时在 Android 上对我不起作用,所以我有一个 "safety catch" 这样我就不会再遇到这个问题(它现在应该可以工作,但安全总比后悔好):

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

这将 return 指向 main.py 文件夹的路径,您可以像这样使用它:

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

我也习惯把路径放在Appclass里,方便随时访问

更多花哨的路径请查看 App.user_data_dir,它也为您解决了这个问题,但如果您卸载后留下一些混乱,这不是一个好方法,例如如果您在 Windows 上并且决定删除您的应用程序,但不知何故忘记从 %appdata%%localappdata%.

中删除您的文件夹