o
    j%                     @   s  d dl Z d dlZd dlmZ d dlZd dlZd dlZd dlZd dl	Z	d dl
Zd dlZ
d dlZ
d dlZ
d dlmZ d dlZd dlmZmZ d dlZd dlmZmZmZmZ d dlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,Z, zdd	l-m.Z. dd
l.m/Z/m0Z0 W n> e1y Z2 z2e3e2ddZ4e3e4ddZ5e6e4e1re6e5e7rde8e5v rdej9:e	j;v Z<e<re1de2e1de2 dZ2[2ww e=e>Z?e#j@de#jAde#jBde#jCde#jDde#jEde#jFdiZGedd ZHi ZIde J jK ZLdd ZMd4ddZNG dd de!ZOG d d! d!eZPG d"d# d#eZQG d$d% d%e ejRZSd&d' ZTeUePG d(d) d)ejVZWG d*d+ d+e"ejRZXeUePG d,d- d-ejYZZeUePG d.d/ d/ej[Z\eUePG d0d1 d1ej]Z^eXZ_eSeQ_`eXeQ_aejbG d2d3 d3eZcdS )5    N)contextmanager)SimpleDialog)ImageImageTk)_apibackend_toolscbook_c_internal_utils)_BackendFigureCanvasBaseFigureManagerBaseNavigationToolbar2	TimerBaseToolContainerBasecursors_ModeMouseButton
CloseEventKeyEventLocationEvent
MouseEventResizeEvent)Gcf   )_tkagg)TK_PHOTO_COMPOSITE_OVERLAYTK_PHOTO_COMPOSITE_SET	__cause__z&'_tkinter' has no attribute '__file__'z
/uv/pythonzFailed to import tkagg backend. You appear to be using an outdated version of uv's managed Python distribution which is not compatible with Tk. Please upgrade to the latest uv version, then update Python with: `uv python upgrade --reinstall`a  Failed to import tkagg backend. This is likely caused by using a Python executable based on python-build-standalone, which is not compatible with Tk. Recent versions of python-build-standalone should be compatible with Tk. Please update your python version or select another backend.ZfleurZhand2arrowZ	crosshairwatchZsb_h_double_arrowZsb_v_double_arrowc               	   c   sV    t  } zd V  W | rtjd rt |  d S d S d S | r)tjd r*t |  w w w )Nztk.window_focus)r	   ZWin32_GetForegroundWindowmplrcParamsZWin32_SetForegroundWindow)
foreground r#   `/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/matplotlib/backends/_backend_tk.py!_restore_foreground_window_at_endE   s   r%   Z	mpl_blit_c                 C   sJ   t | \}}}}}|jdd|sdS t|j t||||| dS )z
    Thin wrapper to blit called via tkapp.call.

    *argsid* is a unique string identifier to fetch the correct arguments from
    the ``_blit_args`` dict, since arguments cannot be passed directly.
    infocommandsN)
_blit_argspoptkcallr   blit
interpaddrstr)argsid
photoimagedataoffsetsbbox	comp_ruler#   r#   r$   _blitT   s   r5   c              
   C   s8  t |}|jdd \}}|durO| \\}}\}	}
tt|d}tt|	|}	tt|d}tt|
|}
||	ksD||
krFdS ||	||
f}t	}nd|d|f}t
}| ||||f}tt|}|t|< z
| jt| W dS  tjy } zdt|vr | jtt | jt| W Y d}~dS d}~ww )a  
    Blit *aggimage* to *photoimage*.

    *offsets* is a tuple describing how to fill the ``offset`` field of the
    ``Tk_PhotoImageBlock`` struct: it should be (0, 1, 2, 3) for RGBA8888 data,
    (2, 1, 0, 3) for little-endian ARBG32 (i.e. GBRA8888) data and (1, 2, 3, 0)
    for big-endian ARGB32 (i.e. ARGB8888) data.

    If *bbox* is passed, it defines the region that gets blitted. That region
    will be composed with the previous data according to the alpha channel.
    Blitting will be clipped to pixels inside the canvas, including silently
    doing nothing if the *bbox* region is entirely outside the canvas.

    Tcl events must be dispatched to trigger a blit from a non-Tcl thread.
    N   r   zinvalid command name)npasarrayshapeZ	__array__maxmathfloorminceilr   r   r.   idr(   r*   r+   _blit_tcl_nameTclErrorZcreatecommandr5   )r0   Zaggimager2   r3   r1   heightwidthx1y1Zx2y2Zbboxptrr4   argsr/   er#   r#   r$   r,   b   s4   
	r,   c                       s<   e Zd ZdZ fddZdd Zdd Z fdd	Z  ZS )
TimerTkz<Subclass of `backend_bases.TimerBase` using Tk timer events.c                    s"   d | _ t j|i | || _d S N)_timersuper__init__parent)selfrN   rG   kwargs	__class__r#   r$   rM      s   
zTimerTk.__init__c                 C   s    |    | j| j| j| _d S rJ   )_timer_stoprN   after	_interval	_on_timerrK   rO   r#   r#   r$   _timer_start   s   zTimerTk._timer_startc                 C   s"   | j d ur| j| j  d | _ d S rJ   )rK   rN   after_cancelrW   r#   r#   r$   rS      s   

zTimerTk._timer_stopc                    s\   t     js) jr) jdkr j j j _d S  j fdd _d S d  _d S )Nr   c                      s    j  j jS rJ   )rN   rT   rU   rV   r#   rW   r#   r$   <lambda>   s    z#TimerTk._on_timer.<locals>.<lambda>)rL   rV   Z_singlerK   rU   rN   rT   
after_idlerW   rQ   rW   r$   rV      s   




zTimerTk._on_timer)	__name__
__module____qualname____doc__rM   rX   rS   rV   __classcell__r#   r#   rQ   r$   rI      s    rI   c                       s   e Zd ZdZedd Zd8 fdd	Zd9ddZd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd Zd:ddZdd Zdd Zdd Zd d! Zed"d# Zedd$d%d&Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd;d2d3Zd4d5 Zd6d7 Z  Z S )<FigureCanvasTkr*   c                 C   s   t S rJ   )FigureManagerTk)clsr#   r#   r$   rZ      s    zFigureCanvasTk.<lambda>Nc           	         s  t  | d | _d | _| jdd\}}tj|d||ddd| _tj| j||d| _	| jj
|d |d | j	d| _| jd	| j | jd
| j | jd| j | jd| j | jd| j | jd| j | jd| j dD ]
}| j|| j qsdD ]
}| j|| j qdD ]
}| j|| j qdD ]
}| j|| j q| j }t| t|fdd}|d|d fdd}|d|d | j  d | _d | _d S )NTZphysicalwhiter   )master
backgroundrC   rB   borderwidthZhighlightthickness)rf   rC   rB   r6   imagez<Configure>z<Map>z<Key>z<Motion><Enter><Leave>z<KeyRelease>)z
<Button-1>z
<Button-2>z
<Button-3>)z<Double-Button-1>z<Double-Button-2>z<Double-Button-3>)z<ButtonRelease-1>z<ButtonRelease-2>z<ButtonRelease-3>)z
<Button-4>z
<Button-5>c                    s6    }|d u r }|d ur| d  d S || S )N<MouseWheel>)unbindscroll_event_windowseventrO   root)scroll_event_windows_idweakrootweakselfr#   r$   ro      s   
z5FigureCanvasTk.__init__.<locals>.scroll_event_windowsrm   +c                    sN    }|d u r }|d ur| d  d S | j|ju r%td|  d S d S )N	<Destroy>Zclose_event)rn   widget	_tkcanvasr   _processrp   )filter_destroy_idrt   ru   r#   r$   filter_destroy   s   z/FigureCanvasTk.__init__.<locals>.filter_destroyrw   )rL   rM   _idle_draw_id_event_loop_idget_width_heightr*   ZCanvasry   
PhotoImage_tkphotocreate_image_tkcanvas_image_regionbindresize_update_device_pixel_ratio	key_pressmotion_notify_evententer_notify_eventleave_notify_eventkey_releasebutton_press_eventbutton_dblclick_eventbutton_release_eventscroll_eventZwinfo_toplevelweakrefref	focus_set_rubberband_rect_black_rubberband_rect_white)	rO   figurerf   whnamerr   ro   r|   rQ   )r{   rs   rt   ru   r$   rM      sN   


	

zFigureCanvasTk.__init__c                 C   s   d }t jdkrt| jjddd d}nt jdkr"| jdd }|d ur=| |r?| jd	d
\}}| jj	||d d S d S d S )Nwin32r*   scalinggUUUUUU?r6   linuxZ1i`   Trd   rC   rB   )
sysplatformroundry   r*   r+   Zwinfo_fpixelsZ_set_device_pixel_ratior   	configure)rO   rq   ratior   r   r#   r#   r$   r     s   

z)FigureCanvasTk._update_device_pixel_ratioc                 C   s   |j |j}}| jj}|| }|| }| jj||dd | j| j | jj	t
|t
|d | jjt
|d t
|d | jd| _td|   |   d S )NF)forwardr   r6   ri   Zresize_event)rC   rB   r   ZdpiZset_size_inchesry   deleter   r   r   intr   r   rz   	draw_idle)rO   rq   rC   rB   ZdpivalZwinchZhinchr#   r#   r$   r     s   zFigureCanvasTk.resizec                    s(    j rd S  fdd} j| _ d S )Nc                     s   z
    W d  _d S d  _w rJ   )Zdrawr}   rG   rW   r#   r$   	idle_draw,  s   
z+FigureCanvasTk.draw_idle.<locals>.idle_draw)r}   ry   r[   )rO   r   r#   rW   r$   r   '  s   zFigureCanvasTk.draw_idlec                 C   s   | j S )z
        Return the Tk widget used to implement FigureCanvasTkAgg.

        Although the initial implementation uses a Tk canvas,  this routine
        is intended to hide that fact.
        )ry   rW   r#   r#   r$   get_tk_widget4  s   zFigureCanvasTk.get_tk_widgetc                 C   s&   | j |j| jjj| j |j fS rJ   )ry   canvasxxr   r3   rB   canvasyyrO   rq   r#   r#   r$   _event_mpl_coords=  s   z FigureCanvasTk._event_mpl_coordsc                 C   s6   t d| g| |R | || ||d  d S )Nr   )buttons	modifiersguiEvent)r   r   _mpl_buttons_mpl_modifiersrz   r   r#   r#   r$   r   D  s   
z"FigureCanvasTk.motion_notify_eventc                 C   .   t d| g| |R | ||d  d S )NZfigure_enter_eventr   r   r   r   r   rz   r   r#   r#   r$   r   K     
z!FigureCanvasTk.enter_notify_eventc                 C   r   )NZfigure_leave_eventr   r   r   r#   r#   r$   r   Q  r   z!FigureCanvasTk.leave_notify_eventFc                 C   sf   | j   t|dd }tjdkrddd||}td| g| ||R || ||d	  d S )Nnumdarwin   r6   r6   r   r   )dblclickr   r   )
ry   r   getattrr   r   getr   r   r   rz   )rO   rq   r   r   r#   r#   r$   r   W  s   


z!FigureCanvasTk.button_press_eventc                 C   s   | j |dd d S )NT)r   )r   r   r#   r#   r$   r   c  s   z$FigureCanvasTk.button_dblclick_eventc                 C   sZ   t |dd }tjdkrddd||}td| g| ||R | ||d  d S )Nr   r   r   r6   r   r   r   )r   r   r   r   r   r   r   rz   )rO   rq   r   r#   r#   r$   r   f  s   

z#FigureCanvasTk.button_release_eventc                 C   sX   t |dd }|dkrdn|dkrdnd}td| g| |R || ||d  d S )	Nr      r      r   r   stepr   r   )r   r   r   r   rz   )rO   rq   r   r   r#   r#   r$   r   o  s   
zFigureCanvasTk.scroll_eventc              	   C   s   |j |j|j}|| jkrdS | j|j|  }| jjj	| j
|j|   }|jd }td| |||| ||d  dS )zMouseWheel event processorNx   r   r   )rx   Zwinfo_containingZx_rootZy_rootry   r   winfo_rootxr   r3   rB   r   winfo_rootydeltar   r   rz   )rO   rq   r   r   r   r   r#   r#   r$   ro   w  s   


z#FigureCanvasTk.scroll_event_windowsc                    st   t jdkrtjdftjdftjdftjdftjdfgntjdftjdftjdftjdftjdfg} fdd|D S )	Nr      i   i   i   i   c                    s   g | ]\}} j |@ r|qS r#   state).0r   maskrq   r#   r$   
<listcomp>  s    z/FigureCanvasTk._mpl_buttons.<locals>.<listcomp>)r   r   r   LEFTRIGHTZMIDDLEZBACKZFORWARD)rq   r   r#   r   r$   r     s   
	zFigureCanvasTk._mpl_buttonsexcludec                   s@   t jdkr	g dnt jdkrg dng d} fdd|D S )Nr   )Zctrlr   control)alti   r   shiftr   r   r   )r   )r      r   r   )cmd   r   )r   )r   r   r   r   )rL   @   rL   c                    s(   g | ]\}}} j |@ r|kr|qS r#   r   )r   r   r   keyrq   r   r#   r$   r     s    z1FigureCanvasTk._mpl_modifiers.<locals>.<listcomp>)r   r   )rq   r   r   r#   r   r$   r     s   

	zFigureCanvasTk._mpl_modifiersc                 C   sV   |j }t||j}|d ur)| j||d}d|v r |r |d dg ||S d S )Nr   r   rv   )charr   Z_unikey_or_keysym_to_mplkeyZkeysymr   removejoin)rO   rq   Zunikeyr   modsr#   r#   r$   _get_key  s   
zFigureCanvasTk._get_keyc                 C   .   t d| | |g| |R d|i  d S )NZkey_press_eventr   r   r   r   rz   r   r#   r#   r$   r        
zFigureCanvasTk.key_pressc                 C   r   )NZkey_release_eventr   r   r   r#   r#   r$   r     r   zFigureCanvasTk.key_releasec                 O   s   t | jg|R i |S rJ   )rI   ry   )rO   rG   rP   r#   r#   r$   	new_timer  s   zFigureCanvasTk.new_timerc                 C   s   | j   d S rJ   )ry   updaterW   r#   r#   r$   flush_events  s   zFigureCanvasTk.flush_eventsr   c                 C   sN   |dkr t d| }|dkr| j|| j| _n| j| j| _| j  d S )Nr   i  )r   ry   rT   stop_event_loopr~   r[   mainloop)rO   timeoutZmillisecondsr#   r#   r$   start_event_loop  s   zFigureCanvasTk.start_event_loopc                 C   s(   | j r| j| j  d | _ | j  d S rJ   )r~   ry   rY   quitrW   r#   r#   r$   r     s   zFigureCanvasTk.stop_event_loopc                 C   s0   z| j jt| d W d S  tjy   Y d S w )N)cursor)ry   r   cursordtkinterrA   )rO   r   r#   r#   r$   
set_cursor  s
   zFigureCanvasTk.set_cursor)NNrJ   )F)r   )!r\   r]   r^   Zrequired_interactive_frameworkr   Zclasspropertymanager_classrM   r   r   r   r   r   r   r   r   r   r   r   r   ro   staticmethodr   r   r   r   r   r   r   r   r   r   r`   r#   r#   rQ   r$   ra      s:    
E	
	


ra   c                       st   e Zd ZdZdZ fddZedd Zedd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd Z  ZS )rb   z
    Attributes
    ----------
    canvas : `FigureCanvas`
        The FigureCanvas instance
    num : int or str
        The Figure number
    toolbar : tk.Toolbar
        The tk.Toolbar
    window : tk.Window
        The tk.Window
    Fc                    s   || _ t || | j   | jjjtjtj	dd t
| d}tj|dd| d| _d| _t||j rC| jd| j| _d	| _d S )
Nr   )sidefillexpandr   r   Z
window_dpi)rf   valuer    writeF)windowrL   rM   withdrawcanvasry   packr*   TOPZBOTHr   Zwm_frameIntVar_window_dpi_window_dpi_cbnamer   Zenable_dpi_awarenessr-   Z	trace_add_update_window_dpi_shown)rO   r   r   r   Zwindow_framerQ   r#   r$   rM     s   

zFigureManagerTk.__init__c                 C   s   t  ] t d u rt  t  tjdd}|  t	t
d}tj||d}t	t
d}tj||d}|d|| |||d}	| |	||}
t rW|
  |	  |
W  d    S 1 scw   Y  d S )N
matplotlib)Z	classNamezimages/matplotlib.png)filerf   zimages/matplotlib_large.pngFrf   )r%   r   "_get_running_interactive_frameworkZ_setup_new_guiappr	   Z Win32_SetProcessDpiAwareness_maxr*   ZTkr   r.   _get_data_pathr   r   Z	iconphotor    is_interactiveshowr   )rc   Zcanvas_classr   r   r   Z
icon_fnameZicon_imgZicon_fname_largeZicon_img_larger   managerr#   r#   r$   create_with_canvas  s0   $z"FigureManagerTk.create_with_canvasc                 C   sP   t  }|r&|d }t|}|jrd S d|_z|j  W d|_d S d|_w d S )Nr   TF)r   Zget_all_fig_managerstype_owns_mainloopr   r   )rc   ZmanagersZfirst_managerr   r#   r#   r$   start_main_loop2  s   zFigureManagerTk.start_main_loopc                 G   sH   | j  }| jdd|d  | jrt| jdr| j  | j  d S )Nr*   r   H   _rescale)	r  r   r   r+   Ztoolbarhasattrr  r   r   )rO   rG   Znewdpir#   r#   r$   r  @  s
   

z"FigureManagerTk._update_window_dpic                 C   sP   d}||ks
||krt jdkrtd| d| d| d| jjj||d d S )Ni\ r   z/You have requested to resize the Tk window to (z, z), one of which is bigger than z.  At larger sizes xorg will either exit with an error on newer versions (~1.20) or cause corruption on older version (~1.19).  We do not expect a window over a million pixel wide or tall to be intended behavior.r   )r   r   
ValueErrorr   ry   r   )rO   rC   rB   max_sizer#   r#   r$   r   G  s   zFigureManagerTk.resizec                    s   t  D  js  fdd} jd|  j   jj  n j  t	j
d r< jjjdd  jjjdd d _W d    d S 1 sJw   Y  d S )	Nc                     s   t   d S rJ   )r   destroyr   rW   r#   r$   r  X     z%FigureManagerTk.show.<locals>.destroyZWM_DELETE_WINDOWzfigure.raise_windowz-topmostr   r   T)r%   r  r   protocolZ	deiconifyr   ry   r   r   r    r!   r  
attributes)rO   r  r#   rW   r$   r  U  s   


"zFigureManagerTk.showc                    s    j jr j j j j  j jr j j j j  jr% jd j  fdd}t	 dkr= j
 j
jd| d S  j
  |  d S )Nr   c                      s.    j    jrt s j   d S d S d S rJ   )r   r  r  r   Zget_num_fig_managersr   r#   rW   r#   r$   delayed_destroyq  s   
z0FigureManagerTk.destroy.<locals>.delayed_destroyr*   r   )r   r}   ry   rY   r~   r  r  Ztrace_remover   r  r   r[   rT   r   )rO   rG   r  r#   rW   r$   r  d  s   

zFigureManagerTk.destroyc                 C   s
   | j  S rJ   r   Zwm_titlerW   r#   r#   r$   get_window_title~     
z FigureManagerTk.get_window_titlec                 C      | j | d S rJ   r  )rO   titler#   r#   r$   set_window_title     z FigureManagerTk.set_window_titlec                 C   s$   t | jd}| jd|  d S )Nz-fullscreen)boolr   r  )rO   Zis_fullscreenr#   r#   r$   full_screen_toggle  s   z"FigureManagerTk.full_screen_toggle)r\   r]   r^   r_   r  rM   classmethodr  r  r  r   r  r  r  r   r#  r`   r#   r#   rQ   r$   rb     s    
!
rb   c                       s   e Zd ZdddddZdd Zdd	 Z fd
dZ fddZdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Z  ZS )NavigationToolbar2TkNT)pack_toolbarc          
   	   C   s<  |du r	|  j}tjj| |dt|jjjdd i | _	| j
D ]4\}}}}|du r.|   q| j|ttd| d|dv t| |d | j	|< }|durSt|| qtjj|d	d
| _tj| | jdd}	|	jtjd tj| d| _tj| | j| jtjd| _| jjtjd t| | |r| jtjtjd dS dS )a  
        Parameters
        ----------
        canvas : `FigureCanvas`
            The figure canvas on which to operate.
        window : tk.Window
            The tk.Window which owns this toolbar.
        pack_toolbar : bool, default: True
            If True, add the toolbar to the parent's pack manager's packing
            list during initialization with ``side="bottom"`` and ``fill="x"``.
            If you want to use the toolbar with a different layout manager, use
            ``pack_toolbar=False``.
        Nr6   2   )rf   rh   rC   rB   zimages/.png)zoompan)togglecommand
   )rr   size    
 rf   fonttextr   r  )rf   r1  textvariablejustifyr   r   )r   rf   r*   FramerM   r   r   r3   rC   _buttonsZ	toolitems_Spacer_Buttonr.   r   r	  r   add_tooltipr   r1  Font_label_fontLabelr   r   	StringVarmessage_message_labelr   ZBOTTOMX)
rO   r   r   r&  r2  Ztooltip_text
image_filecallbackbuttonlabelr#   r#   r$   rM     sB   




zNavigationToolbar2Tk.__init__c                 C   s   |   D ]:}t|tjtjfrt|drt| | q	 qt|tjr0|j	dd |j
dd qt|tjr7qtd|j q| jj	dd d	S )
a  
        Scale all children of the toolbar to current DPI setting.

        Before this is called, the Tk scaling setting will have been updated to
        match the new DPI. Tk widgets do not update for changes to scaling, but
        all measurements made after the change will match the new scaling. Thus
        this function re-applies all the same sizes in points, which Tk will
        scale correctly to pixels.
        _image_file18p)rB   3p)padxzUnknown child class %sr-  r.  N)Zwinfo_children
isinstancer*   ButtonCheckbuttonr  r%  _set_image_for_buttonr7  r   pack_configurer>  _logwarningZwinfo_classr=  )rO   rx   r#   r#   r$   r    s   

zNavigationToolbar2Tk._rescalec                 C   sT   dt jfdt jffD ]\}}|| jv r'| j|kr | j|   q
| j|   q
d S )NZZoomPan)r   ZZOOMZPANr8  modeselectdeselect)rO   r2  rT  r#   r#   r$   _update_buttons_checked  s   

z,NavigationToolbar2Tk._update_buttons_checkedc                       t  j|  |   d S rJ   )rL   r*  rW  rO   rG   rQ   r#   r$   r*       zNavigationToolbar2Tk.panc                    rX  rJ   )rL   r)  rW  rY  rQ   r#   r$   r)    rZ  zNavigationToolbar2Tk.zoomc                 C   r  rJ   )r@  setrO   sr#   r#   r$   set_message  r!  z NavigationToolbar2Tk.set_messagec                 C   s   | j jr| j j| j j | j jr| j j| j j | j jjj}|| }|| }| j j||||| j _| j jj||||ddd| j _d S )Nre   )r   r   )outlinedash)	r   r   ry   r   r   r   r3   rB   Zcreate_rectangle)rO   rq   x0y0rD   rE   rB   r#   r#   r$   draw_rubberband  s   
z$NavigationToolbar2Tk.draw_rubberbandc                 C   sL   | j jr| j j| j j d | j _| j jr$| j j| j j d | j _d S d S rJ   )r   r   ry   r   r   rW   r#   r#   r$   remove_rubberband   s   z&NavigationToolbar2Tk.remove_rubberbandc              	      s  j du rdS tdj }||jdd}d}fdd  fdd	}d
d }t|dkr9|	 r9|n|=}|
d}tj|||f| d}|_dtd }	|||	}
tj|
||f| d}|_W d   n1 s|w   Y  |drd|i}nd|i}ttjrψddkr| jdkrd}n d\}}} d\}}}|| d || d || d f}||r||d< n||d< jdi |ddd dS )z
        Set the image for a button based on its pixel size.

        The pixel size is determined by the DPI scaling of the window.
        NZimagesr(  z
_large.pngrH  c                    s      | S rJ   )	winfo_rgbcget)Z
color_name)rE  r#   r$   
_get_color  s   z>NavigationToolbar2Tk._set_image_for_button.<locals>._get_colorc                    s   t | tr	 | } t| dk S )Ng    @)rL  r.   r:   )color)rg  r#   r$   _is_dark  s   
z<NavigationToolbar2Tk._set_image_for_button.<locals>._is_darkc                 S   sD   t |  }|dd df dkjdd}|||d df< t|S )N.r   r   r   )Zaxis)r7   r8   copyallr   Z	fromarray)rj   rh  Z
image_dataZ
black_maskr#   r#   r$   _recolor_icon"  s   
zANavigationToolbar2Tk._set_image_for_button.<locals>._recolor_icon   ZRGBAr  g o?r"   rg   rj   selectcolorr   Zx11Zactivebackgroundr6   Zselectimage)rB   rC   r#   )rG  r   r	  	with_namer   replaceZwinfo_pixelsr   openexistsconvertr   r   r   Z_ntimager7   arrayre  rf  Z_ntimage_altrL  r*   rN  Z_windowingsystemr   )rO   rE  Zpath_regularZ
path_larger.  ri  rl  Zimrj   r"   Zim_altZ	image_altZimage_kwargsrn  r1g1b1r2g2b2r#   )rg  rE  r$   rO    sR   






"
z*NavigationToolbar2Tk._set_image_for_buttonc              
   C   s   |st j| ||dddd}nt j| d}t j| ||d|dddd}||_||_|d ur2t| | n|j| j	d |j
t jd	 |S )
NZflatZgroover   )rf   r2  r,  relief
overreliefrh   r  F)rf   r2  r,  ZindicatoronvariableZ	offreliefr|  rh   )r1  r3  )r*   rM  r   rN  varrG  r%  rO  r   r=  r   r   )rO   r2  rC  r+  r,  br~  r#   r#   r$   r:  W  s$   
zNavigationToolbar2Tk._Buttonc                 C   s(   t j| dt jdd}|jt jdd |S )NrH  ZDarkGray)rf   rB   r{  bgrI  )r   rJ  )r*   r7  ZRIDGEr   r   r\  r#   r#   r$   r9  s  s   zNavigationToolbar2Tk._Spacerc              
   G   s>  | j  }dd t| D }| j  }| j  | }t| j  |}d}t	j
tjd }t| j  j}	tjj| j  jd||||	|d}
|
dv rPd S |dkr_t	j
t|
tjd< t|
jdd  dkrnd }n||  d	 }z| j jj|
|d
 |
W S  ty } ztjdt| W Y d }~d S d }~ww )Nc                 S   s(   g | ]\}}|d  dd |D fqS ) c                 s   s    | ]}d | V  qdS )z*.Nr#   )r   extr#   r#   r$   	<genexpr>|  s    z>NavigationToolbar2Tk.save_figure.<locals>.<listcomp>.<genexpr>)r   )r   r   extsr#   r#   r$   r   {  s    z4NavigationToolbar2Tk.save_figure.<locals>.<listcomp>r   zsavefig.directoryzSave the figure)rf   r  	filetypesdefaultextension
initialdirinitialfileZtypevariable)r   r#   r   r   )formatzError saving file)r   Zget_supported_filetypes_groupedsorteditemsZget_default_filetypeZget_supported_filetypesr*   r?  r   ospath
expanduserr    r!   pathlibPathZget_default_filenamestemr   Z
filedialogZasksaveasfilenamerf   dirnamer.   suffixr   r   Zsavefig	ExceptionZ
messageboxZ	showerror)rO   rG   r  Ztk_filetypesZdefault_extensionZdefault_filetypeZfiletype_variabler  r  r  fname	extensionrH   r#   r#   r$   save_figurey  sD   




 z NavigationToolbar2Tk.save_figurec                 C   sp   t jt jd}| jjdk}| jjt| jd k }d| jv r&|| | jd d< d| jv r6|| | jd d< d S d S )N)TFr   r   ZBackr   ZForward)r*   ZNORMALZDISABLEDZ
_nav_stack_poslenr8  )rO   Z	state_mapZcan_backZcan_forwardr#   r#   r$   set_history_buttons  s   

z(NavigationToolbar2Tk.set_history_buttonsrJ   )r\   r]   r^   rM   r  rW  r*  r)  r^  rc  rd  rO  r:  r9  r  r  r`   r#   r#   rQ   r$   r%    s    7	O4r%  c                    s<   d  fdd}fdd} d|  d| d S )Nc                    s   s sdS  d\}}}}|    }|  }td d| d|  zjddj	dd W n
 tj
yK   Y nw tj tjtjdd	}|jdd
 dS )zDisplay text in tooltip window.Ninsertr   rv   z!::tk::unsupported::MacWindowStylestylehelpZnoActivates)r2  r5  r{  rh   )Zipadx)r3   r   Zwinfo_widthr   r*   ZToplevelZoverrideredirectZgeometryr+   _wrA   r>  r   ZSOLIDr   )rq   r   r   _rF  r2  	tipwindowrx   r#   r$   showtip  s(   

zadd_tooltip.<locals>.showtipc                    s    r    d  d S rJ   )r  r   )r  r#   r$   hidetip  s   zadd_tooltip.<locals>.hidetiprk   rl   )r   )rx   r2  r  r  r#   r  r$   r;    s
   r;  c                   @   s   e Zd Zdd Zdd ZdS )RubberbandTkc                 C   s   t |  d |||| d S rJ   )r%  rc  "_make_classic_style_pseudo_toolbar)rO   ra  rb  rD   rE   r#   r#   r$   rc    s   zRubberbandTk.draw_rubberbandc                 C      t |   d S rJ   )r%  rd  r  rW   r#   r#   r$   rd       zRubberbandTk.remove_rubberbandN)r\   r]   r^   rc  rd  r#   r#   r#   r$   r    s    r  c                   @   sV   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd ZdS )	ToolbarTkNc                 C   s   t | | |d u r| jj j}| jjjjj\}}d|| }}t	j
j| |t|t|dd tjjdd| _t	j| | jdd}|jt	jd t	j| d	| _t	j| | j| jd
| _| jjt	jd i | _| jt	jt	jd i | _d S )Nr'  r6   )rf   rC   rB   rh   r-  rK  r/  r0  r3  r  )rf   r1  r4  r6  )r   rM   toolmanagerr   r   rf   r   r3   Z	intervalxr*   r7  r   r   r1  r<  r=  r>  r   r   r?  _messagerA  
_toolitemsr   rB  _groups)rO   r  r   ZxminZxmaxrB   rC   rF  r#   r#   r$   rM     s,   



zToolbarTk.__init__c                 C   
   t | S rJ   )r%  r  rW   r#   r#   r$   r    r  zToolbarTk._rescalec              	      s    |}| }|t|ks|dk rd }	n|| }	t| || fdd}
|
j|	d |d ur7t|
| j g  j  	|
 d S )Nr   c                      s
     S rJ   )_button_clickr#   r   rO   r#   r$   rZ   
  s   
 z(ToolbarTk.add_toolitem.<locals>.<lambda>)before)
_get_groupframeZpack_slavesr  r%  r:  rP  r;  r  
setdefaultappend)rO   r   grouppositionrC  descriptionr+  framer   r  rE  r#   r  r$   add_toolitem  s   

zToolbarTk.add_toolitemc                 C   sT   || j vr%| j r|   tj| dd}|jtjtjd | j|_|| j |< | j | S )Nr   )rf   rh   r6  )r  _add_separatorr*   r7  r   r   Yr=  )rO   r  r  r#   r#   r$   r    s   


zToolbarTk._get_groupframec                 C   r  rJ   )r%  r9  rW   r#   r#   r$   r    r  zToolbarTk._add_separatorc                 C   s   |  | d S rJ   )Ztrigger_tool)rO   r   r#   r#   r$   r    r  zToolbarTk._button_clickc                 C   s8   || j vrd S | j | D ]}|r|  q|  qd S rJ   )r  rU  rV  )rO   r   Ztoggledtoolitemr#   r#   r$   toggle_toolitem!  s   


zToolbarTk.toggle_toolitemc                 C   s    | j |g D ]}|  qd S rJ   )r  r)   Zpack_forget)rO   r   r  r#   r#   r$   remove_toolitem*  s   
zToolbarTk.remove_toolitemc                 C   r  rJ   )r  r[  r\  r#   r#   r$   r^  .  r!  zToolbarTk.set_messagerJ   )r\   r]   r^   rM   r  r  r  r  r  r  r  r^  r#   r#   r#   r$   r    s    

	r  c                   @      e Zd Zdd ZdS )SaveFigureTkc                 G   r  rJ   )r%  r  r  rY  r#   r#   r$   trigger4  r  zSaveFigureTk.triggerNr\   r]   r^   r  r#   r#   r#   r$   r  2      r  c                   @   r  )ConfigureSubplotsTkc                 G   s   t |  d S rJ   )r%  Zconfigure_subplotsrY  r#   r#   r$   r  ;  r  zConfigureSubplotsTk.triggerNr  r#   r#   r#   r$   r  9  r  r  c                   @   r  )HelpTkc                    s*   t | jjj|  dg  fdd _d S )NOKc                    s    j j S rJ   )r  rf   r   )r   Zdialogr#   r$   rZ   D  s    z HelpTk.trigger.<locals>.<lambda>)r   r   r   ry   Z_get_help_textdonerY  r#   r  r$   r  A  s   zHelpTk.triggerNr  r#   r#   r#   r$   r  ?  r  r  c                   @   s    e Zd ZejZeZeZ	ej
ZdS )
_BackendTkN)r\   r]   r^   r*   Z	TkVersionZbackend_versionra   ZFigureCanvasrb   ZFigureManagerr  r   r#   r#   r#   r$   r  L  s
    
r  rJ   )duuidr   
contextlibr   loggingr;   Zos.pathr  r  r   r   r*   Ztkinter.filedialogZtkinter.fontZtkinter.messageboxZtkinter.simpledialogr   numpyr7   ZPILr   r   r  r    r   r   r   r	   Zmatplotlib.backend_basesr
   r   r   r   r   r   r   r   r   r   r   r   r   r   Zmatplotlib._pylab_helpersr   r   r   r   r   ImportErrorrH   r   Zcause1Zcause2rL  AttributeErrorr.   r  realpath
executableZis_uv_python	getLoggerr\   rQ  ZMOVEZHANDPOINTERZSELECT_REGIONZWAITZRESIZE_HORIZONTALZRESIZE_VERTICALr   r%   r(   uuid4hexr@   r5   r,   rI   ra   rb   r7  r%  r;  Z_register_tool_classZRubberbandBaser  r  ZSaveFigureBaser  ZConfigureSubplotsBaser  ZToolHelpBaser  ZToolbarZ_toolbar2_classZ_toolmanager_toolbar_classZexportr  r#   r#   r#   r$   <module>   s    @


	
6&  /   0"
N