我对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 ;发布另一个问题! )