Matplotlib 崩溃 tkinter 应用程序

Posted

技术标签:

【中文标题】Matplotlib 崩溃 tkinter 应用程序【英文标题】:Matplotlib Crashing tkinter Application 【发布时间】:2015-11-08 06:29:03 【问题描述】:

我正在构建一个将 matplotlib 图嵌入 GUI 的应用程序。问题是,一旦我将 matplotlib 中的任何内容添加到我的代码中,我的应用程序就会崩溃(导入除外,这些都照常工作)。问题发生在我的班级Solver_Apptk.Tk.__init__(self, *args, **kwargs)。当我运行代码时,我得到了一个巨大的错误并且应用程序崩溃了。这是我的一些代码:

import tkinter as tk
from tkinter import ttk

import matplotlib
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure

# Setting up figures for integration in GUI:
fig_3D = plt.figure()
fig_2D = plt.figure()
a_3D = fig_3D.add_subplot(111, projection="3d")
a_2D = fig_2D.add_subplot(111)
a_3D.plot_wireframe([1, 2, 3, 4, 5], [1, 3, 7, 6, 4], [1, 2, 3, 4, 5], color="blue")

class Solver_App(tk.Tk, ttk.Frame):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)  # This is where the app crashes.

        # Equation frame holds everything related to the input and configuration of the equations.
        equation_frame = ttk.Frame(self)
        equation_frame.pack(side="bottom", fill="x", pady=50, padx=50)

        # More code goes here...

# There are more classes with a similar setup as the one above...

app = Solver_App()
app.mainloop()

这是我在运行代码时遇到的巨大错误:

2015-08-14 15:18:29.142 Python[50796:18837594] -[NSApplication _setup:]: unrecognized selector sent to instance 0x10216a830
2015-08-14 15:18:29.143 Python[50796:18837594] An uncaught exception was raised
2015-08-14 15:18:29.143 Python[50796:18837594] -[NSApplication _setup:]: unrecognized selector sent to instance 0x10216a830
2015-08-14 15:18:29.144 Python[50796:18837594] (
    0   CoreFoundation                      0x00007fff9901b03c __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00007fff9436476e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff9901e0ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x00007fff98f63e24 ___forwarding___ + 1028
    4   CoreFoundation                      0x00007fff98f63998 _CF_forwarding_prep_0 + 120
    5   Tk                                  0x00000001024ad527 TkpInit + 476
    6   Tk                                  0x0000000102427aca Tk_Init + 1788
    7   _tkinter.so                         0x00000001006e5f2d Tcl_AppInit + 77
    8   _tkinter.so                         0x00000001006e30d6 Tkinter_Create + 934
    9   Python                              0x00000001000e44ce PyEval_EvalFrameEx + 28894
    10  Python                              0x00000001000e5ced PyEval_EvalCodeEx + 2349
    11  Python                              0x000000010003e8ba function_call + 186
    12  Python                              0x000000010000d3c8 PyObject_Call + 104
    13  Python                              0x00000001000e0cb9 PyEval_EvalFrameEx + 14537
    14  Python                              0x00000001000e5ced PyEval_EvalCodeEx + 2349
    15  Python                              0x000000010003e8ba function_call + 186
    16  Python                              0x000000010000d3c8 PyObject_Call + 104
    17  Python                              0x000000010002802c method_call + 140
    18  Python                              0x000000010000d3c8 PyObject_Call + 104
    19  Python                              0x000000010007b831 slot_tp_init + 81
    20  Python                              0x0000000100072d14 type_call + 212
    21  Python                              0x000000010000d3c8 PyObject_Call + 104
    22  Python                              0x00000001000e1b09 PyEval_EvalFrameEx + 18201
    23  Python                              0x00000001000e5ced PyEval_EvalCodeEx + 2349
    24  Python                              0x00000001000e5daf PyEval_EvalCode + 63
    25  Python                              0x000000010011048e PyRun_FileExFlags + 206
    26  Python                              0x000000010011083d PyRun_SimpleFileExFlags + 717
    27  Python                              0x000000010012810e Py_Main + 3262
    28  Python                              0x0000000100000e32 Python + 3634
    29  Python                              0x0000000100000c84 Python + 3204
    30  ???                                 0x0000000000000002 0x0 + 2
)
2015-08-14 15:18:29.144 Python[50796:18837594] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSApplication _setup:]: unrecognized selector sent to instance 0x10216a830'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff9901b03c __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00007fff9436476e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff9901e0ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x00007fff98f63e24 ___forwarding___ + 1028
    4   CoreFoundation                      0x00007fff98f63998 _CF_forwarding_prep_0 + 120
    5   Tk                                  0x00000001024ad527 TkpInit + 476
    6   Tk                                  0x0000000102427aca Tk_Init + 1788
    7   _tkinter.so                         0x00000001006e5f2d Tcl_AppInit + 77
    8   _tkinter.so                         0x00000001006e30d6 Tkinter_Create + 934
    9   Python                              0x00000001000e44ce PyEval_EvalFrameEx + 28894
    10  Python                              0x00000001000e5ced PyEval_EvalCodeEx + 2349
    11  Python                              0x000000010003e8ba function_call + 186
    12  Python                              0x000000010000d3c8 PyObject_Call + 104
    13  Python                              0x00000001000e0cb9 PyEval_EvalFrameEx + 14537
    14  Python                              0x00000001000e5ced PyEval_EvalCodeEx + 2349
    15  Python                              0x000000010003e8ba function_call + 186
    16  Python                              0x000000010000d3c8 PyObject_Call + 104
    17  Python                              0x000000010002802c method_call + 140
    18  Python                              0x000000010000d3c8 PyObject_Call + 104
    19  Python                              0x000000010007b831 slot_tp_init + 81
    20  Python                              0x0000000100072d14 type_call + 212
    21  Python                              0x000000010000d3c8 PyObject_Call + 104
    22  Python                              0x00000001000e1b09 PyEval_EvalFrameEx + 18201
    23  Python                              0x00000001000e5ced PyEval_EvalCodeEx + 2349
    24  Python                              0x00000001000e5daf PyEval_EvalCode + 63
    25  Python                              0x000000010011048e PyRun_FileExFlags + 206
    26  Python                              0x000000010011083d PyRun_SimpleFileExFlags + 717
    27  Python                              0x000000010012810e Py_Main + 3262
    28  Python                              0x0000000100000e32 Python + 3634
    29  Python                              0x0000000100000c84 Python + 3204
    30  ???                                 0x0000000000000002 0x0 + 2
)
libc++abi.dylib: terminating with uncaught exception of type NSException

我一直在参考 [found here](http://pythonprogramming.net/how-to-embed-matplotlib-graph-tkinter-gui/"How to embed a Matplotlib graph to your Tkinter GUI") 教程中的代码,但他们的示例似乎运行良好。是什么导致了这个问题,如何解决?

我正在使用 Python 3.4、matplotlib 1.4.3 并运行 Mac OS Yosemite。

【问题讨论】:

我觉得你忽略了最重要的部分。看看你能不能把它提炼成MCVE,它可能会帮助你解决你的问题。这样做的一个提示:在 Tkinter 中嵌入内容时,不要使用pyplot;使用您导入的实际Figure。你已经跳过了我们可以看到你是否这样做的地方。 尝试执行以下操作。 plt.rcParams['keymap.save'] = '' 这可能是 mac 键绑定方式的结果。上次我在 Mac 上遇到 tkinter 抛出的 NSException 是由于 tkinter 和 mac 与其键绑定发生冲突的方式。 【参考方案1】:

您需要明确设置 TkAgg 后端。我可以重现你的错误。使用下面的代码,问题就解决了。

import matplotlib
matplotlib.use("TkAgg")
from matplotlib import pyplot as plt

请注意,设置 TkAgg 后端 导入 pyplot 之后也不起作用;它也崩溃了。您需要在导入 pyplot 之前进行设置。 (使用 MPL 1.4.3、tkinter.TkVersion 8.6 测试)

【讨论】:

为我修复 - 使用 mpl 1.5.1、tkinter.TkVersion 8.5 测试 为什么这是必要的?为什么这个问题在 3 年后仍然存在?似乎是 matplotlib 在内部处理的一个非常简单的修复。 不适用于 matplotlib 3.0.3。必须使用 qt5 而不是 tk。 适用于我的 MacBook Pro 上的 Python 3.7、matplotlib 3.0.2、tk 8.6.8。非常感谢! 试过了,我的 Mac 崩溃了……“HIToolbox:收到 WindowServer 事件端口死亡的通知。” MacOS 10.14.6、Python 3.7.3【参考方案2】:

如果您不想编辑代码,可以使用设置matplotlib正在读取的以下环境变量:

MPLBACKEND=TkAgg

这样,无论你什么时候导入pyplot,它都可以工作

【讨论】:

【参考方案3】:

@DonCristobal 的回答对我有帮助,因此我尝试对其进行投票或添加评论,但 *** 阻止我做任何事情,因为我必须达到某些点才能发表评论或投票。 @DonCristobal 建议的解决方案适用于我下面给出的配置:

Mac catalina, python 3.6 & matplotlib 3.0.3

这就是我所做的 -

修改

import matplotlib.pyplot as plt

import matplotlib

matplotlib.use("TkAgg")

from matplotlib import pyplot as plt

【讨论】:

【参考方案4】:

我仍然因此而崩溃:

import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

f = plt.figure()
plt.plot(x, y)
f.show()
plt.pause(0.0001)

出现带有 sin 的窗口,然后内核冻结。 带有 Anaconda3 的 Windows 10

【讨论】:

【参考方案5】:

一旦我更新到最新的 Python 环境 (3.8.2),这个错误就消失了,无需使用 matplotlib.use("TkAgg")。

【讨论】:

以上是关于Matplotlib 崩溃 tkinter 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

将matplotlib嵌入到tkinter应用程序中

深入浅出matplotlib(79):在tkinter应用程序里嵌入matplotlib绘图

如何在 tkinter 中更新由 matplotlib 创建的图形

导入 matplotlib 失败,在 heroku 上没有名为 _tkinter 的模块

tkinter 与 matplotlib

matplotlib 在 tkinter 画布中的缩放功能