python - Tkinter Spinbox 和多处理导致 mac SEGFAULT

标签 python macos tkinter python-multiprocessing

使用多处理和 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/

相关文章:

python - 从与 python 模块相同的目录读取文件

macos - 无法将 iPad 应用程序转换为 Mac 应用程序 : Xcode couldn't find any Mac Catalyst App Development provisioning profiles matching 'maccatalyst.com...'

linux - 跨平台托管持续集成

python - 将一堆代码变成循环Python

python - 获取两个列表列表或空列表的交集

python - 如何使用 df.to_html 删除 "dataframe"类?

python-3.x - 使用 Tkinter 和 cx_Freeze 隐藏控制台窗口

python - Perl/Tk 的滚动伪小部件是否有 tkinter 等效项?

python - 如何改 rebase 类

macos - 重新加载 com.apple.Terminal.plist