2016-12-29 46 views
0

所以我有我的游戏结束后更改我的屏幕的问题。 我试过这样做:从python代码改变屏幕Kivy

Manager.current = 'endmenu' 

但它不起作用。这是我的代码形式千伏的片段和PY文件

main.py,功能,我使用开关()

def bounce_ball(self, ball, score): 
    """Check for collision between a ball and a circle""" 
    dx = ball.center_x - self.center_x 
    dy = ball.center_y - self.center_y 
    #print("Ball: ",ball.center) 
    #print("Center: ",self.center) 
    distance = Vector(ball.center).distance(self.center) - 50 
    if distance >= 100 + 30 and distance <= 100 + 30 + 4:# circle radius + ball size 
     vx, vy = ball.velocity 
     centertoballangle = Vector(0,1).angle((dx,dy)) 
     if centertoballangle <= 0: #angle 0-360 not 0-180 to -180-0 
      centertoballangle += 360 
     ball.angle = Vector(vx,vy).angle((dx,dy)) 
     if self.checkcolor(ball, centertoballangle, self.angle%360): 
      bounced = Vector(vx,vy) 
      if ball.angle > 90: 
       ball.angle-=90 
      elif ball.angle < -90: 
       ball.angle+=90 
      ball.angle = 180-2*ball.angle # set new angle off ball after bounce 
      ball.touchspeed*=2 # make changing angle a bit more aggresive 
      if ball.angle + ball.touchspeed < 350 or ball.angle + ball.touchspeed > 40: 
       ball.angle += ball.touchspeed # ball.touchspeed - change the angle! 
      bounced = bounced.rotate(ball.angle) # finally, rotate the ball 
      if score<12: 
       vel = bounced * 1.1 # make ball move faster 
      else: 
       vel = bounced 
      ball.velocity = vel.x , vel.y 
      ball.touchspeed=0 
      return True # add +1 to score 
     else: 
      Manager.switch() 
      return False 

编辑的屏幕管理类:

class Manager(ScreenManager): 
    def __init__(self, *args, **kwargs): 
     super(Manager, self).__init__(*args, **kwargs) 
     self.current = 'menu' 
    def switch(self, where): 
     self.current = str(where) 
sm = Manager(transition=WipeTransition()) 

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

和我的KV文件:

<Manager> 
    Screen: 
     name: 'menu' 
     BoxLayout: 
      Button: 
       text: 'Play Color Pong' 
       halign: 'center' 
       valign: 'middle' 
       font_size: 50 
       text_size: self.size 
       on_release: root.current = 'game';game.serve_ball() 
      Button: 
       text: 'Quit' 
       halign: 'center' 
       valign: 'middle' 
       font_size: 50 
       text_size: self.size 
       on_release: game.quit() 

    Screen: 
     name: 'game' 
     ColorPongGame: 
      id: game 

    Screen: 
     name: 'endmenu' 
     id: endmenu 
     BoxLayout: 
      Button: 
       text: 'Replay' 
       halign: 'center' 
       valign: 'middle' 
       font_size: 50 
       text_size: self.size 
       on_release: root.current = 'game';game.serve_ball() 
      Button: 
       text: 'Quit' 
       halign: 'center' 
       valign: 'middle' 
       font_size: 50 
       text_size: self.size 
       on_release: game.quit() 

我想要做的就是改变屏幕,我认为它不能做,因为name'endmenu'不是k在Python文件中出现,即使有了这些知识,我也不知道如何解决这个问题。

回答

0

首先,您可以将Manager()设置为全局对象。
sm = Manager()
在您的构建方法中返回sm。然后你就可以访问它想:
sm.switch()

如果你在管理类,您可以使用self.current
我做了这个一个小例子:

from kivy.app import App 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.lang import Builder 


Builder.load_string(""" 

<Manager>: 
    Screen: 
     name: 'first' 
     Button: 
      text:'go to other' 
      on_press: root.goto_other() 

    Screen: 
     name: 'other' 
     Button: 
      text:'go to first' 
      on_press: root.goto_first() 

""") 


class Manager(ScreenManager): 

    def goto_first(self): 
     self.current = "first" 

    def goto_other(self): 
     self.current = "other" 


class ScreensApp(App): 

    def build(self): 
     return Manager() 


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

当我试图用我的功能代码我得到:switch()缺少1个需要的位置参数:'self'。我用它作为Manager.switch –

+0

@PiotrSnopek你可以告诉我的功能? – EL3PHANTEN

+0

不要使用Manager.switch(),使它成为一个对象。像sm = Manager(),并在构建中返回sm。然后你可以说'sm.switch()' – EL3PHANTEN