你如何从一个包中创建一个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
我有一个简单的 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