Button kivy remove_小部件未删除

Button kivy remove_小部件未删除,button,kivy,Button,Kivy,我正在学习关于kivy的知识,并在玩PONG的例子。我添加了一个按钮,在玩家达到给定分数后出现 if self.player2.score ==2 or self.player1.score==2: self.serve_ball(vel=(0, 0)) self.btn= Button() self.add_widget(self.btn) self.btn.bind(on_press=self.callback) 它绑

我正在学习关于kivy的知识,并在玩PONG的例子。我添加了一个按钮,在玩家达到给定分数后出现

    if self.player2.score ==2 or self.player1.score==2:
        self.serve_ball(vel=(0, 0))
        self.btn= Button()
        self.add_widget(self.btn)
        self.btn.bind(on_press=self.callback)
它绑定到一个重置分数和消息的函数回调,但我尝试了几种方法在按下按钮后移除按钮,但没有成功

def callback(self, instance):
    self.player2.score=0
    self.player1.score=0
    self.message1=""
    self.message2=""
    self.serve_ball(vel=(4,0))
    self.remove_widget(self.btn)
你知道怎么做吗?谢谢,这是完整的代码

from kivy.app import App 
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.properties import StringProperty, NumericProperty, ReferenceListProperty, ObjectProperty
from kivy.vector import Vector
from kivy.clock import Clock
from random import randint


class PongPaddle(Widget):
    score = NumericProperty(0)

    def bounce_ball(self, ball):
        if self.collide_widget(ball):
            vx, vy = ball.velocity
            offset = (ball.center_y - self.center_y) / (self.height / 2)
            bounced = Vector(-1 * vx, vy)
            vel = bounced * 1.1
            ball.velocity = vel.x, vel.y + offset


class PongBall(Widget):

    #Vel of ball in x & y axis
    velocity_x = NumericProperty(0)
    velocity_y = NumericProperty(0)

    #referencia para usar como vector
    velocity = ReferenceListProperty(velocity_x,velocity_y)

    #funcion move  1 paso en intervalos para animar la bola
    def move(self):
        self.pos = Vector(*self.velocity) + self.pos


class PongGame(Widget):
    ball = ObjectProperty(None)
    player1 = ObjectProperty(None)
    player2 = ObjectProperty(None) 
    message2 = StringProperty("")
    message1 = StringProperty("")



    def callback(self, instance):
        self.player2.score=0
        self.player1.score=0
        self.message1=""
        self.message2=""
        self.serve_ball(vel=(4,0))
        self.remove_widget(self.btn)

    def serve_ball(self, vel=(4,0)):
        self.ball.center = self.center
        self.ball.velocity = vel

    def btnn(self, instance):
        self.remove_widget(self.btn)

    def update(self, dt):
        self.ball.move()

        #bounce of paddles
        self.player1.bounce_ball(self.ball)
        self.player2.bounce_ball(self.ball)

        #bounce ball off bottom or top
        if (self.ball.y < self.y) or (self.ball.top > self.top):
            self.ball.velocity_y *= -1

         #went of to a side to score point?
        if self.ball.x < self.x:
            self.player2.score += 1
            self.serve_ball(vel=(4, 0))
        if self.ball.x > self.width:
            self.player1.score += 1
            self.serve_ball(vel=(-4, 0))

        #emilio code
        if self.player2.score ==2 or self.player1.score==2:
            self.serve_ball(vel=(0, 0))
            self.btn= Button()
            self.add_widget(self.btn)
            self.btn.bind(on_press=self.callback)

            if self.player2.score == 2:
                self.message2= "player2 won!"


            if self.player1.score == 2:
                self.message1= "player1 won!"


    def on_touch_move(self, touch):
        if touch.x < self.width / 3:
            self.player1.center_y = touch.y
        if touch.x > self.width - self.width / 3:
            self.player2.center_y = touch.y


class PongApp(App):

    def build(self):
        game = PongGame()
        game.serve_ball()
        Clock.schedule_interval(game.update, 1.0 / 60.0)
        return game

if __name__=='__main__':
        PongApp().run()`
从kivy.app导入应用
从kivy.uix.widget导入widget
从kivy.uix.button导入按钮
从kivy.properties导入StringProperty、NumericProperty、ReferenceListProperty和ObjectProperty
从kivy.vector导入向量
从kivy.clock导入时钟
从随机导入randint
类PongPaddle(小部件):
分数=数值属性(0)
def弹跳球(自身,球):
如果self.collide_小部件(球):
vx,vy=球的速度
偏移=(ball.center_y-self.center_y)/(self.height/2)
反弹=矢量(-1*vx,vy)
水平=反弹*1.1
球体速度=x层,y层+偏移
类PongBall(小部件):
#球在x和y轴上的水平
速度x=数值属性(0)
速度_y=数值属性(0)
#参考准usar como向量
速度=ReferenceListProperty(速度x,速度y)
#在博拉岛上的动物间歇期,功能移动1
def移动(自我):
self.pos=向量(*self.velocity)+self.pos
类PongGame(小部件):
ball=ObjectProperty(无)
player1=ObjectProperty(无)
player2=ObjectProperty(无)
message2=StringProperty(“”)
message1=StringProperty(“”)
def回调(自身,实例):
self.player2.score=0
self.player1.score=0
self.message1=“”
self.message2=“”
自我发球(水平=(4,0))
self.remove\u小部件(self.btn)
def发球(自身,水平=(4,0)):
self.ball.center=self.center
self.ball.velocity=vel
def btnn(自身,实例):
self.remove\u小部件(self.btn)
def更新(自我,dt):
self.ball.move()
#桨的弹跳
self.player1.弹起球(self.ball)
self.player2.弹起球(self.ball)
#将球从底部或顶部反弹
如果(self.ball.yself.top):
self.ball.velocity_y*=-1
#跑到一边去得分?
如果self.ball.xself.width:
self.player1.score+=1
自我发球(水平=(-4,0))
#埃米利奥代码
如果self.player2.score==2或self.player1.score==2:
自我发球(水平=(0,0))
self.btn=按钮()
self.add_小部件(self.btn)
self.btn.bind(on_press=self.callback)
如果self.player2.score==2:
self.message2=“玩家2获胜!”
如果self.player1.score==2:
self.message1=“玩家1获胜!”
def on_touch_move(自我,触摸):
如果触摸.xself.width-self.width/3:
self.player2.center_y=touch.y
PongApp课程(应用程序):
def生成(自):
game=PongGame()
比赛发球
时钟时间间隔(game.update,1.0/60.0)
回击赛
如果“名称”=“\uuuuuuuu主要”:
PongApp().run()`
这是kv文件,以防万一:

#:kivy 1.0.9


<PongBall>:
    size: 50, 50
    canvas:
        Ellipse:
            pos: self.pos
            size: self.size

<PongPaddle>:
    size: 25, 200
    canvas:
        Rectangle:
            pos:self.pos
            size:self.size
<PongGame>:
    ball: pong_ball
    player1: player_left
    player2: player_right
    canvas:
        Rectangle:
            pos: self.center_x - 5, 0
            size: 10, self.height

    Label:
        font_size: 70
        center_x: root.width / 4
        top: root.top - 50
        text: str(root.player1.score)
        color: (255,0,255,1)
    Label:
        font_size: 70
        center_x: root.width * 3 / 4
        top: root.top - 50
        text: str(root.player2.score)
        color: (255,0,255,1)
    Label:
        font_size: 40
        center_x: root.width * 3/4
        top: root.center_y
        text: str(root.message2)
        color: (0,255,0,1)
    Label:
        font_size: 40
        center_x: root.width / 4
        top: root.center_y
        text: str(root.message1)
        color: (0,255,0,1)

    PongBall:
        id: pong_ball
        center: self.parent.center


    PongPaddle:
        id: player_left
        x: root.x
        center_y: root.center_y


    PongPaddle:
        id: player_right
        x: root.width-self.width
        center_y: root.center_y
#:kivy 1.0.9
:
尺码:50,50
画布:
椭圆:
pos:self.pos
大小:self.size
:
尺码:25200
画布:
矩形:
pos:self.pos
大小:self.size
:
球:乒乓球
玩家1:玩家左
玩家2:玩家右
画布:
矩形:
位置:自中心x-5,0
尺码:10,身高
标签:
字体大小:70
中心x:root.width/4
顶部:root.top-50
文本:str(root.player1.score)
颜色:(255,0255,1)
标签:
字体大小:70
中心x:root.width*3/4
顶部:root.top-50
文本:str(root.player2.score)
颜色:(255,0255,1)
标签:
字体大小:40
中心x:root.width*3/4
顶部:root.center_y
文本:str(root.message2)
颜色:(0255,0,1)
标签:
字体大小:40
中心x:root.width/4
顶部:root.center_y
文本:str(root.message1)
颜色:(0255,0,1)
庞贝尔:
id:pong_ball
中心:self.parent.center
PongPaddle:
id:player_左
x:root.x
中心y:根。中心y
PongPaddle:
id:玩家(右)
x:root.width-self.width
中心y:根。中心y

多次调用更新功能,每次满足条件时,您都会创建另一个按钮。仅删除单击时创建的最后一个按钮

以下是您的错误:

if self.player2.score ==2 or self.player1.score==2:
    print 'WOO' # see how many times this is gonna be printed
    #make sure you don't get here more than once per game :)
    self.serve_ball(vel=(0, 0))
    self.btn= Button()
    self.add_widget(self.btn)
    self.btn.bind(on_press=self.callback)

update函数被多次调用,每次满足条件时,您都会创建另一个按钮。仅删除单击时创建的最后一个按钮

以下是您的错误:

if self.player2.score ==2 or self.player1.score==2:
    print 'WOO' # see how many times this is gonna be printed
    #make sure you don't get here more than once per game :)
    self.serve_ball(vel=(0, 0))
    self.btn= Button()
    self.add_widget(self.btn)
    self.btn.bind(on_press=self.callback)