【问题标题】:Change screen from python code Kivy从 python 代码 Kivy 更改屏幕
【发布时间】:2016-12-29 23:38:09
【问题描述】:

所以我在游戏结束后更换屏幕时遇到了问题。 我试过这样做:

Manager.current = 'endmenu'

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

main.py,我使用 switch() 的函数

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

我想要做的就是改变屏幕,我认为它无法完成,因为在 python 文件中不知道名称“endmenu”,即使有了这些知识,我也不知道如何解决这个问题。

【问题讨论】:

    标签: android python kivy kivy-language


    【解决方案1】:

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

    如果你是Manager类,可以使用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()
    

    【讨论】:

    • 当我尝试在代码中使用我的函数时,我得到:switch() 缺少 1 个必需的位置参数:'self'。我用它作为Manager.switch
    • 不要使用Manager.switch(),让它成为一个对象。像 sm = Manager(),并在构建中返回 sm。然后你可以说sm.switch()
    • 好的,我明白了,但是当我按照你说的做时我有更多错误,也许我应该尝试在 py 文件中的其他类中声明每个屏幕?正如你所说,我已经编辑了主要问题。程序返回 kivy.uix.screenmanager.ScreenManagerException: No Screen with name "menu"。但是为什么当有这个名字的屏幕时。
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多