2017-05-03 52 views
0

我是一名完全新手,既能夠在一週前從codeacademy學習python,又能從youtube教程學習到kivy,因此我都是python和kivy的完美新手。Kivy Python - 無需使用NumericProperty即可增加變量的按鈕

難道有人請向我解釋爲什麼下面的代碼不會導致顯示n的標籤的屏幕,這是通過按鈕增加?

Python的文件

import kivy 
from kivy.app import App 
from kivy.uix.button import Button, Label 
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import NumericProperty 


class Example(BoxLayout): 
    n = 0 

    def n_plus(self): 
     self.n += 1 


class ExampleApp(App): 

    def build(self): 
     return Example() 

example = ExampleApp() 
example.run() 

KV文件

<Example>: 
    BoxLayout: 
     Label: 
      text: str(root.n) 
     Button: 
      text: "+1" 
      on_press: root.n_plus() 

然後,你可以解釋爲什麼將n = NumericProperty(0),使這項工作?

我想在n上運行一些函數,這些函數似乎對數字屬性不起作用。

+0

看看這個.kv的一種方法是,它沒有看到你的python中發生了什麼。所以你需要「幫助」.kv「看到」python中發生的變化:這就是調用「綁定」。使用NumericProperty(0)(或任何像ObjectProperty或StringProperty的屬性)是一種綁定方式。 這是我的理解,到目前爲止,我也開始kivy(幾個星期前),所以我很抱歉不能更精確。 – Enora

+0

強制.kv「查看」python中發生的事情的另一種方法是更新python中標籤的文本:http://codepad.org/kg5Kd5pT – Enora

回答

1

因爲當你使用NumericProperty() 作爲官方文件稱:

它產生的事件,這樣當你的對象改變, 引用該屬性的所有屬性的屬性會自動更新 。

因此,簡而言之,它會創建一個綁定您的UI之間(.kv)和屬性及其類的關係(.py

但是,實際上,你可以自己修改UI,而不從幫助kivy框架。我改變你的例子如下所示:

  1. 使用self.ids.your_id_in_kv_file

添加id屬性窗口小部件

  • 訪問id屬性,但它顯然並不好,因爲現在你需要更新你的每次你想更新你的用戶界面時,都可以自己UIby。但是對於來自kivy的XXXXProperty,你只需要改變該屬性的值,你根本不用擔心UI。

    解決方案的另一個缺點是,當你需要更改用戶界面,您需要更改大量代碼,如果你自己修改他們... ...

    這裏是例子:

    import kivy 
    
    from kivy.app import App 
    from kivy.uix.label import Label 
    from kivy.lang.builder import Builder 
    from kivy.uix.boxlayout import BoxLayout 
    
    Builder.load_string(""" 
    <Example>: 
        BoxLayout: 
         Label: 
          id: lbl 
          text: "0" 
         Button: 
          text: "+1" 
          on_press: root.n_plus() 
    """) 
    
    class Example(BoxLayout): 
    
         def n_plus(self): 
         value = self.ids.lbl.text 
         self.ids.lbl.text = str(int(value) + 1) 
    
    
    class ExampleApp(App): 
    
        def build(self): 
         return Example() 
    
    
    if __name__ == '__main__': 
        ExampleApp().run()