酸洗物

时间:2010-10-05 09:19:54

标签: python wxpython pickle

我需要pickle对象[wxpython frame object]并将其作为参数发送到multiproccessing池模块上的apply_async函数 有人可以给我一个例子我该怎么做 我尝试了以下操作并收到错误消息:

myfile = file(r"C:\binary.dat", "w")
pickle.dump(self, myfile)
myfile.close()


self.my_pool.apply_async(fun,[i,myfile])

def fun(i,self_object):
    window = pickle.load(self_oject)
    wx.CallAfter(window.LogData, msg)

有人可以告诉我可能是什么问题

如果错误在最后一条错误消息下方给出了一些指示符,我得到:  在_reduce_ex中输入文件“C:\ Python26 \ lib \ copy_reg.py”,第70行     引发TypeError,“不能pickle%s对象”%base。 name TypeError:无法pickle PySwigObject对象

2 个答案:

答案 0 :(得分:1)

我不相信wxPython对象可以被腌制。它们只是C对象的包装器,它包含许多指针和其他有状态的东西。泡菜模块对它们知之甚少,以后能够恢复它们的状态。

答案 1 :(得分:1)

您无法序列化窗口小部件以在其他进程中使用。我想你想要从multiprocessing模块启动的另一个进程更改GUI内容。在这种情况下,您应该在父进程中定义一个回调函数,该函数在子进程的结果准备好时被调用。因此,您可以使用apply_async的“回调”参数。

类似的东西:

def fun(i):
    # do something in this sub-process and then return a log message
    return "finished doing something"

def cb(resultFromFun):
    wx.CallAfter(window.LogData, resultFromFun)

my_pool.apply_async(fun, [i], callback = cb)