Python 我可以用kivi语言从一个小部件引用另一个小部件的属性吗?

Python 我可以用kivi语言从一个小部件引用另一个小部件的属性吗?,python,kivy,kivy-language,Python,Kivy,Kivy Language,我从kivy开始在教程中四处玩耍,我在Pong教程的末尾,希望根据分数添加“获胜者”标签 为此,我设计了一个赢家标签: : 标签: 字体大小:200 #中心x:self.parent.width*.5 #中间y:self.parent.top-.5 文字:“获胜者!” 我想把这个标签放在中间,根据乒乓球的尺寸,但是它最终落在左下角。 我还尝试直接在python中添加小部件(请参见更新方法),但是我仍然不知道如何动态地进行放置,就像其他带有分数的标签如何放置在kivy文件的PongGame中一样

我从kivy开始在教程中四处玩耍,我在Pong教程的末尾,希望根据分数添加“获胜者”标签

为此,我设计了一个赢家标签:

:
标签:
字体大小:200
#中心x:self.parent.width*.5
#中间y:self.parent.top-.5
文字:“获胜者!”
我想把这个标签放在中间,根据乒乓球的尺寸,但是它最终落在左下角。

我还尝试直接在python中添加小部件(请参见更新方法),但是我仍然不知道如何动态地进行放置,就像其他带有分数的标签如何放置在kivy文件的PongGame中一样

从kivy.app导入应用
从kivy.uix.widget导入widget
从kivy.uix.label导入标签
从kivy.properties导入(
NumericProperty、ReferenceListProperty、ObjectProperty
)
从kivy.vector导入向量
从kivy.clock导入时钟
类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=数值属性(0)
速度_y=数值属性(0)
速度=ReferenceListProperty(速度x,速度y)
def移动(自我):
self.pos=向量(*self.velocity)+self.pos
班级优胜者(小部件):
通过
类PongGame(小部件):
ball=ObjectProperty(无)
player1=ObjectProperty(无)
player2=ObjectProperty(无)
def发球(自我,水平=(4,0)):
self.ball.center=self.center
self.ball.velocity=vel
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.player1.score>0:
非计划时钟(自我更新)
self.add_小部件(Winner())
#self.add_小部件(text='bla',center_y=self.parent.top-50)
self.add_小部件(标签(text='bla',center_y=self.parent.top-50))
如果self.player2.score>0:
非计划时钟(自我更新)
self.add_小部件(Winner())
self.add_小部件(标签(text='bla',center_y=self.parent.top-50))
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)
回击赛
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
PongApp().run()
基维

#:kivy 1.0.9
:
尺码:50,50
画布:
椭圆:
pos:self.pos
大小:self.size
:
标签:
字体大小:200
中心x:self.parent.width*.5
中间y:self.parent.top-.5
文字:“获胜者!”
:
尺码:20200
画布:
矩形:
pos:self.pos
大小:self.size
:
球:乒乓球
玩家1:玩家左
玩家2:玩家右
画布:
矩形:
位置:自中心x-5,0
尺码:10,身高
标签:
字体大小:70
中心x:root.width/4
顶部:root.top-50
文本:str(root.player1.score)
标签:
字体大小:70
中心x:root.width*3/4
顶部:root.top-50
文本:str(root.player2.score)
标签:
字体大小:70
中心x:root.width*.5
顶部:root.top-50
文字:“获胜者!”
庞贝尔:
id:pong_ball
中心:self.parent.center
PongPaddle:
id:player_左
x:root.x
y:root.center\u y
PongPaddle:
id:玩家(右)
x:root.width-self.width
中心y:根。中心y
如何引用父窗口小部件的属性?
谢谢

在kv文件和Python脚本中需要以下增强功能来解决此问题

kv文件
  • 使用
    app.root
    引用root小部件

Kv语言有三个特定的关键字:

  • 应用程序:始终指应用程序的实例
  • root:指当前规则中的基本小部件/模板
  • self:始终参考当前小部件

自我

关键字self引用“当前小部件实例”:

Button:
    text: 'My state is %s' % self.state
根目录

此关键字仅在规则定义中可用,表示 规则的根小部件(规则的第一个实例):

代码片段-kv文件 输出

非常有效,我可以在《编程指南》的哪里找到更多关于这方面的信息?术语是什么?谢谢。这里有一些Kivy的文档,还有
<MyWidget>:
    custom: 'Hello world'
    Button:
        text: root.custom
Label:
    text: app.name
<Winner>:
    font_size: 200
    center: app.root.center
    text: "WINNER!"
class Winner(Label):
    pass


class PongGame(Widget):
    ...
    def update(self, dt):
        self.ball.move()
        ...
        if self.player1.score > 0:
            self.add_widget(Winner())
        if self.player2.score > 0:
            self.add_widget(Winner())

    def on_touch_move(self, touch):
        ...