我正在构建一个将matplotlib图形嵌入GUI的应用程序。问题是,只要我从matplotlib向代码中添加任何内容(除了导入,这些内容照常工作),我的应用程序就会崩溃。问题发生在我的类Solver_App
中的tk.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
我一直在参考教程中的代码[在这里找到](http://pythonprogramming.net/how-to-embed-matplotlib-graph-tkinter-gui/“如何将Matplotlib图形嵌入到您的Tkinter GUI中”),但他们的示例似乎工作正常。是什么导致了这个问题,如何修复它?
- 我使用的是Python 3.4和matplotlib 1.4.3,运行的是Mac OS约塞米蒂。
7条答案
按热度按时间rjjhvcjd1#
你需要显式地设置
TkAgg
后端。我可以重现你的bug。用下面的代码,问题就解决了。请注意,在导入
pyplot
* 之后 * 设置TkAgg
后端也不起作用;它也崩溃了。你需要在导入pyplot
之前设置它。(用MPL 1.4.3,tkinter.TkVersion 8.6测试)hgc7kmma2#
如果不想编辑代码,可以使用设置
matplotlib
正在阅读的以下环境变量:这样,无论何时导入
pyplot
,它都将工作1qczuiv03#
导入matplotlib.pyplot后,设置以下内容:
这将避免在绘图中断时造成混乱。这对我很有效。
uajslkp64#
导入matplotlib.pyplot后,设置以下内容:
这样可以避免绘图中断时产生混乱。但只能使用“软”退出,即使用代码(键盘/鼠标事件等)。如果通过单击“退出”按钮(“X”)关闭图形(窗口),则不能解决“混乱”问题。(这仍有待解决...我还没有!)
示例:
在动画播放过程中,按下任意键都将使其平滑停止。
bq8i3lrv5#
@DonCristobal的回答帮助了我,因此我试图向上投票或添加评论,但stackoverflow阻止我这样做,引用某些点,我必须达到之前,我可以评论或向上投票。@DonCristobal建议的解决方案工作,我的配置如下:
Mac catalina, python 3.6 & matplotlib 3.0.3
我是这样做的-
已修改
至
1szpjjfi6#
我仍然遇到以下崩溃:
出现带有sin的窗口,然后内核冻结。Windows 10 with Anaconda3
kqqjbcuj7#
一旦我更新到最新的Python环境(3.8.2),这个错误就消失了,不需要使用matplotlib.use(“TkAgg”)。