2016-02-03 61 views
0

我是新來的kivy框架,我不認爲我正確理解kv文件和python之間的id引用是如何工作的。當我用純python編碼時,它按預期工作,但我試圖學習使用佈局語言。我有動態生成分散小部件,我需要將它們添加到佈局。Keyerror在Kivy佈局語言

在python中。

class MainScreen(Screen): 
    def on_enter(self): 

     for index in xrange(numberOfWords): 
       genColor = [255, 0, 0] 
       shuffle(genColor) 
       newWordWidget = WordWidget(genColor) 
       if newWordWidget.label.color[0] == 255 and newWordWidget.label.text != 'red': newWordWidget.trash = True 
       if newWordWidget.label.color[1] == 255 and newWordWidget.label.text != 'green': newWordWidget.trash = True 
       if newWordWidget.label.color[2] == 255 and newWordWidget.label.text != 'blue': newWordWidget.trash = True 
       print("Trash:" + str(newWordWidget.trash)) 
       newWordWidget.scatter.pos = randint(0, Window.size[0]), randint(0, Window.size[1]) 
       self.ids.widgetscreen.add_widget(newWordWidget.scatter) 

的KV文件:

<FloatLayout>: 
ScreenManagement: 
    MainScreen: 
<MainScreen>: 
    FloatLayout: 
     id: widgetscreen 
     canvas: 
      Color: 
       rgba: 1, 1, 1, 1 
      Rectangle: 
       pos: self.pos 
       size: self.size 

我收到就行了KeyError異常:ID:widgetscreen。

回答

1

這解決了我的問題。

從我原來的職位蟒蛇:

from kivy.clock import mainthread 

和...

class MainScreen(Screen): 
    @mainthread 
    def on_enter(self): 

沒有什麼是錯的id引用。問題是在引用id之後加載的kv文件。 @mainthread使得def on_enter()等待加載kv文件。

+0

這確實解決了這個問題,但它通常被認爲是單一的。對於大多數目的,不鼓勵使用'ids'屬性。 – Kwarrtz

1

做元素鏈接的建議方式就像這樣。

KV:

<MainScreen>: 
    widgetscreen: wdscreen 
    FloatLayout: 
     id : wdscreen 
     ... 

的Python:

from kivy.properties import ObjectProperty # don't forget to add the import 

class MainScreen(Screen): 

    widgetscreen = ObjectProperty(None) 
    .... 

讓我們來看看這裏發生了什麼。首先,在Python代碼中,我們創建了一個類屬性MainScreen,widgetscreen,默認爲None。然後,在我們的KV文件中,我們將該屬性MainScreen設置爲wdscreen。在KV lang中,IDS像變量一樣工作,所以當我們將widgetscreen設置爲wdscreen時,我們實際上將其設置爲我們使用ID wdscreen定義的FloatLayout。在運行時,kivy將用適當的小部件填充我們的Python屬性。

因此,您應該可以從MainScreen中獲得widgetscreen作爲self.widgetscreen。你甚至不需要使用ids

+0

不起作用。獲取「ObjectProperty」未定義錯誤。 –

+0

@SteveHostetler,將'ObjectProperty'添加到您的導入列表中。 (例如'from kivy.properties import ObjectProperty') – Kwarrtz