让我们假装我正在构建一个井字游戏(因为它与结构非常相似) 我希望结果显示在一个弹出窗口中,带有一个新的游戏按钮,我希望这个弹出窗口让我访问设置(使用另一个按钮)并更改它们,始终保持在弹出窗口中,然后离开并最终关闭它并开始一款新游戏。
我希望我能保持秩序,因此有一个单独的弹出类,我可以在其中构建自定义弹出窗口。
我有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文件上)
答案 0 :(得分: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()
假设父级具有设置,这样做会更好,因为如果您更改了设置的位置,则只需更改一个参考。