Kivy 模板中的事件处理器

2 投票
1 回答
710 浏览
提问于 2025-04-17 20:39

看看下面这些代码,我觉得它们的效果是一样的:

main.py在两个版本中都是一样的,内容非常简单:

from kivy.app import App
from kivy.uix.widget import Widget

class MainWidget(Widget):
    def callback(self):
        pass        

class MainApp(App):
    pass

if __name__ == "__main__":
    MainApp().run()⏎ 

main.kv的工作版本如下:

MainWidget:
    Button:
        text: "Buttontext"
        on_press: root.callback()
    Button:
        text: "Buttontext"
        on_press: root.callback()

我想为很多按钮重复这个!所以我想到了一个这样的解决方案:

<TB@Button>:
    text: "Buttontext"
    on_press: root.callback()

MainWidget:
    TB:
    TB:

但是这个方案不管用。我把例子改成这样:

<TB@Button>:
    text: "Buttontext"
    on_press: main.callback()

MainWidget:
    id: main
    TB:
    TB:

...但这个也不行。这个template功能适合我的应用吗?

1 个回答

2

你的问题出在root这个关键词的理解上。在你动态定义的类里,root指的是这个类本身,而不是它可能有的任何父类。

因为你(大概)确定这些按钮总是会被添加到MainWidget里,所以你可以用self.parent来代替root

撰写回答