使用多处理和 tkinter 时,我的应用程序在 OSX 上失败。最简单的示例如下:
import multiprocessing
from tkinter import Spinbox #Delete this line and it works
class Gui(multiprocessing.Process):
def run(self):
self.start_window()
self.root.mainloop()
def start_window(self):
from tkinter import Tk
self.root = Tk()
self.root.title('Test')
g = Gui()
g.start()
当尝试执行此代码片段时,mac 失败并显示以下报告:
Process: Python [1453] Path: > /Library/Frameworks/Python.framework/Versions/3.4/Resources/Python.app/Contents/MacOS/Python Identifier: Python Version: 3.4.4 (3.4.4) Code Type: X86-64 (Native) Parent Process: Python [1452] Responsible: Terminal [395] User ID: 501
Date/Time: 2016-01-18 18:33:23.281 +0100 OS Version: Mac OS X 10.11.2 (15C50) Report Version: 11 Anonymous UUID: 49081BD5-7C1E-52F6-E5D9-F9F41BA8DFE5
Time Awake Since Boot: 6200 seconds
System Integrity Protection: enabled
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000110
VM Regions Near 0x110: --> __TEXT 0000000100000000-0000000100001000 [ 4K] r-x/rwx SM=COW /Library/Frameworks/Python.framework/Versions/3.4/Resources/Python.app/Contents/MacOS/Python
Application Specific Information: * multi-threaded process forked * crashed on child side of fork pre-exec
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0 libdispatch.dylib 0x00007fff99f0fd69 _dispatch_async_f_slow + 391
1 libxpc.dylib 0x00007fff8fb8daa0 xpc_connection_resume + 192
2 com.apple.CoreFoundation 0x00007fff9bbb69d1 _CFPrefsWithDaemonConnection + 353
删除 Spinbox 导入(代码中未使用)会使一切运行。同样的问题出现在python 3.4.4和2.7上(将tkinter更改为Tkinter)
删除多处理模块并使所有内容在同一进程上运行也可以使问题消失。
我的猜测是我违反了一些 Tk/Tcl 约束,但我没有找到任何关于此的文档,而且这种情况仅发生在 Spinbox 上而不发生在 Entry 或其他小部件上的事实是可疑的。
最佳答案
我设法让它工作,由于某种原因 tkinter 希望被导入到它执行的同一个线程/进程中。
扩展 multiprocess.Process 时,新进程代码位于 run() 方法内,init 在父进程上执行。因此,将所有导入更改为在运行方法上本地完成可以解决问题。
示例代码如下:
import multiprocessing
class Gui(multiprocessing.Process):
def run(self):
from tkinter import Spinbox # or Tk, or * ....
self.start_window()
self.root.mainloop()
def start_window(self):
from tkinter import Tk
self.root = Tk()
self.root.title('Test')
g = Gui()
g.start()
现在我的应用程序可以在 Windows、Linux 和 Mac 上运行。
关于python - Tkinter Spinbox 和多处理导致 mac SEGFAULT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34860875/