2023年9月10日 星期日

Kivy property篇 BoundedNumericProperty類 講解

簡述

BoundedNumericProperty也是存放整數的類,不同於NumericProperty的是,BoundedNumericProperty存在範圍,當BoundedNumericProperty的值超過上下屆時會產生錯誤訊息。

基本範例

在main.py中寫上此段程式碼:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import BoundedNumericProperty


class MyLayout(FloatLayout):
    a1 = BoundedNumericProperty(0, min=-5, max=5)

    def btn1(self):
        print('The value of a1 was originally',self.a1)
        self.a1 = self.a1-1

    def on_a1(self, instance, x):
        print('a1 is change to',x)


class Myapp(App):

    def build(self):
        return MyLayout()


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

在以上程式碼中,我在MyLayout中宣告a1為BoundedNumericProperty類,a1的初始值為0,最大值為5,最小值為-5,並宣告btn1方法,當btn1方法被呼叫時,print('The value of a1 was originally',self.a1)且設新的a1為舊的a1-1,最後,當a1發生改變時,自動呼叫on_a1方法,列印'a1 is change to',x

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

<MyLayout>:

    Button:
        id: mybutton
        text: 'press me'
        on_press: root.btn1()

執行結果如下:

由結果可以看到當a1的值要從-5變成-6時出錯了(因為超過了當初所設定的最小值)。

BoundedNumericProperty使用技巧:

1.get_max(EventDispatcher obj):取得BoundedNumericProperty的最大值

2.get_min(EventDispatcher obj):取得BoundedNumericProperty的最小值

3.set_max(EventDispatcher obj, value):設定BoundedNumericProperty的最大值

4.set_min(EventDispatcher obj, value):設定BoundedNumericProperty的最小值

以下我用最小值來做示範

在main.py中寫上此段程式碼:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import BoundedNumericProperty


class MyLayout(FloatLayout):
    a1 = BoundedNumericProperty(0, min=-5, max=5)

    def btn1(self):
        self.property('a1').set_min(self, -10)
        print(self.property('a1').get_min(self))
        self.a1 = self.a1-1

    def on_a1(self, instance, x):
        print('a1 is change to',x)


class Myapp(App):

    def build(self):
        return MyLayout()


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

在以上程式碼中,我在MyLayout中宣告btn1方法,當btn1方法被呼叫時,a1呼叫set_min()方法,使得a1的最小值更改為-10。

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

<MyLayout>:

    Button:
        id: mybutton
        text: 'press me'
        on_press: root.btn1()

執行結果如下:

5.bounds:此屬性將回傳BoundedNumericProperty最初設定的max與min值

在main.py中寫上此段程式碼:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import BoundedNumericProperty


class MyLayout(FloatLayout):
    a1 = BoundedNumericProperty(0, min=-5, max=5)

    def btn1(self):
        self.property('a1').set_min(self, -10)
        print(self.property('a1').get_min(self))
        print(self.property('a1').bounds) #添加此行程式碼以便呈現結果
        self.a1 = self.a1-1

    def on_a1(self, instance, x):
        print('a1 is change to',x)


class Myapp(App):

    def build(self):
        return MyLayout()


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

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

<MyLayout>:

    Button:
        id: mybutton
        text: 'press me'
        on_press: root.btn1()

執行結果如下:

由以上結果可以看到,雖然我們呼叫set_min使得min修改為-10,但bound的輸出結果依然為(5,-5)而非(5,-10)

沒有留言:

張貼留言

精選文章

Kivy UIX篇 widget篇 TabbedPanel類 event篇 講解