2016-05-11 100 views
0

我是初級Kivy開發人員,我需要一些來自你們的建議。 我使用ScreenManager在屏幕之間跳轉,並且據我注意到,所有的屏幕都是在應用程序啓動後初始化的,我需要它們用以前屏幕的某些屬性進行初始化,例如選擇類別或內容。有沒有辦法做到這一點?使用ScreenManager按鈕釋放kv的初始屏幕

我在CategorySelectScreen中有兩個按鈕都代表某個類別,我希望它們向DictScreen發送一個字符串屬性,在那裏它將用作CategorySelect方法中的參數,該方法過濾項目列表,但事情是,應用程序在開始時需要這個參數,如果沒有它,解釋器會拋出錯誤。

另外,我想我使用kivy的方式非常糟糕,請問您可以查看我的代碼並給我一些專業提示?在此先感謝,歡呼:)

KV文件:http://pastebin.com/UdvGS7Wv

PY文件:http://pastebin.com/gJn9Mrip

+2

提供[最小可驗證示例](http://stackoverflow.com/help/mcve),而不是粘貼數百行代碼,並將其分割爲多個文件。 – jligeza

回答

1

在聲明螢幕的決定什麼對象將是它的輸入。然後讓這個對象成爲一個屬性。之後,在_... callback上設置您使用基於此輸入對象的值創建屏幕的小部件。例如:

class DictScreen(Screen): 
    category_selected = ObjectProperty(None) 

    def on_category_selected(self, instance, value): 
     category_selected = value 
     self.clear_widgets() 
     self.add_widget(Button(text=category_selected.name)) 

而在先前的屏幕,切換到DictScreen之前,從app.root.ids得到它的實例,然後分配category_selected到它,然後設置新的當前屏幕了ScreenManager。這樣,您的DictScreen將立即在您切換到選擇類別之前立即生成。

切換到DictScreen之前得到它的實例」如何做到這一點?這裏有很好的解釋: https://kivy.org/docs/api-kivy.uix.widget.html?highlight=widget#kivy.uix.widget.Widget.ids

+0

可以在.py中以某種方式獲取已在kv文件內創建的小部件的實例嗎?或者我應該在on_category_selected方法中構建整個屏幕窗體? 我已經在kv中設置了整個屏幕的佈局,我想保存它,只是以某種方式更新它。 – vanbear

+0

我已經更新了我的答案。每個部件都有「ids」屬性,這是一個DictProperty。查看我在答案中提供的鏈接。 –