首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多处理Python核心基础错误

多处理Python核心基础错误
EN

Stack Overflow用户
提问于 2014-05-12 07:40:02
回答 2查看 2.2K关注 0票数 1

因此,我在Python中启动多个进程时遇到了问题。我将使用一个进程来运行下载,使用另一个进程来显示进度条。现在,我正在制作进度条进程,但我一直收到这个奇怪的错误。我认为这与我使用Mac的事实有关。

下面是我的代码:

代码语言:javascript
复制
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()

下面是错误:

代码语言:javascript
复制
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不能同时运行多个线程。请帮帮忙。

EN

回答 2

Stack Overflow用户

发布于 2014-05-12 09:02:55

你不能像这样把一个GUI分成两个进程。您需要将所有GUI代码放在主进程中,并让其他进程通过队列与其通信。

票数 1
EN

Stack Overflow用户

发布于 2014-06-02 01:25:56

在OS10.8.5中,我的代码也有同样的问题。

试试这个:

代码语言:javascript
复制
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?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23599087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档