我正在尝试使用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手机时会出现上述错误消息:
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()
现在我感到困惑,因为我不知道如何在我的代码中正确指定路径。
答案 0 :(得分:2)
当然它会给出错误信息。你在Android上也没有这样的路径,也没有在Windows上。使用Kivy,您可以使用relative paths,如果您使用以下内容,这应该可以使用:
self.image = 'g3347.png'
如果该文件位于您的main.py
/ main.pyo
的目录中。在过去,它有时在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%
删除您的文件夹。