事件处理程序中的Python Kivy PicklingError:无法挑选<type'code'=“”>:属性查找__builtin __。代码失败

时间:2015-12-09 18:03:03

标签: python user-interface kivy pickle python-multiprocessing

我对Kivy和多处理都很陌生。

我正在探索使用多处理同时运行多个Kivy应用程序,方法与:Running multiple Kivy apps at same time that communicate with each other相同。

现在,我想维护当前正在运行的应用程序的共享列表,例如Manager.list(),但我在开始时遇到困难。我有一个类似的测试代码:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label

from multiprocessing import Process, Manager


class ParentApp(App):
    def __init__(self, app_list, **kwargs):
        super(ParentApp, self).__init__(**kwargs)
        self.app_list = app_list

    def build(self):
        self.add_self_to_list()
        return Label(text = "abc")

#   def on_start(self):
#       self.add_self_to_list()

    def add_self_to_list(self):
        self.app_list.append(self)


if __name__ == "__main__":
    manager = Manager()
    my_list = manager.list()

    print "Before:"
    print my_list

    parent = ParentApp(my_list)

    p = Process(target = parent.run)
    p.start()
    p.join()

    print "After:"
    print my_list

这会正确地将ParentApp添加到共享的my_list,但当我在self.add_self_to_list()中注释掉build并取消注释on_start时,我会得到此信息PicklingError:

...
self.app_list.append(self)
File "<string>", line 2, in append
File "C:\Kivy-1.9.0-py2.7-win32-x64\Python27\lib\multiprocessing\managers.py", line 758, in _callmethod
    conn.send((self._id, methodname, args, kwds))
PicklingError: Can't pickle <type 'code'>: attribute lookup __builtin__.code failed

我还尝试将add_self_to_list挂钩到Button的on_press回调,我也遇到了同样的错误。为什么它适用于build方法而不是回调?有没有办法解决这个问题?

我在Windows 7上运行Kivy 1.9.0和Python 2.7。

(如果您想知道为什么我会这样尝试:每个应用都可以调用其他应用。如果某个应用已经在运行,我不想开始新应用用同一个窗口的副本污染屏幕。理想情况下,我会抓住应用程序并在前面弹出它的窗口。我还没有使用Kivy App的root_window,所以我&#39;我甚至不确定这是否可行。只是在这里查看选项:)如果您已经知道这是否可以或不能与Kivy一起完成,我也想知道,但也许我&#39 ;发布另一个问题! )

0 个答案:

没有答案