2014-05-11 120 views
1

所以我在启动Python中的多个进程时遇到了问题。我将使用一个进程运行下载,另一个进程显示进度条。现在,我正在研究进度条进程,但我一直在收到这个奇怪的错误。我认为这与事实做我使用的是Mac OS X的多处理Python核心基础错误

这里是我的代码:

import Tkinter as tk 
from multiprocessing import Process 
class Application(tk.Frame): 
     def __init__(self, master = None): 
      tk.Frame.__init__(self,master) 
      self.grid() 
      self.setup() 
     def setup(self): 
      self.label = tk.Label(self, text = "Progress Bar") 
      self.label.grid() 
      self.canvas = tk.Canvas(self, cursor = 'arrow', height = 400, width = 400) 
      self.canvas.grid() 
      self.rectangle = self.canvas.create_rectangle(0,0,399,20,fill = 'white') 
      self.canvas.grid() 
def appStart():   
    app = Application() 
    app.master.title("Progress Bar") 
    app.mainloop() 

p = Process(target = appStart) 
p.start() 

这里是错误:

The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec(). 
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug. 

所以呀,怎么我能解决这个问题吗?我真的很想使用多处理库,因为它非常简单易用。对于并发性,我也是一个初学者,所以对于我来说底层的API会非常复杂。我需要使用多个进程,因为Python不能同时运行多个线程。请帮忙。

回答

1

您不能将GUI分成两个这样的进程。您需要将所有GUI代码保留在主进程中,并让其他进程通过队列与其进行通信。

0

在操作系统10.8.5我有你的代码相同的问题。

试试这个:

from multiprocessing import Process 

def appStart(): 
    import Tkinter as tk 

    class Application(tk.Frame): 
     def __init__(self, master = None): 
      tk.Frame.__init__(self,master) 
      self.grid() 
      self.setup() 

     def setup(self): 
      self.label = tk.Label(self, text = "Progress Bar") 
      self.label.grid() 
      self.canvas = tk.Canvas(self, cursor = 'arrow', height = 400, width = 400) 
      self.canvas.grid() 
      self.rectangle = self.canvas.create_rectangle(0,0,399,20,fill = 'white') 
      self.canvas.grid() 

    app = Application() 
    app.master.title("Progress Bar") 
    app.mainloop() 

if __name__ == '__main__': 
    p = Process(target = appStart) 
    p.start() 

Mac和Linux上看来,你已经开始(分支)后,您只能导入Tkinter的你的流程,在这里我用你的“AppStart的”功能为您的Tkinter包装来创建过程。

一些裁判: Python Tkinter application causes fork()/exec() error on Mac OS X
Why doesn't tkinter play nicely with multiprocessing?