2014-09-30 105 views
1

我很難弄清楚如何使用ModalView窗口小部件中的按鈕的on_press屬性正確更改屏幕。Kivy - 按下ModalView中的按鈕後更改屏幕

在按下ModalView中的按鈕時,我希望屏幕更改爲在Game1HomeScreen類和其他GameHomeScreen類(如下面的NewGameButton和SavedGameButton)中定義的game_screen_name。這個應用程序有多個遊戲,所以我寧願不直接打電話給Game1HomeScreen1()。game_screen_name,而是想讓它保持通用,所以game_screen_name具有調用NewGamePopup的類的值。

這樣做的好方法是什麼?

的main.py代碼:

class Game1HomeScreen(Screen): 
    game_screen_name = 'game1_gameboard_screen_name' 


class NewGamePopup(ModalView): 
    pass 


class GamesApp(App): 

    sm = ScreenManager() 

    def show_new_game_popup(self): 
     p = NewGamePopup() 
     p.open() 

    def prev_screen(self): 
     self.sm.current = self.game_screen_name #this line does not work of course, because there is no game_screen_name variable in the NewGamePopup class. 

的.kv代碼:

<NewGamePopup>: 
    size_hint: .5, .3 
    NewGameBoxLayout: 
     padding: [10,10,10,10] 
     orientation: 'vertical' 
     Label: 
      font_name: 'fonts/playce.ttf' 
      font_size: '14sp' 
      markup: True 
      text: '[color=#000000]Are you sure? Current game will be erased![/color]' 
     Button: 
      font_name: 'fonts/playce.ttf' 
      font_size: '14sp' 
      text: 'Confirm' 
      background_normal: 'img/red_button5.png' 
      background_down: 'img/red_button5.png' 
      size_hint_y: None 
      on_press: root.dismiss(); app.prev_screen() 

<Game1HomeScreen>: 
    GeneralBoxLayout: 
     BannerGridLayout1: 
     BodyBoxLayout: 
      rows: 2 
      Image: 
       source: 'img/logo.png' 
       size_hint: (1.0,.9) 
      GridLayout: 
       cols: 2 
       spacing: '5dp' 
       padding: '5dp' 
       size_hint: (1.0,.1) 
       NewGameButton: 
        id: game1 
        on_press: 
         if saved_game1.disabled == False: app.show_new_game_popup() 
         else: root.manager.current = root.game_screen_name; saved_game1.disabled = False 
       SavedGameButton: 
        id: saved_game1 
        on_press: root.manager.current = root.game_screen_name; 
     FooterGridLayout: 
      ReturnButton: 
       text: 'Return to main menu' 
       on_press: root.manager.current = 'home' 

回答

1

保存遊戲時選擇了一個字符串屬性的遊戲畫面名

from kivy.properties import StringProperty 

.... 

class GamesApp(App): 
    game_screen_name = StringProperty('') 

然後,您可以根據需要稍後使用sm.current調用。在問題的代碼片段中遺漏了太多東西來創建工作版本;即使構建方法丟失。