App類是創建Kivy應用的基礎。我們可以將其看成是Kivy運行循環當中的主入口。在絕大多數的例子中,你創建這個類的子類,然后構建你自己的應用。當你已經准備好開始應用的整個生命周期時,你可以實例化你定制的app類,然后調用這個實例的run()方法。
創建一個應用
重載build()方法
為了使用一個widget樹初始化你的應用,你需要重載build()方法,並返回你已經構建的widget樹。
import kivy
kivy.require('1.8.0')
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
class IndexScreen(GridLayout):
def __init__(self, **kwargs):
super(IndexScreen, self).__init__(**kwargs)
pass
# 這里不能直接使用App作為你自己創建的應用類的類名
class TestApp(App):
def build(self):
return IndexScreen()
if __name__ == '__main__':
TestApp().run()
使用kv文件創建應用
你也可以使用kivy語言創建應用。.kv文件可以同時包含規則以及根widget定義。
#:kivy 1.8.0
Button:
size: root.size
text: "Hello ,World"
import kivy
kivy.require('1.8.0')
from kivy.app import App
class MyApp(App):
pass
if __name__ == '__main__':
MyApp.run()
應用配置
使用配置文件
Kivy支持為你的應用創建獨立的配置文件,如下所示:
class MyApp(App):
def build_config(self, config):
config.setdefaults('section1', {
'key1': 'value1',
'key2': 'value2'
})
系統將根據build_config方法中所提供的信息,自動創建名為my.ini的文件,並設置對應的配置信息。
[section1]
key2 = value2
key1 = value1
你也可以不使用build_config方法,而是直接創建my.ini文件,應用在運行的時候會自動加載這一文件。需要注意的是,配置文件的名字需要與你的應用類的前綴相匹配。
示例:應用設置面板
你可以擴展App.build_settings()方法創建你自己的設置面板。你可以參考settings找到具體創建的方法。
class MyApp(App):
def build_settings(self, settings):
jsondata = """
[
{ "type": "title",
"title": "Test application" },
{ "type": "options",
"title": "My first key",
"desc": "Description of my first key",
"section": "section1",
"key": "key1",
"options": ["value1", "value2", "another value"] },
{ "type": "numeric",
"title": "My second key",
"desc": "Description of my second key",
"section": "section1",
"key": "key2" }
]
"""
settings.add_json_panel('Test application', self.config, data=jsondata)
當你運行起來后,可以使用F1來啟動設置面板。使用JSON的設置選項,將與之前創建的配置文件的內容相關聯。你也可以在程序中調用App.open_settings()和App.close_settings()來開啟或關閉你的設置面板。你在設置面板中的設置,將會自動保存到你的配置文件中。默認的,kivy的全局設置也會被加載到設置面板中,你可以使用如下聲明關閉它:
class MyApp(App):
use_kivy_settings = False
# ...
你還可以手動的調整設置面板中的項目,具體參見settings
使用on_start 與 on_stop檢測應用性能
參見cProfile
import cProfile
class MyApp(App):
def on_start(self):
self.profile = cProfile.Profile()
self.profile.enable()
def on_stop(self):
self.profile.disable()
self.profile.dump_stats('myapp.profile')
定制設置界面
你可以通過設置App.settings_cls來選擇多種不同的設置界面樣式,你還可以創建自己的設置界面。具體參考kivy.uix.settings
你可以通過重載App.display_settings()來定制設置面板的顯示,這個方法將會在設置面板在屏幕上顯示之前被調用。如下所示:
def display_settings(self, settings):
try:
p = self.settings_popup
except AttributeError:
self.settings_popup = Popup(content=settings,
title='Settings',
size_hint=(0.8, 0.8))
p = self.settings_popup
if p.content is not settings:
p.content = settings
p.open()
def close_settings(self, *args):
try:
p = self.settings_popup
p.dismiss()
except AttributeError:
pass # Settings popup doesn't exist
最后,如果你想要替換目前的設置面板,你使用App.destroy_settings()可以移除到設置面板的內部索引。如果你已經更改App.display_settings(),你應該小心探測設置面板是否已經被替換。
暫停模式
這個模式是嘗試性的,被設計用來針對手機與平板。可能會引起你的應用崩潰或者暫停。
在手機或者平板上,用戶可能在任意的時候切換到另一個應用當中,這個時候,默認的,kivy會激活App.on_stop()事件。
如果你提供暫停模式,當切換到另一個應用的時候,你的應用將無限等待,直到用戶切換回來。在Android上,有一個OpenGL的問題:當你暫停的時候,OpenGL ES Context不能確保被存儲。存儲OpenGL數據的機制並沒有在Kivy中實現。
下面是一個暫停模式的示例:
class TestApp(App):
def on_pause(self):
# 你可以在這個存儲數據
return True
def on_resume(self):
# 在這里你可以檢查是否有需要替換的數據
pass
