Fw: Adding MatplotLib widget to Pythoncard - and ALMOST works perfectly

John Henry <[email protected]> Tue, 12 Apr 2011 12:59:22 -0700 (PDT)
Newsgroups gmane.comp.python.pythoncard
Message-ID <[email protected]>
--0-2102001682-1302638362=:57596
Content-Type: multipart/alternative; boundary="0-1784342307-1302638362=:57596"

--0-1784342307-1302638362=:57596
Content-Type: text/plain; charset=us-ascii

Oops.  The image was too big.  Reattach.
 --
John Henry


>
>----- Forwarded Message ----
>From: John Henry <[email protected]>
>To: [email protected]
>Sent: Tue, April 12, 2011 12:46:40 PM
>Subject: Adding MatplotLib widget to Pythoncard - and ALMOST works perfectly
>
>
>I'm *this* close to a working Matplotlib widget in Pythoncard (see screen shot 
>attached).  Everything works except somehow all of my mouse events are gone, 
>plus the canvas is not getting the the size and paint events.  I wish somebody 
>more knowledgeable in Pythoncard can help (via private email if you like).
>
>
>From the user perspective, the code looks like below (with some non-essential 
>details omitted) - look how simple it is (compare with the original code 
>at http://eli.thegreenplace.net/files/prog_code/wx_mpl_bars.py.txt
>
>
>
>
>##############
>"""
>This demo demonstrates how to embed a matplotlib (mpl) plot 
>into a Pythoncard GUI application, including:
>
>
>* Using the navigation  toolbar
>* Adding data to the plot
>* Dynamically modifying the plot's properties
>* Processing mpl events
>* Saving the plot to a file from a menu
>
>
>The main goal is to serve as a basis for developing rich Pythoncard GUI
>applications featuring mpl plots (using the mpl OO API).
>
>
>Eli Bendersky ([email protected])
>License: this code is in the public domain
>Last modified: 30.07.2008
>"""
>import os
>import pprint
>import random
>import wx
>
>
># The recommended way to use wx with mpl is with the WXAgg
># backend. 
>#
>import matplotlib
>matplotlib.use('WXAgg')
>from matplotlib.figure import Figure
>from matplotlib.backends.backend_wxagg import \
>    NavigationToolbar2WxAgg as  NavigationToolbar
>
>
>from PythonCard import model, dialog
>
>
>from pc_mpl_bars_rsrc import rsrc as BarsFrame_rsrc
>
>
>class BarsFrame(model.MDIParentBackground):
>def __init__(self, parent, rsrc):
># Create the mpl Figure and FigCanvas objects. 
># 5x4 inches, 100 dots-per-inch
>#
>model.MDIParentBackground.__init__(self, parent, aBgRsrc=rsrc)
>def on_initialize(self, event):
>self.components.slider_width.SetTickFreq(10, 1)
>
>
># Since we have only one plot, we can use add_axes 
># instead of add_subplot, but then the subplot
># configuration tool in the navigation toolbar wouldn't
># work.
>#
>figure=self.components.canvas.fig
>self.axes = figure.add_subplot(111)
># Create the navigation toolbar, tied to the canvas
>#
>self.toolbar = NavigationToolbar(self.components.canvas)
>self.sizer(event)
>self.data = [5, 6, 9, 14]
>self.components.textbox.text=(' '.join(map(str,  self.data)))
>
>
>self.draw_figure()
>
>
>def sizer(self, event):
><...sizer code skipped ...>
>
>
>def draw_figure(self):
>""" Redraws the figure
>"""
>str = self.components.textbox.text
>self.data = map(int, str.split())
>x = range(len(self.data))
>
>
># clear the axes and redraw the plot anew
>#
>self.axes.clear()
>self.axes.grid(self.components.cb_grid.checked)
>self.axes.bar(
>left=x, 
>height=self.data, 
>width=self.components.slider_width.GetValue() / 100.0, 
>align='center', 
>alpha=0.44,
>picker=5)
>self.components.canvas.draw()
>def on_exit(self, event):
>self.Destroy()
>
>
>if __name__ == '__main__':
>app = model.Application(BarsFrame,  rsrc=BarsFrame_rsrc)
>app.MainLoop()
>
> --
>John Henry
--0-1784342307-1302638362=:57596
Content-Type: text/html; charset=us-ascii

<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:'times new roman', 'new york', times, serif;font-size:12pt"><div></div><div>Oops. &nbsp;The image was too big. &nbsp;Reattach.<br>&nbsp;</div>--<br>John Henry<div><br></div><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><div style="font-family:times new roman, new york, times, serif;font-size:12pt"><br><div style="font-family:times new roman, new york, times, serif;font-size:12pt"><font size="2" face="Tahoma">----- Forwarded Message ----<br><b><span style="font-weight: bold;">From:</span></b> John Henry &lt;[email protected]&gt;<br><b><span style="font-weight: bold;">To:</span></b> [email protected]<br><b><span sty
 le="font-weight: bold;">Sent:</span></b> Tue, April 12, 2011 12:46:40 PM<br><b><span style="font-weight: bold;">Subject:</span></b> Adding MatplotLib widget to
 Pythoncard - and ALMOST works perfectly<br></font><br>
<meta http-equiv="x-dns-prefetch-control" content="off"><div style="font-family:times, serif;font-size:12pt;"><div style="color:black;font-family:times, serif;font-size:12pt;"></div><div><font class="Apple-style-span" face="'times new roman', 'new york', times, serif" size="3">I'm *this* close to a working Matplotlib widget in Pythoncard (see screen shot attached). &nbsp;Everything works except somehow all of my mouse events are gone, plus the canvas is not getting the&nbsp;the size and paint events. &nbsp;I wish somebody more&nbsp;</font><font class="Apple-style-span" face="'times new roman', 'new york', times, serif">knowledgeable&nbsp;</font><font class="Apple-style-span" face="'times new roman', 'new york', times, serif" size="3">in Pythoncard can help (via private email if you like).<
 /font></div><div><font class="Apple-style-span" face="'times new roman',
 'new york', times, serif"><br></font></div><div><font class="Apple-style-span" face="'times new roman', 'new york', times, serif" size="3"></font><font class="Apple-style-span" face="'times new roman', 'new york', times, serif">From the user perspective, the code looks like below (with some non-essential details omitted) - look how simple it is (compare with the original code at&nbsp;</font><span><a target="_blank" href="http://eli.thegreenplace.net/files/prog_code/wx_mpl_bars.py.txt">http://eli.thegreenplace.net/files/prog_code/wx_mpl_bars.py.txt</a></span></div><div><br></div><div><br></div><div><font class="Apple-style-span" face="'times new roman', 'new york', times, serif">##############</font></div><div><font class="Apple-style-span" face="'times new roman', 'new york', times, serif
 "><div>"""</div><div>This demo demonstrates how to embed a matplotlib (mpl) plot&nbsp;</div><div>into a Pythoncard GUI application,
 including:</div><div><br></div><div>* Using the navigation
 toolbar</div><div>* Adding data to the plot</div><div>* Dynamically modifying the plot's properties</div><div>* Processing mpl events</div><div>* Saving the plot to a file from a menu</div><div><br></div><div>The main goal is to serve as a basis for developing rich Pythoncard GUI</div><div>applications featuring mpl plots (using the mpl OO API).</div><div><br></div><div>Eli Bendersky ([email protected])</div><div>License: this code is in the public domain</div><div>Last modified: 30.07.2008</div><div>"""</div><div>import os</div><div>import pprint</div><div>import random</div><div>import wx</div><div><br></div><div># The recommended way to use wx with mpl is with the WXAgg</div><div># backend.&nbsp;</div><div>#</div><div>import matplotlib</div><div>matplotlib.use('WXAgg')</div><div>from ma
 tplotlib.figure import Figure</div><div>from matplotlib.backends.backend_wxagg import \</div><div>&nbsp;&nbsp; &nbsp;NavigationToolbar2WxAgg as
 NavigationToolbar</div><div><br></div><div>from PythonCard import model, dialog</div><div><br></div><div>from pc_mpl_bars_rsrc import rsrc as BarsFrame_rsrc</div><div><br></div><div>class BarsFrame(model.MDIParentBackground):</div><div><span class="Apple-tab-span" style="white-space:pre;">	</span></div><div><span class="Apple-tab-span" style="white-space:pre;">	</span>def __init__(self, parent, rsrc):</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span># Create the mpl Figure and FigCanvas objects.&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span># 5x4 inches, 100 dots-per-inch</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>#</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>model.MDIParent
 Background.__init__(self, parent, aBgRsrc=rsrc)</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span></div><div><span class="Apple-tab-span"
 style="white-space:pre;">	</span>def on_initialize(self, event):</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span></div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>self.components.slider_width.SetTickFreq(10, 1)</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre;">		</span># Since we have only one plot, we can use add_axes&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span># instead of add_subplot, but then the subplot</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span># configuration tool in the navigation toolbar wouldn't</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span># work.</div><div><span class="Apple-tab-span" style="white-space:pre;">
 		</span>#</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>figure=self.components.canvas.fig</div><div><span class="Apple-tab-span"
 style="white-space:pre;">		</span>self.axes = figure.add_subplot(111)</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span></div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>#&nbsp;Create the navigation toolbar, tied to the canvas</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>#</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>self.toolbar = NavigationToolbar(self.components.canvas)</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span></div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>self.sizer(event)</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span></div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>self.dat
 a = [5, 6, 9, 14]</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>self.components.textbox.text=(' '.join(map(str,
 self.data)))</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>self.draw_figure()</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre;">	</span>def sizer(self, event):</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>&lt;...sizer code skipped ...&gt;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre;">	</span>def draw_figure(self):</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>""" Redraws the figure</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>"""</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>str = self.components.textbox.text</div><div><span class="Apple-tab-span" style="white-space:pre;">		</sp
 an>self.data = map(int, str.split())</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>x = range(len(self.data))</div><div><br></div><div><span
 class="Apple-tab-span" style="white-space:pre;">		</span># clear the axes and redraw the plot anew</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>#</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>self.axes.clear()<span class="Apple-tab-span" style="white-space:pre;">		</span></div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>self.axes.grid(self.components.cb_grid.checked)</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span></div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>self.axes.bar(</div><div><span class="Apple-tab-span" style="white-space:pre;">			</span>left=x,&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre;">			</span>height=self.data,&nbsp;</d
 iv><div><span class="Apple-tab-span" style="white-space:pre;">			</span>width=self.components.slider_width.GetValue() / 100.0,&nbsp;</div><div><span
 class="Apple-tab-span" style="white-space:pre;">			</span>align='center',&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre;">			</span>alpha=0.44,</div><div><span class="Apple-tab-span" style="white-space:pre;">			</span>picker=5)</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span></div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>self.components.canvas.draw()</div><div><span class="Apple-tab-span" style="white-space:pre;">	</span></div><div><span class="Apple-tab-span" style="white-space:pre;">	</span></div><div><span class="Apple-tab-span" style="white-space:pre;">	</span>def on_exit(self, event):</div><div><span class="Apple-tab-span" style="white-space:pre;">		</span>self.Destroy()</div><div><span class="Apple-tab-span" s
 tyle="white-space:pre;">		</span></div><div><br></div><div>if __name__ == '__main__':</div><div><span class="Apple-tab-span" style="white-space:pre;">	</span>app =
 model.Application(BarsFrame,
 rsrc=BarsFrame_rsrc)</div><div><span class="Apple-tab-span" style="white-space:pre;">	</span>app.MainLoop()</div><div><br></div></font><font class="Apple-style-span" face="'times new roman', 'new york', times, serif" size="3">&nbsp;</font></div><font class="Apple-style-span" face="'times new roman', 'new york', times, serif" size="3">--</font><br><font class="Apple-style-span" face="'times new roman', 'new york', times, serif" size="3">John Henry</font><div style="color:black;font-family:times, serif;font-size:12pt;"></div>


</div><meta http-equiv="x-dns-prefetch-control" content="on"></div></div></blockquote><div style="position:fixed"></div>


</div></body></html>
--0-1784342307-1302638362=:57596--
--0-2102001682-1302638362=:57596
Content-Type: image/jpeg; name="MatplotWidget.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="MatplotWidget.jpg"

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
mYc1+SjsrF/VQfA1dMXM/ko7Kxf1UHwNXTEBQ8SwynxWjfTVAOa5pbnN1OaC
LG33KYsc8zYGBzmvdchoaxpcSUGbJSjhblVPG5jZNDh8QY54BIs92tX5UPI6
pirMpqqogdnRvw+MtNrf4j1fEGvxztDX/Z38xXLOBdTxztDX/Z38xXLOBdrl
PjZnqOoZPdzuH+obzLZrWZPdzuH+obzLZrj38paQIiKowVvYFR6p3MVyGP8A
dt4guvVvYFR6p3MVyGP923iC7HKf7/j/AFnqOl5KdzVJxO+IrdLS5KdzVJxO
+IrdLl6vyW+5XjYREWaXx3zTxLjg/muxu+aeJccH811uU+Vvwz1HQ8i+59vr
n86sKr2Rfc+31z+dWFc7iPlt9yvGwiIskvh2Fcd4TxnnXYjsK47wnjPOutyn
ysz1F7yG7U1H2g/C1WhVfIbtTUfaD8LVaF4OK+e/2tXZUMv4ozQYXIWNL24l
CA62sDXwrXLaZfdrMM/icH9S1awWFnouzoPrhYFnouzoPrhBakREBERBzz5Q
BMaPE7X0QEV+O7EWxy8jJyYxZ1v8SEe9iK0KzDmnyUdlYv6qD4Grpi5n8lHZ
WL+qg+Bq6YqrCj10E9RSPip6gQSOsNJm51hwjaFIXiWWOFhfLI1jBtc42CD1
kfRCLKWaJ7yXQ0EdjFeNv7x390HZx3XQVSMlXB2VtY5pBaaCIgjh69yu6DX4
52hr/s7+YrlnAup452hr/s7+YrlnAu1ynxsz1HUMnu53D/UN5ls1rMnu53D/
AFDeZbNce/lLSBERVGCt7AqPVO5iuQx/u28QXXq3sCo9U7mK5DH+7bxBdjlP
9/x/rPUdLyU7mqTid8RW6WlyU7mqTid8RW6XL1fkt9yvGwiIs0vjvmniXHB/
Ndjd808S44P5rrcp8rfhnqOh5F9z7fXP51YVXsi+59vrn86sK53EfLb7leNh
ERZJfDsK47wnjPOuxHYVxzhPGeddblPlZnqL5kN2pqPtB+FqtCq+Q3amo+0H
4Wq0LwcV89/tauyoZfxg0GFyXdcYlCAM424eDYtctpl92swz+Jwf1LVrBYWe
i7Og+uFgWei7Og+uEFqREQEREFTy57kcX9bDzsRMuu5HF/Ww87EQcu+SjsrF
/VQfA1dMVQyEybnwSGeqmcCKuCJzbehrQregLXYvC9zKapbmubSS6d7HGwc0
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
jqnENoixCCIgHMPtKqeJ5aYfhlaKZ9FK86R0ZIlAtY2vt/8AoUqzMRuuKLWY
dW0+I0ks4gfFonFrmvde2oHgPeIWudlTgbAwvmLc+xbdrxcE2CYMwsiLAyKN
wJzPzFe9BF4P5iiWRFj0EXg/mKaCLwfzFBkRY9BF4P5imgi8H8xQZEWPQReD
+YpoIvB/MUGRFj0EXg/mKaCLwfzFBkRY9BF4P5imgi8H8xQZEWPQReD+YpoI
vB/MUGRFj0EXg/mKaCLwfzFBkRY9BF4P5imgi8H8xQZEWPQReD+YpoIvB/MU
GRE2BEFWy47jcY9bDzsRMuO43GPXQ87EQeMCp2VmA0lM9z2tkw9rXFjrOAIb
sK1sVHSCkbhTqaTQEkOjLHZpFvZe/Cs+QVQ6eCBrj8yiZb2MV3VdTT6pjvjC
9NSa7NBitC2lyYjo6WN5ZEWtY3W42HvVU3LU+Ty/gK6UispuqtfDK7JOijEb
y8OF2hpuNqr+5anyeX8BXSkQaOowKmxzAKKkrXVDGsax9opCw3A2Gyq2B5D0
8+JYluylxCljgqw6nfut3XgAW4/rfdwLoqK9dS1YxDK2jW1otMIWIRSPjjMW
tzDs2qLhdJJTUk+6jpKiR3WnMPWjjW3RR1dsLTSOrqAuY1WT76XGKiV2CyVu
6Kh4/awveGNziQ4FpF7g8PesunIqrTGVdyZwne7Dq6Fona2STrNM3NJGY0Xz
eDXf2KkuyDyglcwTSxHMkZmkSnNzQ651W71l1hFet5rspbSrbdjiFmnjWREV
GgiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgq2XHcbjHroediJlx3G4x66HnY
iDT/ACbyiSwG1tHHzMXQVzX5M4c52a++a+liBsbcDFsq7EK2LFZKeGVrY85+
bnNNxY7Nuvg1q/CaVteO0qcXq10JjMLwi5wccxAU0cumjLnyZhbmnVxa9f8A
ut/k5NNX4g+GrljkaA/rGXaQQRa+v0r1avA6mnWbWmHl0+OpqWisRPdaEXve
yk8W7lHdKb2Uni3co7pXj7PZ3eEXveyk8W7lHdKb2Uni3co7pTsd3hF73spP
Fu5R3Sm9lJ4t3KO6U7Hd4Re97KTxbuUd0pvZSeLdyjulOx3eEXveyk8W7lHd
Kg1TGRRtiu4R6YNIzje2s2vtQ7paKFm0fed+N3StE3KXDGiTT0szc1hkGjlL
7tvYX1izr8HpUJWpFXKbHsIrZI2U0c7y5wBuXDNB4dq2ubR95343dKCci1wn
fDRyGE3tMWtzrnV96x1OI1NBC+WeJslmg5rettc2JJ16hxINqir0WV9CY2Ga
KaNzhnEBoIA4De+sFZ58paWKlhqWMcYpM4lz+tzQ0gHgNzc7ONBukWnpMoYK
3EY6OKGUOIcXF9hm2FwLX2lbhAReZH6OJ7yL5rSbcSr9FlhR1UlPA+CZlTOb
NjaM4A32E6ratevgQWJFparKegpqh1O4SulY/Rlobw83e9qxYZlRHiNSIXUk
0V2ts+4cLlpdbUe8Cg36KvjKbNljjnpDBp2tdDI592PzgSBqGrXYe3vLb0FY
yvpWzsa5twLg8BsD/NBHppa52L1TJmuFK0DRktAHBax4eG/esFsV5dIxps57
Qe8SostdmNme1jXxQ/Pdn69gOoW9KDHjEtXDRB1EJTOXgNzIw/8AEO937a19
wiSsloc6ua4S55tnMDTbVwD03A9ACmaaLxrPxBNNF41n4gg9qsVFbj5meIoZ
hG17hcQD5mceuF9ptm2HDcqyaaLxrPxBfWyMf817XcRugqmWJkdkJiZmAEpf
AXgcDusuiyZcdxuMeuh52Ig0nybElwtqIpIz7mK9Pw6jkkdI+jpXPcblxhBJ
KoXyZfPOv/g4+Zi6Os+Hma07NOIrFr90Teug8go+QCywUlPSyGSnpqeJ5Fi5
kQBssyLab2neWEadY74e9NL4TfwpppfCb+FeEVV3vTS+E38KaaXwm/hXhEMP
eml8Jv4U00vhN/CvCIYe9NL4TfwpppfCb+FeEQw96aXwm/hUWppzURFpkzXZ
+fnW4eJZ0Qw129j/ACgcn/usW8UQY5gMOa7W4aAWPHrW2RBq24OGfNkjHFFb
+a972P8AKByf+62KII0NGyOn0Uh0l3FxOzWvRo6cgh0TXg7Q/rh71nRBiNNA
SCYIiQCASwal9fTwSNDXwxua05wDmAgHvrIiDGIIWy6QRRiS1s8NF7cayIiA
RcWOxYWUdLG5ro6aFhaLNLYwLcSzIgxvp4JL58Mbs7bnMBujKeGM3ZDG06tb
WgbBYe5ZEQR9w0pg0Bp4zENjSNnF3tpWaOKOJgZGxrGjgaLL0iD5ZoNyBc6t
Y2rW1tLPK57ICzRzmziTbN1WOrh1BbNEHkFhAsG7L7Euy17N2X2L0iD51ov1
rdXoQW12A9NgvqIKtlx3G4x62HnYiZcdxuMeuh52Igr/AMmBGe5o4KOP4WLp
K4XkzlWzAItJHPTRzGJsT2Tm1rADV7NqsEXypyPkDX1WGAd8O/3Xn0tSsVw9
GrpzNsuqIqXBl/hZp2PmxejD3agGsPSvbMvsHfe2M0dhtOYelb5hhhcUVOOX
+CNeWnGqO4Nj1p2+1eD8oWDG+ZjVCdV9YOzZ31p+nZGV0RVGmy5wuV+bLjFG
zXb5hP8ANTuq3AfOGl5FyrMYFgRV/qtwDzhpeRcnVbgHnDS8i5QLAir/AFW4
B5w0vIuTqtwDzhpeRcgsCKv9VuAecNLyLk6rcA84aXkXILAir/VbgHnDS8i5
Oq3APOGl5FyCwIq/1W4B5w0vIuTqtwDzhpeRcgsCKv8AVbgHnDS8i5eH5YYG
02GP0h/ynILGirzcrsCLbnKCk5Fy9dVuA+cNLyLkG/RV/quwHzgpeRcvnVdg
X0/Sck5BYUVe6rsD+n6TknJ1X4H9P0nJOQWFFXeq7A/p6k5JydV+B/T1JyTk
FiRV3qvwT6epOScnVfgn09Sck5BYkVc6r8E+naTknJ1X4J9O0nJOQWNFXOq/
Bfp2k5JydWGC/TtLyTkFjRVzqwwX6dpeScvhyuwRwscdpeTcgw5buByNxi3j
oediLT5V4/huIZPVGHYdVCtqaqRjjo2ENYGkG5J4veiD/9k=

--0-2102001682-1302638362=:57596
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

------------------------------------------------------------------------------
Forrester Wave Report - Recovery time is now measured in hours and minutes
not days. Key insights are discussed in the 2010 Forrester Wave Report as
part of an in-depth evaluation of disaster recovery service providers.
Forrester found the best-in-class provider in terms of services and vision.
Read this report now!  http://p.sf.net/sfu/ibm-webcastpromo
--0-2102001682-1302638362=:57596
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Pythoncard-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pythoncard-users

--0-2102001682-1302638362=:57596--