Kivy - 屬性



屬性是Kivy中一個特殊的類,允許你定義和管理小部件或物件的屬性。“kivy.properties”模組中定義了Property類。你可以跟蹤這些屬性的變化,並且可以繫結回撥函式,以便在屬性改變時執行。

Kivy的屬性類支援以下特性:

值檢查/驗證

每當為屬性分配新值時,都會根據驗證約束對其進行檢查,以防止錯誤。例如,OptionProperty的驗證將確保該值位於預定義的可能性列表中。NumericProperty的驗證將檢查你的值是否為數字型別。

觀察者模式

你可以指定屬性值改變時應該發生什麼。你可以將自己的函式繫結為Property更改的回撥。例如,如果你想在小部件的pos屬性改變時呼叫一段程式碼,你可以將一個函式繫結到它。

更好的記憶體管理

同一屬性例項在多個小部件例項之間共享。

  • 需要注意的是,Property物件與Python中內建的property()函式不同。

  • 屬性物件必須在類級別宣告,而不是在類的任何方法中。

  • 預設情況下,每個屬性都提供一個“on_”事件,每當屬性的狀態/值改變時都會呼叫該事件。

示例

讓我們透過以下示例來學習Kivy中Property的行為。App類有一個NumericProperty屬性。NumericProperty物件(value)繫結到on_value_change()方法。

class NumPropApp(App):
   value = NumericProperty(0)

   def on_value_change(self, instance, value):
      print(f"Value changed: {value}")
      self.l1.text = str(value)

在build()方法中,應用程式有一個Label和一個Button,它們在一個垂直的BoxLayout中組合在一起。Button響應on_press事件呼叫onstart()方法,並將value加1。

   def onstart(self, event):
      print ("started")
      self.value = self.value+1
   
   def build(self):
      lo = BoxLayout(orientation='vertical')
      self.l1 = Label(text=str(self.value), font_size = 50)
      self.b1 = Button(text = "start", font_size = 50)
      self.b1.bind(on_press=self.onstart)
      self.bind(value=self.on_value_change)
      lo.add_widget(self.l1)
      lo.add_widget(self.b1)
      return lo

由於“on_value_change()”方法在每次value改變時都會被呼叫,因此每次按下按鈕時,標籤標題都會顯示從“0”開始遞增的數字。

以下是該示例的完整程式碼

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.properties import NumericProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.config import Config

# Configuration
Config.set('graphics', 'width', '720')
Config.set('graphics', 'height', '400')
Config.set('graphics', 'resizable', '1')

class NumPropApp(App):
   value = NumericProperty(0)
   def on_value_change(self, instance, value):
      print(f"Value changed: {value}")
      self.l1.text = str(value)
   def onstart(self, event):
      print ("started")
      self.value = self.value+1
   def build(self):
      lo = BoxLayout(orientation='vertical')
      self.l1 = Label(text=str(self.value), font_size = 50)
      self.b1 = Button(text = "start", font_size = 50)
      self.b1.bind(on_press=self.onstart)
      self.bind(value=self.on_value_change)
      lo.add_widget(self.l1)
      lo.add_widget(self.b1)
      return lo

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

輸出

從命令列執行程式。按下按鈕,你會看到標籤上顯示的數字每次都會增加。

Kivy Properties

屬性型別

Kivy提供以下屬性型別:

NumericProperty - 處理數值,例如整數和浮點數。它只接受int或float數值資料型別,或者可以轉換為數字的字串。

count = NumericProperty(0)

StringProperty - 用於處理字串值。你可以使用“defaultvalue”引數對其進行初始化。

text = StringProperty("start")

BoundedNumericProperty - 此屬性類似於NumericProperty,但允許你為值定義最小和最大邊界。它還支援get_min()和get_max()方法,它們分別返回最小和最大可接受的值。

a = BoundedNumericProperty(1, min=0, max=100)

BooleanProperty - 處理布林值(True或False)。defaultvalue引數可以設定為True或False。

active = BooleanProperty(False)

ListProperty - 此屬性的值是一個List物件。將列表賦值給ListProperty時,儲存在屬性中的列表是列表的淺複製,而不是原始列表。

colors = ListProperty([1, 0, 0, 1])

ObjectProperty - 處理單個物件例項。如果rebind引數設定為True,則當任何中間屬性更改時,關聯的kv規則將被重新評估,所有屬性都將被重新繫結。

person = ObjectProperty(None)

OptionProperty - 指定屬性的預設值。它應該是Options引數中給出的列表中的一個。示例:

state = OptionProperty("None", options=["On", "Off", "None"])

ReferenceListProperty - 此屬性用於引用其他型別的多個屬性物件。

   x = NumericProperty(0)
   y = NumericProperty(0)
   z = ReferenceListProperty(x, y)

更改“z”的值將自動相應地更改“x”和“y”的值。如果你讀取“z”的值,它將返回一個包含“x”和“y”值的元組。

AliasProperty - 為現有屬性提供別名或替代名稱。

   def _get_width(self):
      return self.size
   def _set_width(self, value):
      self.size = value
   width = AliasProperty(_get_width, _set_width)

DictProperty - 用於使用多個引數作為字典鍵來定義物件的初始值。

   params = DictProperty({
      'xlog': False,
      'xmin': 0,
      'xmax': 100,
      'ylog': False,
      'ymin': 0,
      'ymax': 100,
      'size': (0, 0, 0, 0)
   })

VariableListProperty - 列表項並將其擴充套件到所需的列表大小。

obj = VariableListProperty(defaultvalue, length)

defaultvalue引數指定列表的預設值。length引數是一個整數,可以是2或4。

ConfigParserProperty - ConfigParserProperty允許你根據其他kivy屬性自動監聽和更改指定鍵的值。

ConfigParserProperty(defaultvalue, section, key, config)

ConfigParser由多個部分組成,每個部分都有多個與這些鍵關聯的鍵值對。

username = ConfigParserProperty('', 'info', 'name', None)

ColorProperty - 處理各種格式的色彩值,例如RGB或十六進位制。此屬性可以賦值以下任何值:

  • 0-1之間的3或4個浮點值的集合(kivy預設值)

  • 格式為#rrggbb或#rrggbbaa的字串

  • 表示顏色名稱的字串(例如,“red”、“yellow”、“green”)

廣告