2016-02-29 48 views
0

我爲Popup創建了一個類,並在kv文件中設置了title屬性。Kivy小部件的新實例沒有kv lang文件的屬性

當彈出窗口顯示時,它沒有kv文件中的標題,而是顯示無標題,就好像它從未設置過一樣。

正是同樣的問題在這裏,但我不從這個鏈接瞭解是什麼問題或如何使其工作: https://github.com/kivy/kivy/issues/751

我知道如何做到這一點使用的ID在千伏郎,但是隻有當Popup作爲根部件的子部件(例如MainUI)時纔有效。然後,我可以將一個python類的實例鏈接到kv文件中的一個小部件。 但是彈出窗口顯示爲根部件的一部分。 我想要做的是在單擊New按鈕時實例化popNewDB類的新實例,並讓此實例在KV文件中使用諸如「title」之類的值。

你能解釋一下如何做到這一點嗎?

這裏是我的代碼:

PY文件:

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.uix.popup import Popup 
from kivy.properties import ObjectProperty 

class popNewDB(Popup): 
    pass 

class MainUI(Widget): 
    pop = ObjectProperty(popNewDB()) 

    def showpopup(self): 
     self.pop.open() 


class VerseReminder(App): 
    def build(self): 
     return MainUI() 


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

KV文件:

#:kivy 1.9.1 

<popNewDB> 
    title: 'Hallo' 

<MainUI> 
    Label: 
     pos: root.center_x - self.width/2,root.center_y + 200 
     text: "Quote Reminder" 
    BoxLayout: 
     size_hint: None,None 
     width: 400 
     height: 200 
     pos: root.center_x-200,root.center_y-50 
     orientation: 'vertical' 
     spacing: 20 
     Button: 
      size_hint: 1,1 
      text: "New..." 
      on_press: root.showpopup() 
     Button: 
      size_hint: 1,1 
      text: "Open..." 
     Button: 
      size_hint: 1,1 
      text: "Quit" 

回答

0

pop = ObjectProperty(popNewDB())進行評估的時候,規則尚未加載,所以只將會創建一個準系統Popup。相反,你可以這樣做:

class MainUI(Widget): 
    pop = ObjectProperty() 

    def showpopup(self): 
     if self.pop is None: 
      self.pop = PopNewDB() 
     self.pop.open() 

這裏,第一時間按下按鈕,的PopNewDB一個新的實例將被創建並存儲在self.pop。 (注:我將Popup的子類重新命名爲大寫字母,以符合語言標準和kivy的期望)

+0

謝謝。通過在「showpopup」函數下添加「pop = popNewDB()」,並直接在類下刪除ObjectProperty定義,我可以使其工作。 但是,據我所知,「流行」將只限於「showpopup」功能,我不能在以後參考 - 是否正確?這就是爲什麼你首先在類中創建了一個ObjectProperty的原因嗎? – brgc

+0

@brgc沒錯。 – zeeMonkeez