U
    \	a                  
   @   s`  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
mZ d dlZd dlZd dl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 d dl m!Z! d dl"m#Z# d dl$m%Z% d	d
l&m'Z' e(e)Z*e	j+Z,ej-dej.dej/dej0dej1diZ2edd Z3i Z4de 5 j6 Z7dd Z8d2ddZ9G dd deZ:G dd deZ;G dd deZ<G dd dee	j=Z>G dd  d Z?G d!d" d"ej@ZAG d#d$ d$ejBZCG d%d& d&ee	j=ZDeEd'G d(d) d)ee	j=ZFG d*d+ d+ejGZHG d,d- d-ejIZJG d.d/ d/ejKZLeHe_MeJe_NeCe_OeAe_PeLe_QejRe_SeDZTejUG d0d1 d1eZVdS )3    N)contextmanager)SimpleDialog)_apibackend_toolscbook_c_internal_utils)	_BackendFigureCanvasBaseFigureManagerBaseNavigationToolbar2StatusbarBase	TimerBaseToolContainerBasecursors_Mode)Gcf)Figure)SubplotTool   )_tkaggZfleurZhand2ZarrowZtcrossZwatchc               	   c   s.   t  } z
d V  W 5 tjd r(t |  X d S )Nztk.window_focus)r   ZWin32_GetForegroundWindowmplrcParamsZWin32_SetForegroundWindow)Z
foreground r   C/tmp/pip-unpacked-wheel-wjyw_3jo/matplotlib/backends/_backend_tk.py!_restore_foreground_window_at_end&   s
    

r   Z	mpl_blit_c                 C   s@   t | \}}}}}|r |  t|j t|||| dS )a3  
    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.

    photoimage blanking must occur in the same event and thread as blitting
    to avoid flickering.
    N)
_blit_argspopblankr   blittkZ
interpaddrstr)argsid
photoimagedataptroffsetsbboxptrr   r   r   r   _blit5   s    
    r&   c              
   C   s4  t |}|jdd \}}|||jjf}|dk	r| \\}}	\}
}tt|d}t	t
|
|}
tt|	d}	t	t
||}||
|	|f}d}nd|d|f}d}| ||||f}tt|}|t|< z| jt| W nR tjk
r. } z0dt|kr | jtt | jt| W 5 d}~X Y nX dS )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 NOT be blanked before blitting.

    Tcl events must be dispatched to trigger a blit from a non-Tcl thread.
    N   r   FTzinvalid command name)npZasarrayshapectypesdataZ	__array__maxmathfloorminceilr    idr   r   call_blit_tcl_nameTclErrorZcreatecommandr&   )r"   Zaggimager$   bboxr+   heightwidthr#   x1y1Zx2y2r%   r   argsr!   er   r   r   r   F   s.    
	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|| || _d S N)_timersuper__init__parent)selfrB   r;   kwargs	__class__r   r   rA   |   s    zTimerTk.__init__c                 C   s    |    | j| j| j| _d S r>   )_timer_stoprB   after	_interval	_on_timerr?   rC   r   r   r   _timer_start   s    zTimerTk._timer_startc                 C   s"   | j d k	r| j| j  d | _ d S r>   )r?   rB   after_cancelrK   r   r   r   rG      s    
zTimerTk._timer_stopc                    sX   t     jsN jrN jdkr6 j j j _qT j fdd _nd  _d S )Nr   c                      s    j  j jS r>   )rB   rH   rI   rJ   r   rK   r   r   <lambda>       z#TimerTk._on_timer.<locals>.<lambda>)r@   rJ   Z_singler?   rI   rB   rH   
after_idlerK   rE   rK   r   rJ      s    


zTimerTk._on_timer)	__name__
__module____qualname____doc__rA   rL   rG   rJ   __classcell__r   r   rE   r   r=   y   s
   r=   c                       s   e Zd ZdZejddddd- fdd	Zd	d
 Zdd Zdd Z	 fddZ
 fddZd. f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)d*Zd+d, Z  ZS )0FigureCanvasTkr   z3.4resize_callbackz.get_tk_widget().bind('<Configure>', ..., True))alternativeNc           	         s  t  | d _d  _d  _ jjjt	\}}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 dD ]} j| j qdD ]} j| j qdD ]} j| j qdD ]} j| j q4 j }|d jd  fdd}|d|d | _ j  d S )NTZwhiter   )masterZ
backgroundr7   r6   borderwidthZhighlightthicknessrY   r7   r6   r'   imagez<Configure>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>z<MouseWheel>+c                    s   | j  jkr   d S r>   )widget	_tkcanvasZclose_eventeventrK   r   r   filter_destroy   s    z/FigureCanvasTk.__init__.<locals>.filter_destroyz	<Destroy>) r@   rA   _idle_idle_callback_event_loop_idfigurer5   sizeZastypeintr   ZCanvasrb   
PhotoImage_tkphotocreate_image_resize_callbackbindresize	key_pressmotion_notify_evententer_notify_eventZleave_notify_eventkey_releasebutton_press_eventbutton_dblclick_eventbutton_release_eventscroll_eventZwinfo_toplevelscroll_event_windows_masterZ	focus_set)	rC   ri   rY   rW   whnamerootre   rE   rK   r   rA      sP          
zFigureCanvasTk.__init__c                 C   s   |j |j }}| jd k	r"| | | jj}|| }|| }| jj||dd | j| j t	j
| jt|t|d| _| jjt|d t|d | jd |   d S )NF)Zforwardr[   r'   r\   )r7   r6   ro   ri   ZdpiZset_size_inchesrb   deleterm   r   rl   rk   rn   Zresize_event)rC   rd   r7   r6   ZdpivalZwinchZhinchr   r   r   rq      s&    

  
 
 zFigureCanvasTk.resizec                    s.    j s
d S d _  fdd} j| _d S )NFc                     s   z   W 5 d _ X d S )NT)rf   drawr;   rK   r   r   	idle_draw   s    z+FigureCanvasTk.draw_idle.<locals>.idle_draw)rf   rb   rP   rg   )rC   r   r   rK   r   	draw_idle   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.
        )rb   rK   r   r   r   get_tk_widget   s    zFigureCanvasTk.get_tk_widgetc                    s,   |j }| jjj|j }t j|||d d S NguiEvent)xri   r5   r6   yr@   rs   rC   rd   r   r   rE   r   r   rs      s    z"FigureCanvasTk.motion_notify_eventc                    s.   |j }| jjj|j }t j|||fd d S )N)r   Zxy)r   ri   r5   r6   r   r@   rt   r   rE   r   r   rt     s    z!FigureCanvasTk.enter_notify_eventFc                    s`   |j }| jjj|j }t|dd }tjdkrF|dkr:d}n|dkrFd}t j	|||||d d S )Nnumdarwinr'      )dblclickr   )
r   ri   r5   r6   r   getattrsysplatformr@   rv   )rC   rd   r   r   r   r   rE   r   r   rv     s    
 z!FigureCanvasTk.button_press_eventc                 C   s   | j |dd d S )NT)r   )rv   rC   rd   r   r   r   rw     s    z$FigureCanvasTk.button_dblclick_eventc                    s^   |j }| jjj|j }t|dd }tjdkrF|dkr:d}n|dkrFd}t j	||||d d S )Nr   r   r'   r   r   )
r   ri   r5   r6   r   r   r   r   r@   rx   )rC   rd   r   r   r   rE   r   r   rx     s    
z#FigureCanvasTk.button_release_eventc                    sV   |j }| jjj|j }t|dd }|dkr.dn|dkr:dnd}t j||||d d S )Nr      r      r   r   )r   ri   r5   r6   r   r   r@   ry   )rC   rd   r   r   r   steprE   r   r   ry   .  s
    zFigureCanvasTk.scroll_eventc                 C   sh   |j |j|j}|| jkrd|j|  }|j|  }| jjj	| }|j
d }tj| ||||d dS )zMouseWheel event processorg      ^@r   N)ra   Zwinfo_containingZx_rootZy_rootrb   winfo_rootxwinfo_rootyri   r5   r6   deltar	   ry   )rC   rd   r|   r   r   r   r   r   r   rz   5  s    

z#FigureCanvasTk.scroll_event_windowsc                 C   s   |j }t||j}tjdkr*dddg}n$tjdkrBddddg}ndddd	g}|d k	r|D ]8\}}}|jd
|> @ rZ||krZ|dkr|sZd||}qZ|S )Nwin32)r'   Zctrlcontrol)   altr   )r   shiftr   r   )r   r   r   )r   r@   r@   )r   r   r   )   r@   r@   r   r   z{0}+{1})charr   Z_unikey_or_keysym_to_mplkeyZkeysymr   r   stateformat)rC   rd   Zunikeykey	modifiersZbitmaskprefixZkey_namer   r   r   _get_key@  s0    


zFigureCanvasTk._get_keyc                 C   s   |  |}tj| ||d d S r   )r   r	   Zkey_press_eventrC   rd   r   r   r   r   rr   g  s    
zFigureCanvasTk.key_pressc                 C   s   |  |}tj| ||d d S r   )r   r	   Zkey_release_eventr   r   r   r   ru   k  s    
zFigureCanvasTk.key_releasec                 O   s   t | jf||S r>   )r=   rb   rC   r;   rD   r   r   r   	new_timero  s    zFigureCanvasTk.new_timerc                 C   s   | j   d S r>   )r{   updaterK   r   r   r   flush_eventss  s    zFigureCanvasTk.flush_eventsr   c                 C   sN   |dkr@t d| }|dkr0| j|| j| _n| j| j| _| j  d S )Nr   i  )rk   rb   rH   stop_event_looprh   rP   r{   mainloop)rC   timeoutZmillisecondsr   r   r   start_event_loopw  s     zFigureCanvasTk.start_event_loopc                 C   s(   | j r| j| j  d | _ | j  d S r>   )rh   r{   rM   quitrK   r   r   r   r     s    zFigureCanvasTk.stop_event_loop)NNN)F)r   )rQ   rR   rS   Zrequired_interactive_frameworkr   Zdelete_parameterrA   rq   r   r   rs   rt   rv   rw   rx   ry   rz   r   rr   ru   r   r   r   r   rU   r   r   rE   r   rV      s0    0	'
rV   c                       s\   e Zd ZdZ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  ZS )FigureManagerTkz
    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                    sn   || _ t || | j   |  | _| jjjt	j
t	jdd | jrdt| j | jrdt| j d| _d S )Nr   sidefillexpandF)windowr@   rA   withdraw_get_toolbartoolbarcanvasrb   packr   TOPBOTHtoolmanagerr   Zadd_tools_to_managerZadd_tools_to_container_shown)rC   r   r   r   rE   r   r   rA     s    

zFigureManagerTk.__init__c                 C   sD   t jd dkrt| j| j}n"t jd dkr<t| j| j}nd }|S )Nr   Ztoolbar2r   )r   r   NavigationToolbar2Tkr   r   	ToolbarTkr   )rC   r   r   r   r   r     s    zFigureManagerTk._get_toolbarc                 C   sP   d}||ks||kr:t jdkr:td| d| d| d| jjj||d d S )Ni\ linuxz/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.)r7   r6   )r   r   
ValueErrorr   rb   	configure)rC   r7   r6   max_sizer   r   r   rq     s    zFigureManagerTk.resizec              	      s   t  p  js4 fdd} jd|  j  n
 j  tjd rl jj	j
dd  jj	j
dd d _W 5 Q R X d S )	Nc                     s   t   d S r>   )r   destroyr   rK   r   r   r     s    z%FigureManagerTk.show.<locals>.destroyWM_DELETE_WINDOWzfigure.raise_windowz-topmostr   r   T)r   r   r   protocolZ	deiconifyr   r   r   r   manager
attributes)rC   r   r   rK   r   show  s    

zFigureManagerTk.showc                    sX    j jr j j j j  j jr4 j j j j  fdd} j jjd| d S )Nc                      s&    j    jr"t s" j   d S r>   )r   r   _owns_mainloopr   Zget_num_fig_managersr   r   rK   r   r   delayed_destroy  s    
z0FigureManagerTk.destroy.<locals>.delayed_destroyr   )r   rg   rb   rM   rh   r   rP   rH   )rC   r;   r   r   rK   r   r     s    zFigureManagerTk.destroyc                 C   s
   | j  S r>   r   Zwm_titlerK   r   r   r   get_window_title  s    z FigureManagerTk.get_window_titlec                 C   s   | j | d S r>   r   )rC   titler   r   r   set_window_title  s    z FigureManagerTk.set_window_titlec                 C   s$   t | jd}| jd|  d S )Nz-fullscreen)boolr   r   )rC   Zis_fullscreenr   r   r   full_screen_toggle  s    z"FigureManagerTk.full_screen_toggle)rQ   rR   rS   rT   r   rA   r   rq   r   r   r   r   r   rU   r   r   rE   r   r     s   	r   c                       s   e Zd ZdZddddZdd Z fdd	Z fd
dZdd Zdd Z	 fddZ
dd Zdd Zdd Zdd Zdd Z  ZS )r   a  
    Attributes
    ----------
    canvas : `FigureCanvas`
        The figure canvas on which to operate.
    win : 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``.
    T)pack_toolbarc          
   	   C   s  || _ tjj| |dt|jjjdd i | _| j	D ]j\}}}}|d krP| 
  q2| j|ttd| d|dkt| |d | j|< }|d k	r2t|| q2tj| dd	}	|	jtjd
 tj| d| _tj| | jd| _| jjtjd
 t| | |r| jtjtjd d S )Nr'   2   )rY   rZ   r7   r6   zimages/z.png)zoompan)togglecommandu    
 )rY   textr   rY   rY   Ztextvariabler   r   )r   r   FramerA   rk   ri   r5   r7   _buttonsZ	toolitems_Spacer_Buttonr    r   _get_data_pathr   ToolTipcreateToolTipLabelr   RIGHT	StringVarmessage_message_labelr   ZBOTTOMX)
rC   r   r   r   r   Ztooltip_text
image_filecallbackbuttonlabelr   r   r   rA     s6     
zNavigationToolbar2Tk.__init__c                 C   sT   dt jfdt jffD ]:\}}|| jkr| j|kr@| j|   q| j|   qd S )NZZoomZPan)r   ZZOOMZPANr   modeselectdeselect)rC   r   r   r   r   r   _update_buttons_checked$  s
    

z,NavigationToolbar2Tk._update_buttons_checkedc                    s   t  j|  |   d S r>   )r@   r   r   rC   r;   rE   r   r   r   -  s    zNavigationToolbar2Tk.panc                    s   t  j|  |   d S r>   )r@   r   r   r   rE   r   r   r   1  s    zNavigationToolbar2Tk.zoomc                 C   s   | j | d S r>   )r   setrC   sr   r   r   set_message5  s    z NavigationToolbar2Tk.set_messagec                 C   sP   | j jjj}|| }|| }t| dr6| j j| j | j j||||| _d S Nlastrect)	r   ri   r5   r6   hasattrrb   r   r   create_rectangle)rC   rd   x0y0r8   r9   r6   r   r   r   draw_rubberband8  s    
z$NavigationToolbar2Tk.draw_rubberbandc                    s.   t  | t| dr*| jj| j | `d S r   )r@   release_zoomr   r   rb   r   r   r   rE   r   r   r  @  s    
z!NavigationToolbar2Tk.release_zoomc                 C   s<   | j  j}z|jt| d W n tjk
r6   Y nX d S )N)cursor)r   r   rY   r   cursordtkinterr4   )rC   r  r   r   r   r   
set_cursorF  s
    zNavigationToolbar2Tk.set_cursorc           	      C   s   t jdkrt j}nddlm} |d k	r2|| |dnd }|sNt j| |||d}n(t j| d}t j| |||d|d}||_||_|j	t j
d	 |S )
Ng333333!@r   )rl   )rY   file)rY   r   r]   r   r   F)rY   r   r]   r   Zindicatoronvariabler   )r   	TkVersionrl   ZPIL.ImageTkZButtonZIntVarZCheckbuttonvarZ_ntimager   LEFT)	rC   r   r   r   r   rl   r]   br	  r   r   r   r   M  s,    
    zNavigationToolbar2Tk._Buttonc                 C   s*   t j| dt jddd}|jt jdd |S )N   r'   ZDarkGray)rY   r6   reliefZpadybgr   )r   Zpadx)r   r   ZRIDGEr   r
  r   r   r   r   r   e  s        zNavigationToolbar2Tk._Spacerc              
   G   s   | j   }| j  }||}||fgt|  }dd |D }d}tj	t
jd }| j  }	tjj| j  jd||||	d}
|
dkrd S |dkrtjt|
t
jd< z| j j|
 W n4 tk
r } ztjdt| W 5 d }~X Y nX d S )	Nc                 S   s   g | ]\}}|d | fqS )z*.%sr   ).0extr~   r   r   r   
<listcomp>u  s     z4NavigationToolbar2Tk.save_figure.<locals>.<listcomp> zsavefig.directoryzSave the figure)rY   r   	filetypesdefaultextension
initialdirinitialfile)r  r   zError saving file)r   Zget_supported_filetypescopyZget_default_filetyper   sorteditemsospath
expanduserr   r   Zget_default_filenamer  Z
filedialogZasksaveasfilenamer   rY   dirnamer    ri   Zsavefig	ExceptionZ
messageboxZ	showerror)rC   r;   r  Zdefault_filetypeZdefault_filetype_nameZsorted_filetypesZtk_filetypesr  r  r  fnamer<   r   r   r   save_figurel  s6    




	z NavigationToolbar2Tk.save_figurec                 C   sn   t jt jd}| jjdk}| jjt| jjd k }d| jkrN|| | jd d< d| jkrj|| | jd d< d S )N)TFr   r   Backr   Forward)r   NORMALZDISABLEDZ
_nav_stack_poslenZ	_elementsr   )rC   Z	state_mapZcan_backZcan_forwardr   r   r   set_history_buttons  s    

z(NavigationToolbar2Tk.set_history_buttons)rQ   rR   rS   rT   rA   r   r   r   r   r   r  r  r   r   r   r&  rU   r   r   rE   r   r     s   '	(r   c                   @   s4   e Zd ZdZedd Zdd Zdd Zdd	 Zd
S )r   zi
    Tooltip recipe from
    http://www.voidspace.org.uk/python/weblog/arch_d7_2006_07_01.shtml#e387
    c                    s>   t |  fdd}fdd}| d| | d| d S )Nc                    s      d S r>   )showtiprc   r   toolTipr   r   enter  s    z$ToolTip.createToolTip.<locals>.enterc                    s       d S r>   )hidetiprc   )r)  r   r   leave  s    z$ToolTip.createToolTip.<locals>.leaver^   r_   )r   rp   )ra   r   r*  r,  r   r(  r   r     s
    zToolTip.createToolTipc                 C   s"   || _ d | _d | _d | _| _d S )Nr   )ra   	tipwindowr1   r   r   )rC   ra   r   r   r   rA     s    zToolTip.__init__c                 C   s   || _ | js| j sdS | jd\}}}}|| j  d }|| j  }t| j | _}|d |	d||f  z|j
dd|jdd	 W n tjk
r   Y nX tj|| j tjtjdd
}|jdd dS )zDisplay text in tooltip window.Ninsert   r   z+%d+%dz!::tk::unsupported::MacWindowStylestylehelpZnoActivates)r   Zjustifyr  rZ   )Zipadx)r   r-  ra   r5   r   r   r   ZToplevelZwm_overrideredirectZwm_geometryr2   _wr4   r   r
  ZSOLIDr   )rC   r   r   r   _twr   r   r   r   r'    s.    
   zToolTip.showtipc                 C   s   | j }d | _ |r|  d S r>   )r-  r   )rC   r4  r   r   r   r+    s    zToolTip.hidetipN)	rQ   rR   rS   rT   staticmethodr   rA   r'  r+  r   r   r   r   r     s   
	r   c                   @   s   e Zd Zdd Zdd ZdS )RubberbandTkc                 C   sV   | j jj jj}|| }|| }t| dr:| j jj| j | j jj||||| _d S r   )	ri   r   r5   r6   r   rb   r   r   r   )rC   r   r   r8   r9   r6   r   r   r   r     s    

   zRubberbandTk.draw_rubberbandc                 C   s$   t | dr | jjj| j | `d S r   )r   ri   r   rb   r   r   rK   r   r   r   remove_rubberband  s    
zRubberbandTk.remove_rubberbandN)rQ   rR   rS   r   r7  r   r   r   r   r6    s   	r6  c                   @   s   e Zd Zdd ZdS )SetCursorTkc                 C   s   t |  | d S r>   )r   r  "_make_classic_style_pseudo_toolbar)rC   r  r   r   r   r    s     zSetCursorTk.set_cursorN)rQ   rR   rS   r  r   r   r   r   r8    s   r8  c                   @   sL   e Z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 )r   c                 C   s   t | | | jjjjj\}}d||  }}tjj| |t	|t	|dd tj
| d| _tj| | jd| _| jjtjd i | _| jtjtjd i | _d S Nr   r'   )rY   r7   r6   rZ   r   r   r   r   )r   rA   r   r   ri   r5   	intervalxr   r   rk   r   _messager   r   r   r   
_toolitemsr   r   _groups)rC   r   r   xminxmaxr6   r7   r   r   r   rA     s    
 zToolbarTk.__init__c           	   	      s\    |}t || fdd}|d k	r:t|| j g  j  | d S )Nc                      s
     S r>   )_button_clickr   r~   rC   r   r   rN     rO   z(ToolbarTk.add_toolitem.<locals>.<lambda>)_get_groupframer   r   r   r   r=  
setdefaultappend)	rC   r~   grouppositionr   descriptionr   framer   r   rB  r   add_toolitem  s    
zToolbarTk.add_toolitemc                 C   sL   || j krB| j r|   tj| dd}|jtjtjd || j |< | j | S )Nr   )rY   rZ   r   )r>  _add_separatorr   r   r   r
  Y)rC   rF  rI  r   r   r   rC    s    

zToolbarTk._get_groupframec                 C   s
   t | S r>   )r   r   rK   r   r   r   rK  
  s    zToolbarTk._add_separatorc                 C   s   |  | d S r>   )Ztrigger_tool)rC   r~   r   r   r   rA    s    zToolbarTk._button_clickc                 C   s8   || j krd S | j | D ]}|r*|  q|  qd S r>   )r=  r   r   )rC   r~   Ztoggledtoolitemr   r   r   toggle_toolitem  s    

zToolbarTk.toggle_toolitemc                 C   s$   | j | D ]}|  q
| j |= d S r>   )r=  Zpack_forget)rC   r~   rM  r   r   r   remove_toolitem  s    
zToolbarTk.remove_toolitemc                 C   s   | j | d S r>   r<  r   r   r   r   r   r     s    zToolbarTk.set_messageN)rQ   rR   rS   rA   rJ  rC  rK  rA  rN  rO  r   r   r   r   r   r     s   
		r   z3.3c                   @   s   e Zd Zdd Zdd ZdS )StatusbarTkc                 O   s   t j| f|| | jjjjj\}}d||  }}tjj| |t	|t	|dd tj
| d| _tj| | jd| _| jjtjd | jtjtjd d S r:  )r   rA   r   r   ri   r5   r;  r   r   rk   r   r<  r   r   r   r   r   r   )rC   r   r;   rD   r?  r@  r6   r7   r   r   r   rA   $  s    
 zStatusbarTk.__init__c                 C   s   | j | d S r>   rP  r   r   r   r   r   0  s    zStatusbarTk.set_messageN)rQ   rR   rS   rA   r   r   r   r   r   rQ  "  s   rQ  c                   @   s   e Zd Zdd ZdS )SaveFigureTkc                 G   s   t |   d S r>   )r   r   r9  r   r   r   r   trigger5  s    zSaveFigureTk.triggerNrQ   rR   rS   rS  r   r   r   r   rR  4  s   rR  c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	ConfigureSubplotsTkc                    s   t  j|| d | _d S r>   )r@   rA   r   r   rE   r   r   rA   ;  s    zConfigureSubplotsTk.__init__c                 G   s   |    | j  d S r>   )init_windowr   Zliftr   r   r   r   rS  ?  s    zConfigureSubplotsTk.triggerc                 C   s~   | j r
d S tdd}t | _ t| j|| j d}|jdd t| j| |	  |
 jtjtjdd | j d| j d S )	N)r   r   )Zfigsizer   g?)topr   r   r   )r   r   r   Tktyper   Zsubplots_adjustr   ri   r   r   r   r   r   r   r   )rC   Ztoolfigr   r   r   r   rV  C  s    

zConfigureSubplotsTk.init_windowc                 O   s   | j d k	r| j   d | _ d S r>   )r   r   r   r   r   r   r   Q  s    

zConfigureSubplotsTk.destroy)rQ   rR   rS   rA   rS  rV  r   rU   r   r   rE   r   rU  :  s   rU  c                   @   s   e Zd Zdd ZdS )HelpTkc                    s*   t | jjj|  dg  fdd _d S )NOKc                    s    j j S r>   )rI  rY   r   )r   dialogr   r   rN   [  rO   z HelpTk.trigger.<locals>.<lambda>)r   ri   r   rb   Z_get_help_textdoner   r   r\  r   rS  X  s      zHelpTk.triggerNrT  r   r   r   r   rZ  W  s   rZ  c                   @   s(   e Zd ZeZedd Zedd ZdS )
_BackendTkc           	      C   s   t   t dkrt  tjdd}|  ttd}tj	||d}z|
d| W n. tk
r } ztd| W 5 d}~X Y nX | j||d}| |||}t r|  |  |W  5 Q R  S Q R X dS )	zL
        Create a new figure manager instance for the given figure.
        N
matplotlib)Z	classNamezimages/matplotlib_128.ppm)r  rY   Fz"Could not load matplotlib icon: %sr   )r   r   Z"_get_running_interactive_frameworkZ_setup_new_guiappr   rX  r   r    r   rl   Z	iconphotor  _loginfoZFigureCanvasFigureManagerr   Zis_interactiver   r   )	clsr   ri   r   Z
icon_fnameZicon_imgexcr   r   r   r   r   new_figure_manager_given_figurek  s&    z*_BackendTk.new_figure_manager_given_figurec                  C   sH   t  } | rD| d }t|}|jr&d S d|_z|j  W 5 d|_X d S )Nr   TF)r   Zget_all_fig_managersrY  r   r   r   )ZmanagersZfirst_managerZmanager_classr   r   r   r     s    z_BackendTk.mainloopN)	rQ   rR   rS   r   rc  classmethodrf  r5  r   r   r   r   r   r_  g  s
   
r_  )N)Wuuid
contextlibr   loggingr-   os.pathr  r   r  r   Ztkinter.simpledialogr   Ztkinter.filedialogZtkinter.messageboxZnumpyr(   r`  r   r   r   r   r   Zmatplotlib.backend_basesr   r	   r
   r   r   r   r   r   r   Zmatplotlib._pylab_helpersr   Zmatplotlib.figurer   Zmatplotlib.widgetsr   r  r   	getLoggerrQ   ra  r  Zbackend_versionZMOVEZHANDPOINTERZSELECT_REGIONZWAITr  r   r   Zuuid4hexr3   r&   r   r=   rV   r   r   r   r   ZRubberbandBaser6  ZSetCursorBaser8  r   
deprecatedrQ  ZSaveFigureBaserR  ZConfigureSubplotsBaserU  ZToolHelpBaserZ  ZToolSaveFigureZToolConfigureSubplotsZToolSetCursorZToolRubberbandZToolHelpZToolCopyToClipboardBaseZToolCopyToClipboardZToolbarexportr_  r   r   r   r   <module>   sx   ,
     	
	
3& md 22: