Kivy使用篇6

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()

程序運行結果
kv語言定義按鈕
python與kv見互相訪問
在python中有兩種方法對kv對象進行訪問:

  1. Property方式
  2. 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()

程序運行結果
kv與python互相訪問

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章