【问题标题】:sharing variables between two wxpython tabs在两个 wxpython 选项卡之间共享变量
【发布时间】:2011-06-22 10:01:46
【问题描述】:

我已经问过这个问题,但它的表述不是很好。

persistence of objects in python

作为python和GUI编程的新手

我有一个包含许多 python 文件的大型项目。文件 a.py 定义了一个名为 fobject 的类我使用的是 python 2.5

文件 b.py 和 c.py 有名为 BProject 和 CProject 的类,它们有一个 fobject 对象作为参数。这些是基于 wx python 的程序中的页面。

我在 b.py 中包含了使用 import CProject(在 c.py 中定义)。我在 CProject 中有一个使用 wx python GUI 填充的列表。接下来我调用在 BProject 中定义的函数 BRun,它在内部调用 CProject 中的 CRun 函数,即。在 c.py.

在这个 CRun 中,我想操作列表,但此时列表始终为空。为什么会这样?

鉴于约束条件是我无法更改定义 fobject 的任何 a.py 内容,我应该怎么做?

文件:c.py

def Instance(fObject):
    return test_page_CProject(fObject)


class CProject(object):

    def __init__(self, fObject):
        self.fObj = fObject
        self.IntList  =  []
        ##snip

    def  OnIntSelectBtnPress(self,parent):
        print ":self.IntList"
        print self.IntList
        self.listBoxIntSelect.InsertItems(self.IntList,0)
        print self.IntList

    def OnIntRun(self):
        IntLModeList = self.IntListIntMode
        #snip

文件 b.py

def Instance(fObject):
    return BProject(fObject)

class BProject(object):

    def __init__(self, fObject):
        self.FObj = fObject
        #snip
        Object = __import__('CProject')
        #snip

        self.intObject = Object.Instance(self.FObj)
        self.intObject.OnIntRun()

当调用 CPython.OnIntRun 时 self.IntList 不应该为空

【问题讨论】:

    标签: python oop wxpython


    【解决方案1】:

    我没有很好地遵循这一点,但通常你需要在实例化类时传入数据。否则,您可以使用 PubSub 在类之间传递信息,或者您可以创建一个简单的本地 Web 服务器,每个选项卡都会定期检查新数据并自行更新。

    【讨论】:

    • 我相信创建一个网络服务器对于这个应用程序来说太过分了。此应用程序需要单独安装在多台 PC 上,即使没有网络访问权限,也需要安装在客户端以锻炼我们的硬件。此应用程序与我们的董事会互动。
    • 您将使用 Python 的套接字模块、SimpleHTTPServer 或 SimpleXMLRPCServer 在内存中创建服务器。我不是在谈论加载 apache 或类似的东西。
    【解决方案2】:

    如果你的 fObject 维护对 bProject 和 cProject 的引用,你不能在你的 fObject 中写一个 send_to_c(msg) 函数,你可以从你的 bProject 调用(反之亦然)吗?

    【讨论】:

    • 不幸的是,因为 fObject 在 a.py 中定义并且对许多平台都很常见,因此我无法修改它。
    • 所以创建一个class gObject(fObject)(从 fObject 继承)并将你的函数添加到 gObject!