如何让课程互相交流?

时间:2012-06-29 05:03:15

标签: python wxpython

情况如下

class App(wx.Frame):
    def __init__(self,parent,id=-1,title='Test App'):
        wx.Frame.__init__(self,parent,id,title,size=((1050,690)))

        self.mode = 'Test'


class SetModes:
    def __init__(self):
        self.GetModes = App(None,-1)

        self.appmode = ''

    def SetMode(self):
        self.appmode = self.GetModes.mode

现在这只是一个示例脚本,因为我已经知道这不起作用,但它显示了我本来想要做的事情。让我澄清一下:

我想从app类中获取并设置一些变量。我希望能够从我的'SetModes'类中执行此操作。问题是我无法创建它的实例,因为我无法将父项分配给实例,因此self.GetModes方法不起作用,它告诉我实例不能“不”拥有父项,所以这是否意味着我无法创建我的App类的实例,如果我想要做的就是使用它的一些变量和函数??

那么我该怎么做呢?我可以让班级与需要家长的班级进行交流吗?

2 个答案:

答案 0 :(得分:1)

我认为您的部分问题是需要从wx.App实例内部初始化框架,然后必须调用MainLoop()(请参阅this tutorial。请注意框架是否具有父None)。

在那之后,像jdi这样的解决方案将起作用。但是,如果可以避免使用引用,我仍然不喜欢使用引用。对于父母在直接孩子上调用函数,没关系,但我个人的规则是我的班级看不到他们没有直接拥有的任何对象(即没有关于孩子的孩子的知识)。

我非常喜欢PubSub在不相关的课程之间进行交流。与wx.Event对象不同,不需要任何层次关系。与jdi提出的参考解决方案不同,类不需要对彼此的结构有任何了解。

归结为,在您的应用程序中,SetModes实例是否存在而不 App实例?如果不是,您可以将SetModes'逻辑合并到App吗?如果是,那么将SetModes编码为明确处理App是不好的设计。

使用PubSub,您可以从SetModes发送请求消息。 App会看到该消息,然后可以发送一条响应消息,SetModes可以看到该消息。完全分离,完全异步。 SetModes不需要了解App,只需要了解消息格式。

答案 1 :(得分:0)

仅仅因为wx.Frame需要父级,并不意味着你不能在另一个无关联的类中分配对它的引用。只需将您的App实例与您正常工作的内容相同,但将引用传递给您的SetModes:

app = App(parent)
setModes = SetModes()
setModes.GetModes = app

这归结为程序的设计问题。小部件需要父母。