2014-09-30 58 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调用。在问题的代码片段中遗漏了太多东西来创建工作版本;即使构建方法丢失。