Kivy使用篇之kv語言
python 樣式
python 樣式編寫kivy程序,程序源碼如下:
import kivy
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
class MainLayout(GridLayout):
"""主佈局"""
def __init__(self, **kwargs):
"""主佈局初始化"""
super(MainLayout, self).__init__(**kwargs)
self.cols = 1 # 設置行數爲1
self.button_init = Button(text='Button init') # 按鈕控件
self.label = Label(text='') # 標籤控件,用於顯示按鈕狀態
self.add_widget(self.button_init) # 添加控件至佈局
self.add_widget(self.label)
self.button_init.bind(state=self.state_changed) # 綁定按鈕狀態改變事件
def state_changed(self, sender, state):
"""處理按鈕狀態改變事件"""
self.label.text = '{0} state is {1}'.format(sender.text, state)
class MyApp(App):
"""主應用"""
name = 'MyApp'
def build(self):
return MainLayout()
if __name__ == '__main__':
MyApp().run()
程序運行結果:
窗口下方的標籤顯示按鈕的狀態,當按鈕按下時,顯示爲down
,否則顯示爲normal
kv語言定義按鈕
修改上方程序,添加kv語言定義的按鈕
import kivy
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.lang.builder import Builder
# Buildzer 用來加載kv語言
# 也可將kv語言寫在文件中
# 用Builder.load_file('xxx.kv')方法來載入
Builder.load_string("""
<MainLayout>:
Button:
id: button2
text: 'Button kv'
on_press: root.state_changed(self, self.state) # 按下事件
on_release: root.state_changed(self, self.state) # 擡起事件
""")
class MainLayout(GridLayout):
"""主佈局"""
def __init__(self, **kwargs):
"""主佈局初始化"""
super(MainLayout, self).__init__(**kwargs)
self.cols = 1 # 設置行數爲1
self.button_init = Button(text='Button init') # 按鈕控件
self.label = Label(text='') # 標籤控件,用於顯示按鈕狀態
self.add_widget(self.button_init) # 添加控件至佈局
self.add_widget(self.label)
self.button_init.bind(state=self.state_changed) # 綁定按鈕狀態改變事件
def state_changed(self, sender, state):
"""處理按鈕狀態改變事件"""
self.label.text = '{0} state is {1}'.format(sender.text, state)
class MyApp(App):
"""主應用"""
name = 'MyApp'
def build(self):
return MainLayout()
if __name__ == '__main__':
MyApp().run()
程序運行結果
python與kv見互相訪問
在python中有兩種方法對kv對象進行訪問:
- Property方式
- ids方式
在kv語言中有3個特別的關鍵字
- app: 指向程序
- root: 指向當前規則的控件或模板
- self : 指向當前控件
示例代碼如下:
import kivy
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.lang.builder import Builder
from kivy.properties import ObjectProperty
Builder.load_string("""
<MainLayout>:
button: button1 # 實例化屬性
Button:
id: button1
text: 'Button ObjectProperty'
Button:
id: button2
text: 'Button kv'
on_press: root.state_changed(self, self.state)
on_release: root.state_changed(self, self.state)
Button:
id: button3
text: 'Button ids'
Button: # kv語言控件間互相訪問
id: button4
text: 'Button access kv'
on_press: button1.state = 'down'
on_release: button1.state = 'normal'
Button: # kv語言訪問當前規則的控件
id: button5
text: 'Button access label'
on_press: root.label.text = '{0} state is {1}'.format(self.text, self.state)
on_release: root.label.text = '{0} state is {1}'.format(self.text, self.state)
Button: # kv語言訪問程序
id: button6
text: 'Button access app'
on_press: root.label.text = '{0}:{1} state is {2}'.format(app.name, self.text, self.state)
on_release: root.label.text = '{0}:{1} state is {2}'.format(app.name, self.text, self.state)
""")
class MainLayout(GridLayout):
"""主佈局"""
button = ObjectProperty(None) # 定義一個對象屬性
def __init__(self, **kwargs):
"""主佈局初始化"""
super(MainLayout, self).__init__(**kwargs)
self.cols = 1 # 設置行數爲1
self.button_init = Button(text='Button init') # 按鈕控件
self.label = Label(text='') # 標籤控件,用於顯示按鈕狀態
self.add_widget(self.button_init) # 添加控件至佈局
self.add_widget(self.label)
self.button_init.bind(state=self.state_changed) # 綁定按鈕狀態改變事件
self.button.bind(state=self.state_changed)
# self.ids['button3'].bind(state=self.state_changed)
self.ids.button3.bind(state=self.state_changed) # 使用ids對kv語言訪問
def state_changed(self, sender, state):
"""處理按鈕狀態改變事件"""
self.label.text = '{0} state is {1}'.format(sender.text, state)
class MyApp(App):
"""主應用"""
name = 'MyApp'
def build(self):
return MainLayout()
if __name__ == '__main__':
MyApp().run()
程序運行結果