2015-08-14 18 views
12

Sto costruendo un'applicazione che incorpora una figura matplotlib nella GUI. Il problema è che la mia app si arresta non appena aggiungo qualcosa da matplotlib nel mio codice (tranne che per le importazioni, quelli funzionano come al solito). Il problema si verifica nella mia classe Solver_App a tk.Tk.__init__(self, *args, **kwargs). Quando eseguo il codice, ottengo un errore enorme e l'app si arresta in modo anomalo. Ecco alcuni del mio codice:Matplotlib Crashing tkinter Applicazione

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() 

E qui è l'errore enorme ottengo quando si esegue il codice:

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 

Ho riferimento a codice da un tutorial [trovato qui] (http://pythonprogramming.net/how-to-embed-matplotlib-graph-tkinter-gui/ "Come per incorporare un grafico Matplotlib sulla tua GUI Tkinter "), ma il loro esempio sembra funzionare correttamente. Qual è la causa di questo problema e come può essere risolto?

  • Sto usando Python 3.4, matplotlib 1.4.3 ed eseguo Mac OS Yosemite.
+0

Mi sembra di aver omesso le parti più importanti. Vedi se riesci a distillare questo in un [MCVE] (http://stackoverflow.com/help/mcve), probabilmente ti aiuterà a risolvere il tuo problema. Un consiglio mentre lo fai: quando incorpori cose in Tkinter, non usare 'pyplot'; usa la 'figura' che hai importato. Hai saltato i posti dove potremmo vedere se lo fai o no. – Ajean

+0

Provare a fare quanto segue. 'plt.rcParams ['keymap.save'] = ''' Questo potrebbe essere il risultato del modo in cui mac ha i suoi binding chiave. L'ultima volta che ho avuto una NSException lanciata da tkinter su un Mac è dovuto al modo in cui tkinter e mac sono in conflitto con i loro binding di tasti. – Pythonista

risposta

27

È necessario impostare il backend TkAgg in modo esplicito. Potrei riprodurre il tuo bug. Con il seguente codice, il problema è risolto.

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

Si noti che l'impostazione del backend TkAgg dopo importazione pyplot non funziona neanche; si blocca anche. È necessario impostarlo prima di importare pyplot. (Testato con MPL 1.4.3, tkinter.TkVersion 8.6)

+0

Risolto per me - testato con mpl 1.5.1, tkinter.TkVersion 8.5 – theicfire

+0

Come un incantesimo! Grazie. – Rynkadink