你如何从一个包中创建一个kivy apk?

How do you create a kivy apk from a package?

我有一个简单的 python/kivy 包,我希望使用 Buildozer 从中创建一个 android APK。来自根目录的包组织为:

.
├── bin
│   ├── kivy_test-0.1-debug.apk
│   └── myapp-0.1-debug.apk
├── buildozer.spec
├── __init__.py
└── kivy_app
    ├── __init__.py
    ├── __main__.py
    └── source
        ├── main.py
        └── version.py

模块main.py是:

from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.uix.button import Label
from kivy.lang import Builder

from version import VERSION

root = Builder.load_string('''
<MainFrame>:
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'Hola mundo!'
        Label:
            text: root.version
''')

class MainFrame(Screen):
    version = 'Version: %s' % VERSION
    def __init__(self, **kwargs):
        super(MainFrame, self).__init__(**kwargs)

class BasicApp(App):
    def build(self):
        return MainFrame()

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

version.py 是

__all__ = 'VERSION'

VERSION = '0.0.2'

_main_.py是

from .source.main import BasicApp

def main():
    BasicApp().run()

if __name__ == "__main__":
    main()

我遇到的问题是,当我通过键入 运行 模块时

python -m kivy_app

在根目录中,我需要有行

from .version import VERSION

in main.py(注意版本前有'.')。

另一方面,当我从根目录构建 android apk 时,buildozer.spec 使用以下行:

# (str) Source code where the main.py live
source.dir = ./kivy_app/source

当然它正在调用这些行:

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

在 main.py.

在这种情况下,模块被视为不在包中,因此需要行:

from version import VERSION

(在这种情况下,导入语句中的版本前没有“.”)

我该如何解决这个冲突?

这个冲突的解决方法是将_main_.py复制到main.py并替换行:

from .source.main import BasicApp

与:

from source.main import BasicApp

在buildozer.spec中替换:

source.dir = ./kivy_app/source

与:

source.dir = ./kivy_app

树现在是:

.
├── bin
│   ├── kivy_test-0.1-debug.apk
│   └── myapp-0.1-debug.apk
├── buildozer.spec
├── __init__.py
└── kivy_app
    ├── __init__.py
    ├── __main__.py
    ├── main.py
    └── source
        ├── main.py
        └── version.py