Kivy:访问不同类的方法
Posted
技术标签:
【中文标题】Kivy:访问不同类的方法【英文标题】:Kivy: accessing a method on a different class 【发布时间】:2014-07-09 08:36:33 【问题描述】:假设我正在构建一个井字游戏(因为它与结构非常相似) 我希望结果显示在带有新游戏按钮的弹出窗口中,并且我希望此弹出窗口允许我访问设置(使用另一个按钮)并更改它们,始终保持在弹出窗口中,然后离开并最终关闭它并开始一个新游戏。
我希望我可以保持有序,因此有一个单独的弹出窗口类,我可以在其中构建我的自定义弹出窗口。
很明显,我有 newgame 方法和 reset 方法作为我的 game-grid 类的方法。 另一方面,更改设置的方法是在自定义设置类上
在设计弹出类时,如何将其按钮(例如新游戏)绑定到完全不同的类中包含的方法?我查看了一些 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 文件上)
【问题讨论】:
【参考方案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()
最好假设父级有设置,因为如果您更改保存设置的位置,您只需要更改一个引用。
【讨论】:
这不是我真正想说的。这样我可以访问弹出窗口内的设置类方法(因为设置类是它的成员),但不是任何不在弹出类“下”的方法(例如新的游戏方法) self.parent 允许我爬树一层但不止一层?我可以编辑问题以更清楚地说明这一点。还是谢谢你 @AscanioFX 我添加了一个引用方法的示例。 @RyanP 谢谢!嗯,我发现您的解决方案非常有趣!这样我会在初始化时将我的设置小部件和我可能需要的任何函数传递给 CustomPopup 类。我还没有完全理解什么是 kivy 属性,但这不是这个问题的主题。如果我将 my_widget 传递给 CustomPopup,它会创建它的副本(在修改蜜蜂时不更改原始设置小部件)还是将其修改为“通过引用”(我来自 C 背景) Python 中的一切都是通过对象引用传递的。将这些视为自动引用/取消引用自身的神奇指针。因此,如果您将my_widget
传递给CustomPopup
,它将是一个包含相同值(相同引用)的单独指针。
这是一篇不错的小文章,描述了按值传递、按引用传递和按对象引用传递之间的区别。 robertheaton.com/2014/02/09/…以上是关于Kivy:访问不同类的方法的主要内容,如果未能解决你的问题,请参考以下文章
如何从 kivy 文件 (.kv) 访问不同类的 id/widget?
Kivy,python:如何从根类(FaceRecApp)访问外部/子类?
Java:当我使用extends关键字实现多重继承时,不同包的不同类中未访问受保护的方法