2016-03-15 67 views
0

我想讓我的頭繞過屏幕管理器,特別是引用其中的對象。引用屏幕管理器對象中的ID

我用它來設置一個值:

class Widgets(Widget) 
    pass 

w = Widgets() 
w.ids.MyTitle.text = 'something' 

現在我有這樣的:

class Widgets(Screen) 
    pass 

class SettingsScreen(Screen) 
    pass 

sm = ScreenManager() 
sm.add_widget(Widgets(name='main')) 
sm.add_widget(SettingsScreen(name='settings')) 

我如何引用MyTitle現在?我試過各種組合,如:

sm.ids.main.MyTitle.text = 
sm.main.MyTitle.text = 
sm.main.ids.MyTitle.text = 

....但沒有得到它!有人能讓我擺脫苦難嗎?有沒有一種簡單的方法瀏覽sm對象或者遍歷它?

編輯:添加最小的運行版本:

minimal.kv:

# File name: minimal.py 
#:kivy 1.8.0 

<Widgets> 
    Button: 
     id: MyTitle 
     text: 'hello' 

<SettingsScreen>: 
    Button: 
     id: Other 
     text: 'settings' 

minimal.py:

from kivy.uix.widget import Widget 
from kivy.uix.screenmanager import Screen, ScreenManager 
from kivy.uix.button import Button 
from kivy.lang import Builder 
from kivy.app import App 


class Widgets(Screen): 
    pass 

class SettingsScreen(Screen): 
    pass 

class myApp(App): 

    def build(self): 
     return sm 

    def on_start(self): 
     global sm 
     sm.ids['main'].ids['MyTitle'].text = 'changed' # <-- this fails 

Builder.load_file("minimal.kv") 

sm = ScreenManager() 
sm.add_widget(Widgets(name='main')) 
sm.add_widget(SettingsScreen(name='settings')) 

if __name__ == '__main__': 
    myApp().run() 
+0

你可以加個[mcve]嗎?因爲你的代碼不會運行。它也是定義ID的地方。 – zeeMonkeez

回答

1

ScreenManager得到一個屏幕,使用get_screen

sm.get_screen('main').ids.MyTitle.text = 'changed' 

此外,您還可以構建您的應用程序,所以: KV文件:

# File name: minimal.py 
#:kivy 1.8.0 
ScreenManager: 
    Widgets: 
     name: 'main' 
    SettingsScreen: 
     name: 'settings' 

<Widgets>: 
    Button: 
     id: MyTitle 
     text: 'hello' 

<SettingsScreen>: 
    Button: 
     id: Other 
     text: 'settings' 

,並在Python文件:

sm=Builder.load_file(..) 

class my12App(App): 
    def build(self): 
     return sm 

    def on_start(self): 
     self.root.get_screen('main').ids.MyTitle.text = 'changed' 
0

根據the documentation您訪問id就像您任何字典鍵:

widget.ids['MyTitle'] 

因爲ScreenManager本身從Widget派生,並指定部件保持a list of widgets it is aware of,你可能需要類似:

sm.ids[0].ids['MyTitle'].text 

然而,這是很難沒有Minimal, Complete, and Verifiable Example說。有一兩件事你可以做的是:

for id in sm.ids: # Iterate through all widgets in ids 
    print(id) # Get the string representation of that widget 

作爲一個方面說明,這一點:

class Widgets(Screen) 
    pass 

...可能會造成混亂,因爲你延長WidgetWidgets(通過中間類Screen )。 OOP建議一個類的一個子類應該是這個類的一個更具體的形式。因此,Screen類型Widget。但Widgets確實是號碼Widgets

+0

這給了我KeyError:'主'...我正在開發一個最小版本,但它讓我很難理解我的大部分代碼......我不得不回到基礎! – user4893295

+0

我建議使用REPL來測試你的直覺。另請參閱我的更新。 –

+0

我已經添加了REPL,但它不返回任何內容。如果我改變它只是打印(sm.ids),它會返回一個空字典!? – user4893295