当前位置: 首页 > 知识库问答 >
问题:

Tkinter Spinbox和多处理导致mac SEGFAULT

宗政浩慨
2023-03-14

我的应用程序在OSX上使用多处理和tkinter时出现故障。最简单的示例如下:

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失败,并显示以下报告:

进程:Python[1453]路径:

日期/时间:2016-01-18 18:33:23.281 0100操作系统版本:Mac OS X 10.11.2(15C50)报告版本:11匿名UUID:49081BD5-7C1E-52F6-E5D9-F9F41BA8DFE5

启动后的唤醒时间:6200秒

系统完整性保护:启用

崩溃的线程:0调度队列:com。苹果主Thread

异常类型:EXC\U BAD\U ACCESS(SIGSEGV)异常代码:KERN\u无效地址0x0000000110

0x110附近的VM区域:--

特定于应用程序的信息:*多线程进程分叉*在fork pre-exec的子端崩溃

线程0崩溃ed:: 调度队列:com.apple.main线程0libdispatch.dylib0x00007fff99f0fd69_dispatch_async_f_slow391

1libxpc.dylib0x00007fff8fb8daa0xpc_connection_resume192

2 com。苹果CoreFoundation 0x00007fff9bbb69d1 \u CFPrefsWithDaemonConnection 353

删除Spinbox导入(代码中未使用)使一切运行。Python 3.4.4和2.7上出现了同样的问题(将tkinter更改为Tkinter)

删除多处理模块并使所有内容都在同一个进程上运行也会使问题消失。

我的猜测是,我违反了一些Tk/Tcl约束,但我在阅读文档时没有发现任何关于这一点的内容,而且这种情况只发生在Spinbox上,而不发生在Entry或其他小部件上,这一事实令人怀疑。

共有2个答案

车嘉实
2023-03-14

当我在Windows上从IDLE编辑器运行您的代码时,没有错误,但也没有tk框,只有'

if __name__ == '__main__':
   g = Gui()
   g.start()

出现一个tk框。只有g.start()受到如此保护也是如此。在您的Mac上尝试一个或两个版本。我不知道这是否是OSX上唯一的问题,但它至少可以让您从在其他系统上运行的东西开始。

阙奇思
2023-03-14

我设法让它工作起来,出于某种原因,tkinter希望导入到执行它的同一个线程/进程中。

扩展多进程时。Proccess新进程代码在run()方法中,init在父进程上执行。因此,更改要在run方法上本地完成的所有导入可以解决问题。

示例代码如下所示:

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上运行。

 类似资料:
  • 我使用的是spring Batch4.0.0、spring Boot2.2.0、java JDK12.0.2、db sql server 2016。 null

  • 我已经在处理中编写了一个算法来执行以下操作: 由于某种原因,这个算法会立即冻结。我在里面放了打印语句,显示它甚至在试图加载图像之前就冻结了。考虑到我已经编写了另一个非常相似的算法,并且执行起来没有并发症,这让我特别困惑。另一种算法读取图像,对指定大小的每块瓷砖的颜色取平均值,然后在用平均颜色取平均值的区域上打印矩形,有效地使图像像素化。两种算法都加载图像并检查其每个像素。这个算法的主要区别在于它没

  • 我有一个文件,我需要读取,打印出整数,捕获异常并继续显示下一个整数,依此类推,直到没有更多的整数。 该文件包含:12 5 sd 67 4 cy 我想让它显示: 12 5 输入错误67 4 输入错误 但是,它只给我12,5,接着输入错误,它就停了。我尝试过将所有内容放入while循环中,但它会无休止地循环,并出现输入异常。 我错过了什么,以便循环继续读取下一个int等等?

  • 问题内容: 我正在使用Python的模块并行处理大型numpy数组。阵列在主进程中使用内存映射。之后,分叉该过程(我想)。 一切似乎都正常,除了我得到类似以下内容的行: 在单元测试日志中。尽管如此,测试仍然可以通过。 知道那里发生了什么吗? 使用Python 2.7.2,OS X,NumPy 1.6.1。 更新: 经过一些调试后,我将原因找出到使用此内存映射的numpy数组(的一小部分)作为调用输

  • 通过遍历CSVReader类,我发现了一个定义的自定义异常,该异常与我得到的异常完全相同。但我认为当在某个double qoute(CSV文件的单元格值)中发现一个双引号时,它就会出现。我将该链接称为:https://github.com/mulesoft/salesforce-connector/blob/master/src/main/java/com/sforce/async/csvread

  • 原文: Reconciliation 翻译: MrErHu(请叫我王磊同学) 邮箱: wanglei_cs@163.com React提供声明式API,因此在每次更新中你不需要关心具体的更改内容。这使得编写应用更加容易,但是这样使得你对React内部具体实现并不了解,这篇文章介绍了在React的"diffing"算法中我们所作出地决择,以使得组件的更新是可预测的并且可以适用于高性能应用。 动机 当