概要
Includeを使用して外部Kvファイルを取り込む基本的なアプリのテストをしてみました.
環境
- OS: Windows10 64bit
- Kivy:1.9.1
- Python3.5
ポイント
- 一階層下のフォルダに保存したKvファイルをInclude
- 外部Kvファイル内のプロパティをRootWidgetのプロパティとして再定義
- 外部Kvファイル内のon_pressプロパティにRootWidget内のメソッドを関連付け
ファイル配置
project-root
|-- main.py
|-- test.kv
`-- gui/
`-- tab_test.kv
コードは以下のとおりです.
main.py
main.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
class RootWidget(BoxLayout):
# Kvファイルで定義されている button_include Widget を Pythonファイル内で定義
button_include = ObjectProperty()
def print_obj(self, obj):
print(obj)
def check_button_include(self):
print(self.button_include) # Python ファイル内から外部 Kv ファイルのウィジェットクラスにアクセス
class TestApp(App):
def build(self):
return RootWidget()
if __name__ == '__main__':
TestApp().run()
Root Widget を含む Kv ファイル
test.kv
# :include gui/tab_test.kv # 外部 Kv ファイルを取り込む
<RootWidget>:
# button_include を RootWidget のプロパティとして定義
button_include: tab_button_include.button_include
TabbedPanel:
do_default_tab: False
TabbedPanelItem:
text: 'Tab1'
BoxLayout:
Button:
text: 'button 1'
on_press: root.print_obj(self)
Button:
text: 'button 2'
on_press: root.check_button_include()
TabbedPanelItem:
text: 'Tab2'
ButtonInclude: # 外部 Kv ファイルで定義しているウィジェットクラスを使用
id: tab_button_include # 定義したウィジェットクラスにid を振っておく
外部 Kv ファイル
tab_test.kv
<ButtonInclude@Button>:
button_include: button_include
id: button_include
text: 'button include'
on_press: app.root.print_obj(self) # "app.root.method" で外部Kvファイル内から RootWidget のメソッドを実行
実行結果
それぞれのボタンの動作結果
Button1 -> <kivy.uix.button.Button object at 0x000001E0A8DE18D0>
Button2 -> <kivy.factory.ButtonInclude object at 0x000001E0A8DE1A08>
Button include -> <kivy.factory.ButtonInclude object at 0x000001E0A8DE1A08>
参考
- [Kivy Language — Kivy 1.9.2.dev0 documentation]
(https://kivy.org/docs/api-kivy.lang.html#include-file) - Python Kivyの使い方(参考)~APIリファレンスのKivy Languageを翻訳してみた~ - Qiita