小编典典

Kivy:访问其他类上的方法

python

假设我正在构建一个井字游戏(因为它与结构非常相似),我希望结果在弹出窗口中显示,并带有一个新的游戏按钮,并且希望此弹出窗口允许我访问设置(另一个按钮)并对其进行更改,使其始终位于弹出窗口中,然后离开并最终将其关闭并开始新游戏。

我希望我可以保持秩序,因此有一个单独的弹出窗口类,可以在其中构建自定义弹出窗口。

显而易见,我将newgame方法和reset方法作为我的游戏网格类的方法。另一方面,更改设置的方法是在自定义设置类上

在设计弹出类时,如何将其按钮(例如新游戏)绑定到完全不同的类中包含的方法?我看过一些kv示例,它们通常使用root.blabla.method来访问位于同一棵树的不同位置(在.kv文件中)的方法,但是在这里我尝试使用的方法不存在那个树!

我将尝试放置一些示例代码以使其更加清晰

class Settings():

    def changeSettings(self):
        ....

class GmeGrid(GridLayout):

    def newGame(self):
        ....

    def reset(self):
        ...

class customPopup(Popup):

    pass

然后,在.kv文件上,我希望可以将一些弹出按钮绑定到newGame并更改设置方法

这里的问题是我应该将popop类上的按钮绑定到完全不同的类上,而我不知道该怎么做(尤其是在.kv文件上)


阅读 210

收藏
2020-12-20

共1个答案

小编典典

只要窗口小部件已完全实例化并添加到窗口小部件树中,您就可以使用它self.parent来访问窗口小部件的父级。您可能会考虑通过传递引用:

Builder.load_string('''
<CustomPopup>:
    BoxLayout:
        orientation: 'vertical'
        # some settings stuff here
        BoxLayout:
            orientation: 'horizontal'
            Button:
                text: 'New Game'
                on_press: root.do_new_game()
''')

class CustomPopup(Popup):
    settings_widget = ObjectProperty()
    new_game = ObjectProperty()

    def do_new_game(self):
        self.settings_widget.some_property = some_value
        self.dismiss()
        self.new_game()

p = CustomPopup(settings_widget=my_widget, new_game=mygame.newGame)
p.open()

最好假设父级具有设置,因为如果更改设置的保留位置,则只需更改一个引用。

2020-12-20