如何从包中创建Kivy APK?

时间:2019-09-02 15:41:21

标签: python kivy buildozer

我有一个简单的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

在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

(在这种情况下,import语句中的版本之前没有'。')

如何解决此冲突?

1 个答案:

答案 0 :(得分:0)

此冲突的解决方案是将_ 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