2016-01-17 68 views
0

我想通過在純Python中編寫等價物來理解kv lang。我直接將kivy lang翻譯成Python的嘗試失敗了。這些程序的外觀和行爲完全不同!從kv lang直接翻譯到Python

下面是使用千伏郎的代碼:

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.widget import Widget 
from kivy.properties import StringProperty 

import random 

Builder.load_string(''' 
<YourWidget>: 
    BoxLayout: 
     size: root.size 
     Button: 
      text: "Change text" 
      on_release: root.change_text() 
     Label: 
      text: root.random_number 
''') 

class YourWidget(Widget): 
    random_number = StringProperty() 

    def __init__(self, **kwargs): 
     super(YourWidget, self).__init__(**kwargs) 
     self.random_number = str(random.randint(1, 100)) 

    def change_text(self): 
     self.random_number = str(random.randint(1, 100)) 

class YourApp(App): 
    def build(self): 
     return YourWidget() 

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

這裏是不千伏郎的代碼:

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.button import Button 
from kivy.uix.label import Label 
from kivy.uix.widget import Widget 
from kivy.properties import StringProperty 

import random 

class YourWidget(Widget): 
    random_number = StringProperty('') 

    def __init__(self, **kwargs): 
     super(YourWidget, self).__init__(**kwargs) 

     # box layout 
     box = BoxLayout(size = self.size) 
     self.add_widget(box) 

     # button widget 
     btn = Button(text='Change text', on_release=self.change_text) 
     box.add_widget(btn) 

     # label widget 
     self.random_number = str(random.randint(1, 100)) 
     lbl = Label(text=self.random_number) 
     box.add_widget(lbl) 

    def change_text(self, instance): 
     self.random_number = str(random.randint(1, 100)) 

class YourApp(App): 
    def build(self): 
     return YourWidget() 

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

首先,在純Python程序的主窗口小部件(YourWidget)不與kv lang程序相比,窗口大小相同。其次,每當我按下按鈕時,標籤文本都不會被修改,這與kv lang程序不同。

有人會告訴我什麼是該程序的kivy lang的正確「翻譯」?

+0

源到源交叉編譯器可直接將一種語言的源代碼翻譯爲另一種語言的源代碼,這可能會有所幫助。這裏有一篇關於他們的維基百科文章(其中也將它們描述爲反編譯器或轉譯器):https://en.wikipedia.org/wiki/Source-to-source_compiler - 以下是其中許多維基百科列表:https:// en.wikipedia.org/wiki/List_of_compilers#Source-to-source_compilers。 。 。其中列出了一些python交叉編譯器;我不知道他們中的任何一個人是否會執掌基維。 –

回答

1
box = BoxLayout(size = self.size) 

在Python,訪問屬性捕捉它們的當前值,沒有別的,而KV會自動檢測值是一個屬性,並創建一個綁定時它的變化進行更新。因此您必須創建自己的綁定。在這種情況下,您可以使用

self.bind(size=box.setter('size')) 
+0

謝謝。我已經將它添加到我的代碼中:'self.bind(random_number = lbl.setter('text'))'。現在它的行爲完全像kv lang程序! – randy