2016-12-29 8 views
0

У меня проблема с изменением экрана после окончания игры. Я попытался сделать это следующим образом:Изменить экран из кода python Kivy

Manager.current = 'endmenu' 

, но он не работает. Это фрагмент моего кода формы и кв ру файлы

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 

и мой файл киловольт :

<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() 

все, что я хочу сделать, это изменить экран, и я думаю, что это не может быть сделано, потому что имя «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() и return sm в сборке. Тогда вы можете сказать 'sm.switch()' – EL3PHANTEN