myWin_GTKAgg.py 7.01 KB
Newer Older
1
2
3
4
5
6
7
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# ================= FILE HEADER ========================================
#
#   myplotlib v1.0.1,
#
8
#   @file      myWin_GTKAgg.py
9
10
11
#   @author    Yori 'AGy' Fournier
#   @licence   CC-BY-SA
#
12
#   MyWin_GTKAgg class: Overlay of matplotlib FigureManager
13
14
15
16
17
18
19
#   class. It allows a cleaner and more confortable
#   usage of windows.
#
#   @Class MyWin
#
#   @Constructor
#
20
21
22
23
24
25
#                fig:           the MyFig object that need to be drawn
#                show:          a flag to show the window just after
#                               creation. (default: True)
#                fignum:        number of both the Window and the Figure.
#                debug:         flag for debugging, more verbatile.
#                (kw)args:      user defined arguments and keywords.
26
27
28
#
#   @section Functions
#
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#            - _boundFigure_:   bound a figure to the window (priv.)
#
#            - _unboundFigure_: unbound a figure to the window (priv.)
#
#            - set_figure:      a clean way of setting a new figure
#                               to the window.
#
#            - refresh:         redraw the window
#                               - clean the figure
#                               - plot the figure
#                               - draw the canvas
#
#            - drawFigure:      draw a given figure on the window
#                               - set the figure of needed
#                               - refresh
#
#            - close:           close the window
#
47
48
#   @section History
#
49
#   v 1.0.1 - MyWin_GTKAgg class for the myplotlib module.
50
51
52
53
#
# ======================================================================
#
# IMPORT ---------------------------------------------------------------
54
55
56
57
from . import INFO, SEVR, WARN, DBUG, SPCE
from . import rcParams
from . import _G_WINDOWS
from . import np
58

59
60
# For the GTKAgg backend
from matplotlib.backends.backend_gtkagg import FigureManagerGTKAgg, FigureCanvasGTKAgg
61
62


63
# Class MyWin Overwriting the disgusting Matplotlib.FigureManager class
64
65
class MyWin_GTKAgg(FigureManagerGTKAgg):
    
66
    # CONSTRUCTOR ------------------------------------------------------
67
68
    def __init__(self, fig, show=True, *args, **kwargs):
        
69
        # set the dpi to 75 (correct value for screen)
70
71
72
        if(fig.dpi != 75.):
            fig.dpi = 75.
        
73
74
75
        # Get the debug value
        debug = kwargs.get('debug', False)
        
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
        # Get the user specified ID of the window or set it to 0
        if 'fignum' in kwargs.keys():
            num = kwargs['fignum']
            fignumSpecifiedByUser = True
        else:
            num = 0
            fignumSpecifiedByUser = False
        
        # if ID already used
        if(num in [(window.num) for window in _G_WINDOWS]):
            
            # if user specified fignum then close former window and create new one
            if(fignumSpecifiedByUser):
                if(debug):
                    print(DBUG + "The fignum you specified already exists, I'll close the former window")
                # Close the window with the specified number
                _G_WINDOWS[np.where([(window.num == num) for window in _G_WINDOWS])[0][0]].close()
            else:
                # If user didn't specified a fignum
                # increase ID until found a free one
                while(num in [(window.num) for window in _G_WINDOWS]):
                    num = num + 1
98
        
99
100
101
102
        # If debug print the ID of the window
        if(debug):
            print(DBUG + "You choosed num = " + str(num))
        
103
104
        # before creating anything verify that the fig is not already
        # bounded to another window
105
        if fig.boundedToWin:
106
            # if it is the case close the bounded window.
107
            win = _G_WINDOWS[np.where([(window.num == fig.keywords['fignum']) for window in _G_WINDOWS])[0][0]]
108
109
            win.close()
        
110
        # Call FigureManagerGTK class
111
        # (already wondering if this is not a mistake...)
112
113
114
115
116
        if(debug):
            print(INFO + "Used GTKAgg backend.")
        
        FigureManagerGTKAgg.__init__(self, FigureCanvasGTKAgg(fig), num)
        
117
        # bound the figure to the window
118
119
120
        self.canvas.figure.boundedToWin = True
        self.canvas.figure.keywords['fignum'] = num
        
121
122
123
        # add the window in the global variable _G_WINDOWS
        # this guarenty that you never loose a window
        # (see myTool.py getWindow(num))
124
        _G_WINDOWS.append(self)
125
126
        
        # if show is on, then show the window
127
        if show:
128
129
130
            # For GTKAgg and TKAgg ---------------------------------
            self.refresh()
            self.show()
131
    
132
133
    
    # BOUND ------------------------------------------------------------
134
135
136
137
138
139
140
    def _boundFigure_(self, fig):
        
        fig.canvas = self.canvas
        self.canvas.figure = fig
        self.canvas.figure.boundedToWin = True
        self.canvas.figure.keywords['fignum'] = self.num
    
141
142
    
    # UNBOUND ----------------------------------------------------------
143
144
145
146
147
    def _unboundFigure_(self):
        
        self.canvas.figure.boundedToWin = False
        self.canvas.figure.keywords['fignum'] = -1
    
148
149
150
    
    # SETTERS ----------------------------------------------------------
    # SET FIGURE -------------------------------------------------------
151
152
    def set_figure(self, fig):
        
153
        # first unbound the former figure
154
155
        self._unboundFigure_()
        
156
157
        # if the new figure is already bounded close
        # its former container.
158
        if fig.boundedToWin:
159
            win = _G_WINDOWS[np.where([(window.num == fig.keywords['fignum']) for window in _G_WINDOWS])[0][0]]
160
            win.close()
161
162
        
        # bound the new figure
163
164
        self._boundFigure_(fig)
    
165
166
    
    # REFRESH ----------------------------------------------------------
167
    def refresh(self):
168
        
169
170
        # in the case the figure got another canvas
        # rebound the figure. This situation should not happend!!
171
        if self.canvas != self.canvas.figure.canvas:
172
            print(WARN + "Something weird happend, the canvas of the figure have been changed")
173
174
175
            self.set_figure(self.canvas.figure)
        
        # refresh
176
177
        self.canvas.figure.plot()
        self.canvas.draw()
178
179
        
        return(True)
180
    
181
182
    
    # DRAW -------------------------------------------------------------
183
    def drawFigure(self, fig):
184
185
        
        # if the figure is not the current one
186
        if(fig.keywords['fignum'] != self.num):
187
            # cleanly set the new figure
188
189
            self.set_figure(fig)
        
190
        # and refresh
191
192
        self.refresh()
    
193
194
    
    # CLOSE ------------------------------------------------------------
195
196
197
198
    def close(self):
        
        self._unboundFigure_()
        self.destroy()
199
        del _G_WINDOWS[np.where([(window == self) for window in _G_WINDOWS])[0][0]]
200
201
202
203
204
        # remark if you create the window like:
        # win = MyWin(fig)
        # then win is still refering the self
        # and therefore not yet freed
        # del win would free it entirely.