我有一个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级别上绑定该事件,并执行处理程序中所需的任何工作。

10-07 13:59