我有一个wxPython应用程序,下面有一些代码。我想设置MyFrame类的属性的值,但是我不能引用它。
如何使此代码起作用?
class MyFrame1(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
self.gauge_1 = wx.Gauge(self, -1)
self.notebook_1=myNotebook(self, -1)
class myNotebook(wx.Notebook):
def __init__(self, *args, **kwds):
wx.Notebook.__init__(self, *args, **kwds)
self.other_class_1=other_class()
self.other_class_1.do_sth()
class other_class(object):
def do_sth(self):
gauge_1.SetValue(value) #doesn't work of course, how do I do this?
最佳答案
我认为对于子UI元素来说,对于其父元素具有特定的知识可能有点糟糕。它是一个向后的设计。儿童通常应该以某种方式发出信号或引发事件,并让适当的听众做出反应。但是,如果确实要执行此操作,那么您可能想要获取父项并直接对其进行操作...
注意:请勿执行此方法。我正在说明为什么设计存在问题...
首先,您甚至无法使用代码的结构方式来完成此操作,因为other_class
没有引用父级。它是一个通用实例。因此,您将必须执行类似...
class other_class(object):
def __init__(self, parent):
self.parent = parent
在您的笔记本课堂中...
class myNotebook(wx.Notebook):
def __init__(self, *args, **kwds):
wx.Notebook.__init__(self, *args, **kwds)
# note here we pass a reference to the myNotebook instance
self.other_class_1 = other_class(self)
self.other_class_1.do_sth()
然后,一旦other_class现在知道其父级,就必须获取父级的父级才能拥有MyFrame1实例...
class other_class(object):
def __init__(self, parent):
self.parent = parent
def do_sth(self, value):
self.parent.GetParent().gauge_1.SetValue(value)
您现在知道为什么它的设计不好吗?多个级别的对象必须假设其父级结构的知识。
我没有使用wxPython,因此无法提供具体细节,但是这里有一些可能的一般方法可供考虑:
确定
other_class
的真正角色。如果确实要对MyFrame1的子级进行操作,则该功能属于MyFrame1,因此它可以了解这些成员。如果
other_class
是wx对象,则在调用do_sth()
方法时它可能会发出wx.Event。您可以在MyFrame1或Notebook级别上绑定该事件,并执行处理程序中所需的任何工作。