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. The image was too big. Reattach.<br> </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 <[email protected]><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). 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 </font><font class="Apple-style-span" face="'times new roman', 'new york', times, serif">knowledgeable </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 </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 </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. </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> 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. </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 </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># 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><...sizer code skipped ...></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, </div><div><span class="Apple-tab-span" style="white-space:pre;"> </span>height=self.data, </d iv><div><span class="Apple-tab-span" style="white-space:pre;"> </span>width=self.components.slider_width.GetValue() / 100.0, </div><div><span class="Apple-tab-span" style="white-space:pre;"> </span>align='center', </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"> </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--