2023年9月20日 星期三

Kivy property篇 ObjectProperty類 講解

簡述

ObjectProperty類專門存放物件,預設為None。

基本範例

from kivy.app import App
from kivy.uix.gridlayout  import GridLayout
from kivy.properties import ObjectProperty
from kivy.uix.image import Image


class MyLayout(GridLayout):

    #宣告a1為None的ObjectProperty
    a1 = ObjectProperty(None)
    
    #宣告a2為Image的ObjectProperty
    a2 = ObjectProperty(Image(source='dog.jpg'))

    def btn1(self):
        self.a1.add_widget(self.a2)

    def on_a1(self,instance,x):
        print('a1 add dog picture')


class Myapp(App):

    def build(self):
        return MyLayout()


if __name__ == '__main__':
    Myapp().run()

在以上程式碼中,我在MyLayout中宣告a1為ObjectProperty類,其值為None(ObjectProperty會宣告值為None大部分是用來與kv file中的id做連結),宣告a2為ObjectProperty類,其值為Image(source='dog.jpg'),並宣告btn1方法,當btn1方法被呼叫時,a1呼叫add_widget方法將a2加入,最後,當a1發生改變時,自動呼叫on_a1方法,列印'a1 add dog picture'

在my.kv中寫上此段程式碼:

<MyLayout>:
    rows:2
    id:b1
    a1:b1

    Label:
        text:'dog'

    Button:
        text: 'A1'
        size_hint: 0.3,0.3
        on_press: root.btn1()

在以上程式碼中,我指定MyLayout的id為b1,並將main.py中的a1與my.kv中的b1連結

執行結果如下:

StringProperty使用技巧:

1.如同基本範例所示,main.py中的ObjectProperty與my.kv中的id可以相互連結,以便在main.py中調用my.kv的widget

沒有留言:

張貼留言

精選文章

Kivy UIX篇 widget篇 TabbedPanel類 event篇 講解