SourceForge logo
SourceForge logo
Menu

pythoncard-cvs — Mailing list for CVS commit messages

You can subscribe to this list here.

2004 Jan
Feb
Mar
Apr
(45)
May
(185)
Jun
Jul
(36)
Aug
(205)
Sep
(98)
Oct
(107)
Nov
(6)
Dec
(3)
2005 Jan
(1)
Feb
(2)
Mar
(19)
Apr
(26)
May
(18)
Jun
Jul
(12)
Aug
(16)
Sep
(22)
Oct
(7)
Nov
(11)
Dec
(74)
2006 Jan
(14)
Feb
(1)
Mar
(3)
Apr
(3)
May
(14)
Jun
(5)
Jul
(20)
Aug
(10)
Sep
(1)
Oct
Nov
(4)
Dec
(1)
2007 Jan
Feb
Mar
Apr
May
Jun
(3)
Jul
(14)
Aug
Sep
Oct
(6)
Nov
(1)
Dec

Showing results of 993

1 2 3 .. 40 > >> (Page 1 of 40)
From: Kevin A. <ka...@us...> - 2007年11月15日 21:39:44
Update of /cvsroot/pythoncard/PythonCard/samples/widgets
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11676
Modified Files:
	widgets.rsrc.py 
Log Message:
fixed typo
Index: widgets.rsrc.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/samples/widgets/widgets.rsrc.py,v
retrieving revision 1.25
retrieving revision 1.26
diff -C2 -d -r1.25 -r1.26
*** widgets.rsrc.py	4 Oct 2004 19:03:11 -0000	1.25
--- widgets.rsrc.py	15 Nov 2007 21:39:44 -0000	1.26
***************
*** 309,313 ****
 'position':(100, 92), 
 'size':(180, 60), 
! 'text':'Use the checkboxes and buttons on the right to set the attributes of the widgets on the left.\n\nThe editable attribute only applies to TextField, PasswordFiled, and TextArea.', 
 },
 
--- 309,313 ----
 'position':(100, 92), 
 'size':(180, 60), 
! 'text':'Use the checkboxes and buttons on the right to set the attributes of the widgets on the left.\n\nThe editable attribute only applies to TextField, PasswordField, and TextArea.', 
 },
 
Update of /cvsroot/pythoncard/PythonCard/docs/html/dialogs
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20488
Modified Files:
	colordialog.html directorydialog.html filedialog.html 
	finddialog.html fontdialog.html messagedialog.html 
	multiplechoicedialog.html singlechoicedialog.html 
	textentrydialog.html 
Log Message:
Change wording to reflect use of wx.libs.DialogResults object as a return value
Index: textentrydialog.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/dialogs/textentrydialog.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** textentrydialog.html	17 Aug 2004 19:09:43 -0000	1.3
--- textentrydialog.html	31 Oct 2007 17:24:41 -0000	1.4
***************
*** 6,10 ****
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Dan Shafer">
 <title>Text Entry Dialog</title>
 </head>
--- 6,10 ----
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Phil Edwards">
 <title>Text Entry Dialog</title>
 </head>
***************
*** 90,96 ****
 
 <h2>Interacting With the Dialog</h2>
! The textEntryDialog component returns three values, stored 
! as elements of the Python dictionary called "results" returned by all
! PythonCard dialogs. These results are as shown in the following table.<br>
 <br>
 
--- 90,95 ----
 
 <h2>Interacting With the Dialog</h2>
! The textEntryDialog component returns a wxPython DialogResults object 
! which contains 3 attributes, as shown in the following table<br>
 <br>
 
Index: colordialog.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/dialogs/colordialog.html,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** colordialog.html	17 Aug 2004 19:09:43 -0000	1.2
--- colordialog.html	31 Oct 2007 17:24:41 -0000	1.3
***************
*** 6,10 ****
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Dan Shafer">
 <title>Color Dialog</title>
 
--- 6,10 ----
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Phil Edwards">
 <title>Color Dialog</title>
 
***************
*** 30,36 ****
 
 <h2>Interacting With the Dialog</h2>
! The colorDialog component returns two values, stored as elements 
! of the Python dictionary called "results" returned by all PythonCard dialogs. 
! These results are as shown in the following table.<br>
 <br>
 
--- 30,35 ----
 
 <h2>Interacting With the Dialog</h2>
! The colorDialog component returns a wxPython DialogResults object 
! which contains 2 attributes, as shown in the following table<br>
 <br>
 
Index: multiplechoicedialog.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/dialogs/multiplechoicedialog.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** multiplechoicedialog.html	17 Aug 2004 19:09:43 -0000	1.3
--- multiplechoicedialog.html	31 Oct 2007 17:24:41 -0000	1.4
***************
*** 6,10 ****
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Dan Shafer">
 <title>Multiple Choice Dialog</title>
 </head>
--- 6,10 ----
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Phil Edwards">
 <title>Multiple Choice Dialog</title>
 </head>
***************
*** 70,76 ****
 
 <h2>Interacting With the Dialog</h2>
! The multipleChoiceDialog component returns two values, stored as elements
! of the Python dictionary called "results" returned by all PythonCard dialogs. 
! These results are as shown in the following table.<br>
 <br>
 
--- 70,75 ----
 
 <h2>Interacting With the Dialog</h2>
! The multipleChoiceDialog component returns a wxPython DialogResults object 
! which contains 2 attributes, as shown in the following table<br>
 <br>
 
Index: filedialog.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/dialogs/filedialog.html,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** filedialog.html	18 Sep 2004 16:59:15 -0000	1.6
--- filedialog.html	31 Oct 2007 17:24:41 -0000	1.7
***************
*** 6,13 ****
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Dan Shafer">
 <title>File Dialog</title>
 
! <meta name="generator" content="Namo WebEditor v5.0(Trial)">
 </head>
 <body>
--- 6,13 ----
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Phil Edwards">
 <title>File Dialog</title>
 
! <meta name="generator" content="Bluefish 1.0.5">
 </head>
 <body>
***************
*** 117,123 ****
 confirmed with a prompt dialog.</p>
 <h2>Interacting With the Dialog</h2>
! The fileDialog component returns its values, stored as attributes 
! of an instance of the DialogResults class called &quot;results&quot; returned by all PythonCard dialogs. 
! These results are as shown in the following table.<br>
 <br>
 
--- 117,122 ----
 confirmed with a prompt dialog.</p>
 <h2>Interacting With the Dialog</h2>
! The fileDialog component returns a wxPython DialogResults object 
! which contains 2 attributes, as shown in the following table<br>
 <br>
 
Index: fontdialog.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/dialogs/fontdialog.html,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** fontdialog.html	17 Aug 2004 19:09:43 -0000	1.2
--- fontdialog.html	31 Oct 2007 17:24:41 -0000	1.3
***************
*** 6,10 ****
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Dan Shafer">
 <title>Font Dialog</title>
 </head>
--- 6,10 ----
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Phil Edwards">
 <title>Font Dialog</title>
 </head>
***************
*** 56,62 ****
 
 <h2>Interacting With the Dialog</h2>
! The fontDialog component returns three values, stored as elements 
! of the Python dictionary called "results" returned by all PythonCard dialogs. 
! These results are as shown in the following table.<br>
 <br>
 
--- 56,61 ----
 
 <h2>Interacting With the Dialog</h2>
! The fontDialog component returns a wxPython DialogResults object 
! which contains 3 attributes, as shown in the following table<br>
 <br>
 
Index: singlechoicedialog.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/dialogs/singlechoicedialog.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** singlechoicedialog.html	17 Aug 2004 19:09:43 -0000	1.3
--- singlechoicedialog.html	31 Oct 2007 17:24:41 -0000	1.4
***************
*** 6,10 ****
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Dan Shafer">
 <title>Single Choice Dialog</title>
 
--- 6,10 ----
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Phil Edwards">
 <title>Single Choice Dialog</title>
 
***************
*** 71,77 ****
 
 <h2>Interacting With the Dialog</h2>
! The singleChoiceDialog component returns two values, stored as elements 
! of the Python dictionary called "results" returned by all PythonCard dialogs. 
! These results are as shown in the following table.<br>
 <br>
 
--- 71,77 ----
 
 <h2>Interacting With the Dialog</h2>
! The singleChoiceDialog component returns a wxPython DialogResults object 
! which contains 2 attributes, as shown in the following table<br>
! 
 <br>
 
Index: messagedialog.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/dialogs/messagedialog.html,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** messagedialog.html	17 Aug 2004 19:09:43 -0000	1.2
--- messagedialog.html	31 Oct 2007 17:24:41 -0000	1.3
***************
*** 6,10 ****
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Dan Shafer">
 <title>Message Dialog</title>
 
--- 6,10 ----
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Phil Edwards">
 <title>Message Dialog</title>
 
***************
*** 186,193 ****
 
 <h2>Interacting With the Dialog</h2>
! The messageDialog component returns two values, stored as elements
! of the Python dictionary called "results" returned by all PythonCard
! dialogs. These results are as shown in the following table.<br>
! <br>
 
 <table cellpadding="2" cellspacing="2" border="1" width="80%">
--- 186,191 ----
 
 <h2>Interacting With the Dialog</h2>
! The messageDialog component returns a wxPython DialogResults object 
! which contains 2 attributes, as shown in the following table<br> <br>
 
 <table cellpadding="2" cellspacing="2" border="1" width="80%">
Index: finddialog.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/dialogs/finddialog.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** finddialog.html	17 Aug 2004 19:09:43 -0000	1.3
--- finddialog.html	31 Oct 2007 17:24:41 -0000	1.4
***************
*** 6,13 ****
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Dan Shafer">
 <title>Find Dialog</title>
 
! <meta name="generator" content="Namo WebEditor v5.0(Trial)">
 </head>
 <body>
--- 6,13 ----
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Phil Edwards">
 <title>Find Dialog</title>
 
! <meta name="generator" content="Bluefish 1.0.5">
 </head>
 <body>
***************
*** 80,86 ****
 </table>
 <h2>Interacting With the Dialog</h2>
! The findDialog component returns four values, stored as elements of
! the Python dictionary called &quot;results&quot; returned by all PythonCard dialogs.
! These results are as shown in the following table.<br>
 <br>
 
--- 80,85 ----
 </table>
 <h2>Interacting With the Dialog</h2>
! The findDialog component returns a wxPython DialogResults object 
! which contains 4 attributes, as shown in the following table<br>
 <br>
 
Index: directorydialog.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/dialogs/directorydialog.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** directorydialog.html	17 Aug 2004 19:09:43 -0000	1.3
--- directorydialog.html	31 Oct 2007 17:24:41 -0000	1.4
***************
*** 6,13 ****
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Dan Shafer">
 <title>Directory Dialog</title>
 
! <meta name="generator" content="Namo WebEditor v5.0(Trial)">
 </head>
 <body>
--- 6,13 ----
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Phil Edwards">
 <title>Directory Dialog</title>
 
! <meta name="generator" content="Bluefish 1.0.5">
 </head>
 <body>
***************
*** 83,89 ****
 </p>
 <h2>Interacting With the Dialog</h2>
! The directoryDialog component returns two values, stored as elements
! of the Python dictionary called &quot;results&quot; returned by all PythonCard
! dialogs. These results are as shown in the following table.<br>
 <br>
 
--- 83,88 ----
 </p>
 <h2>Interacting With the Dialog</h2>
! The alertDialog component returns a wxPython DialogResults object 
! which contains 2 attributes, as shown in the following table<br>
 <br>
 
From: Phil E. <l2...@us...> - 2007年10月31日 17:24:20
Update of /cvsroot/pythoncard/PythonCard/docs/html/dialogs
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20464
Modified Files:
	alertdialog.html 
Log Message:
Change wording to reflect use of wx.libs.DialogResults object as a return value
Index: alertdialog.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/dialogs/alertdialog.html,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** alertdialog.html	17 Aug 2004 19:09:34 -0000	1.2
--- alertdialog.html	31 Oct 2007 17:24:20 -0000	1.3
***************
*** 6,10 ****
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Dan Shafer">
 <title>Alert Dialog</title>
 
--- 6,10 ----
 content="text/html; charset=ISO-8859-1">
 
! <meta name="author" content="Phil Edwards">
 <title>Alert Dialog</title>
 
***************
*** 63,69 ****
 <code>result = dialog.alertDialog(self, 'a message', 'a title')</code><br>
 <h2>Interacting With the Dialog</h2>
! The alertDialog component returns two values, stored as elements
! of the Python dictionary called "results" returned by all PythonCard
! dialogs. These results are as shown in the following table.<br>
 <br>
 
--- 63,68 ----
 <code>result = dialog.alertDialog(self, 'a message', 'a title')</code><br>
 <h2>Interacting With the Dialog</h2>
! The alertDialog component returns a wxPython DialogResults object 
! which contains 2 attributes, as shown in the following table<br>
 <br>
 
Update of /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19502
Modified Files:
	changelog.txt customDialogs.py helpAbout.rsrc.py 
	outputWindow.gtk.rsrc.py prefsDialog.gtk.rsrc.py 
	propertiesDialog.gtk.rsrc.py propertiesDialog.rsrc.py 
	readme.txt standaloneBuilder.gtk.rsrc.py standaloneBuilder.py 
	standaloneBuilder.rsrc.py 
Added Files:
	buildDialog.rsrc.py helpAbout.gtk.rsrc.py helpManual.rsrc.py 
Log Message:
Fixes and enhancements for standaloneBuilder v0.3.1, see changelog file for full details
Index: standaloneBuilder.rsrc.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/standaloneBuilder.rsrc.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** standaloneBuilder.rsrc.py	3 Nov 2006 14:56:25 -0000	1.8
--- standaloneBuilder.rsrc.py	24 Oct 2007 00:51:18 -0000	1.9
***************
*** 1,586 ****
! {'application':{'type':'Application',
! 'name':'Template',
! 'backgrounds': [
! {'type':'Background',
! 'name':'standaloneBuilder',
! 'title':u'PythonCard standaloneBuilder',
! 'size':(800, 590),
! 'statusBar':1,
! 
! 'menubar': {'type':'MenuBar',
[...1148 lines suppressed...]
! },
! 
! {'type':'StaticBox', 
! 'name':'StaticBox4', 
! 'position':(5, 370), 
! 'size':(380, 150), 
! 'label':u'Pixmap files:', 
! },
! 
! {'type':'StaticBox', 
! 'name':'StaticBox5', 
! 'position':(405, 370), 
! 'size':(380, 150), 
! 'label':u'Other files:', 
! },
! 
! ] # end components
! } # end background
! ] # end backgrounds
! } }
Index: propertiesDialog.gtk.rsrc.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/propertiesDialog.gtk.rsrc.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** propertiesDialog.gtk.rsrc.py	12 May 2006 16:26:20 -0000	1.1
--- propertiesDialog.gtk.rsrc.py	24 Oct 2007 00:51:18 -0000	1.2
***************
*** 3,147 ****
 'title':'Project properties',
 'position':(468, 29),
! 'size':(450, 385),
 'components': [
 
 {'type':'TextField', 
 'name':'buildPath', 
! 'position':(130, 5), 
 'size':(265, -1), 
- 'actionBindings':{}, 
 },
 
 {'type':'Button', 
 'name':'buildPathBtn', 
! 'position':(400, 5), 
 'size':(25, 22), 
! 'actionBindings':{}, 
! 'label':'...', 
 },
 
 {'type':'TextField', 
 'name':'distPath', 
! 'position':(130, 40), 
 'size':(265, -1), 
- 'actionBindings':{}, 
 },
 
 {'type':'Button', 
 'name':'distPathBtn', 
! 'position':(400, 40), 
 'size':(25, 22), 
! 'actionBindings':{}, 
! 'label':'...', 
 },
 
 {'type':'TextField', 
 'name':'pixmapsPath', 
! 'position':(130, 75), 
 'size':(265, -1), 
- 'actionBindings':{}, 
 },
 
 {'type':'Button', 
 'name':'pixmapsPathBtn', 
! 'position':(400, 75), 
 'size':(25, 22), 
! 'actionBindings':{}, 
! 'label':'...', 
 },
 
 {'type':'TextField', 
 'name':'tarballPath', 
! 'position':(130, 110), 
 'size':(265, -1), 
- 'actionBindings':{}, 
 },
 
 {'type':'Button', 
 'name':'tarballsPathBtn', 
! 'position':(400, 110), 
 'size':(25, 22), 
! 'actionBindings':{}, 
! 'label':'...', 
 },
 
 {'type':'TextField', 
 'name':'appPublisher', 
! 'position':(130, 145), 
 'size':(265, -1), 
- 'actionBindings':{}, 
 },
 
 {'type':'TextField', 
 'name':'appURL', 
! 'position':(130, 180), 
 'size':(265, -1), 
- 'actionBindings':{}, 
 },
 
 {'type':'TextField', 
 'name':'appLicence', 
! 'position':(130, 215), 
 'size':(265, -1), 
- 'actionBindings':{}, 
 },
 
 {'type':'Button', 
 'name':'appLicenceBtn', 
! 'position':(400, 215), 
 'size':(25, 22), 
! 'actionBindings':{}, 
! 'label':'...', 
 },
 
 {'type':'Choice', 
 'name':'buildType', 
! 'position':(125, 250), 
 'size':(140, -1), 
- 'actionBindings':{}, 
 'items':[u'Single file', u'Single directory'], 
! 'stringSelection':'Single directory', 
 },
 
 {'type':'CheckBox', 
 'name':'asciiChk', 
! 'position':(120, 285), 
! 'actionBindings':{}, 
! 'label':'No encoding', 
 },
 
 {'type':'CheckBox', 
 'name':'consoleChk', 
! 'position':(250, 285), 
! 'actionBindings':{}, 
! 'label':'Console', 
 },
 
 {'type':'CheckBox', 
 'name':'compressChk', 
! 'position':(345, 285), 
! 'actionBindings':{}, 
! 'label':'Compress', 
 },
 
 {'type':'CheckBox', 
 'name':'striplibsChk', 
! 'position':(120, 305), 
! 'actionBindings':{}, 
! 'label':'Strip libs (Linux)', 
 },
 
 {'type':'CheckBox', 
 'name':'optimizeChk', 
! 'position':(250, 305), 
! 'actionBindings':{}, 
! 'label':'Optimize', 
 },
 
 {'type':'CheckBox', 
 'name':'debugChk', 
! 'position':(345, 305), 
! 'actionBindings':{}, 
! 'label':'Debug', 
 },
 
--- 3,135 ----
 'title':'Project properties',
 'position':(468, 29),
! 'size':(470, 405),
 'components': [
 
+ {'type':'CheckBox', 
+ 'name':'runInno', 
+ 'position':(150, 335), 
+ 'size':(279, -1), 
+ 'label':u'Run Inno Setup automatically (Windows)', 
+ },
+ 
 {'type':'TextField', 
 'name':'buildPath', 
! 'position':(155, 15), 
 'size':(265, -1), 
 },
 
 {'type':'Button', 
 'name':'buildPathBtn', 
! 'position':(425, 15), 
 'size':(25, 22), 
! 'label':u'...', 
 },
 
 {'type':'TextField', 
 'name':'distPath', 
! 'position':(155, 50), 
 'size':(265, -1), 
 },
 
 {'type':'Button', 
 'name':'distPathBtn', 
! 'position':(425, 50), 
 'size':(25, 22), 
! 'label':u'...', 
 },
 
 {'type':'TextField', 
 'name':'pixmapsPath', 
! 'position':(155, 85), 
 'size':(265, -1), 
 },
 
 {'type':'Button', 
 'name':'pixmapsPathBtn', 
! 'position':(425, 85), 
 'size':(25, 22), 
! 'label':u'...', 
 },
 
 {'type':'TextField', 
 'name':'tarballPath', 
! 'position':(155, 120), 
 'size':(265, -1), 
 },
 
 {'type':'Button', 
 'name':'tarballsPathBtn', 
! 'position':(425, 120), 
 'size':(25, 22), 
! 'label':u'...', 
 },
 
 {'type':'TextField', 
 'name':'appPublisher', 
! 'position':(155, 155), 
 'size':(265, -1), 
 },
 
 {'type':'TextField', 
 'name':'appURL', 
! 'position':(155, 190), 
 'size':(265, -1), 
 },
 
 {'type':'TextField', 
 'name':'appLicence', 
! 'position':(155, 225), 
 'size':(265, -1), 
 },
 
 {'type':'Button', 
 'name':'appLicenceBtn', 
! 'position':(425, 225), 
 'size':(25, 22), 
! 'label':u'...', 
 },
 
 {'type':'Choice', 
 'name':'buildType', 
! 'position':(155, 260), 
 'size':(140, -1), 
 'items':[u'Single file', u'Single directory'], 
! 'stringSelection':u'Single directory', 
 },
 
 {'type':'CheckBox', 
 'name':'asciiChk', 
! 'position':(150, 295), 
! 'label':u'No encoding', 
 },
 
 {'type':'CheckBox', 
 'name':'consoleChk', 
! 'position':(280, 295), 
! 'label':u'Console', 
 },
 
 {'type':'CheckBox', 
 'name':'compressChk', 
! 'position':(375, 295), 
! 'label':u'Compress', 
 },
 
 {'type':'CheckBox', 
 'name':'striplibsChk', 
! 'position':(150, 315), 
! 'label':u'Strip libs (Linux)', 
 },
 
 {'type':'CheckBox', 
 'name':'optimizeChk', 
! 'position':(280, 315), 
! 'label':u'Optimize', 
 },
 
 {'type':'CheckBox', 
 'name':'debugChk', 
! 'position':(375, 315), 
! 'label':u'Debug', 
 },
 
***************
*** 149,155 ****
 'id':5100, 
 'name':'btnOK', 
! 'position':(270, 340), 
! 'actionBindings':{}, 
! 'label':'OK', 
 },
 
--- 137,142 ----
 'id':5100, 
 'name':'btnOK', 
! 'position':(285, 370), 
! 'label':u'OK', 
 },
 
***************
*** 157,226 ****
 'id':5101, 
 'name':'btnCancel', 
! 'position':(355, 340), 
! 'actionBindings':{}, 
! 'label':'Cancel', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText9', 
! 'position':(25, 220), 
! 'actionBindings':{}, 
! 'text':'App licence file', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText8', 
! 'position':(20, 185), 
! 'actionBindings':{}, 
! 'text':'Application URL', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText7', 
! 'position':(30, 150), 
! 'actionBindings':{}, 
! 'text':'App publisher', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText6', 
! 'position':(30, 285), 
! 'actionBindings':{}, 
! 'text':'Build options', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText5', 
! 'position':(15, 255), 
! 'actionBindings':{}, 
! 'text':'Deployment type', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText4', 
! 'position':(15, 115), 
! 'actionBindings':{}, 
! 'text':'Tarballs directory', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText3', 
! 'position':(15, 80), 
! 'actionBindings':{}, 
! 'text':'Pixmaps directory', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText2', 
! 'position':(5, 45), 
! 'actionBindings':{}, 
! 'text':'Distribution directory', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText1', 
! 'position':(30, 10), 
! 'actionBindings':{}, 
! 'text':'Build directory', 
 },
 
--- 144,204 ----
 'id':5101, 
 'name':'btnCancel', 
! 'position':(375, 370), 
! 'label':u'Cancel', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText9', 
! 'position':(50, 230), 
! 'text':u'App licence file', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText8', 
! 'position':(45, 195), 
! 'text':u'Application URL', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText7', 
! 'position':(55, 160), 
! 'text':u'App publisher', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText6', 
! 'position':(60, 300), 
! 'text':u'Build options', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText5', 
! 'position':(35, 265), 
! 'text':u'Deployment type', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText4', 
! 'position':(35, 125), 
! 'text':u'Tarballs directory', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText3', 
! 'position':(25, 90), 
! 'size':(118, -1), 
! 'text':u'Pixmaps directory', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText2', 
! 'position':(10, 55), 
! 'text':u'Distribution directory', 
 },
 
 {'type':'StaticText', 
 'name':'StaticText1', 
! 'position':(50, 20), 
! 'text':u'Build directory', 
 },
 
--- NEW FILE: helpAbout.gtk.rsrc.py ---
{'type':'CustomDialog',
 'name':'dlgAbout',
 'title':'About standaloneBuilder:',
 'position':(129, 133),
 'size':(520, 360),
 'strings': {
 },
 'components': [
{'type':'Image', 
 'name':'Image1', 
 'position':(10, 10), 
 'file':u'pixmaps/apollon.png', 
 },
{'type':'StaticText', 
 'name':'versionString', 
 'position':(70, 35), 
 'font':{'faceName': u'Trebuchet MS', 'family': 'sansSerif', 'size': 14}, 
 'text':u'standaloneBuilder version', 
 },
{'type':'Notebook', 
 'name':'notebook', 
 'position':(5, 65), 
 'size':(500, 235), 
 },
{'type':'Button', 
 'id':5100, 
 'name':'btnOK', 
 'position':(425, 310), 
 'label':u'Close', 
 },
] # end components
} # end CustomDialog
--- NEW FILE: helpManual.rsrc.py ---
{'type':'CustomDialog',
 'name':'standaloneBuilder Manual',
 'title':'PythonCard standaloneBuilder Tool - Online Manual',
 'position':(129, 133),
 'size':(1000, 700),
 'components': [
{'type':'HtmlWindow', 
 'name':'HtmlWindow', 
 'position':(4, 7), 
 'size':(983, 641), 
 'backgroundColor':(255, 255, 255), 
 },
] # end components
} # end CustomDialog
Index: outputWindow.gtk.rsrc.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/outputWindow.gtk.rsrc.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** outputWindow.gtk.rsrc.py	12 May 2006 16:26:20 -0000	1.1
--- outputWindow.gtk.rsrc.py	24 Oct 2007 00:51:18 -0000	1.2
***************
*** 10,18 ****
 'components': [
 
 {'type':'TextArea', 
 'name':'importError', 
 'position':(10, 10), 
 'size':(375, 205), 
- 'actionBindings':{}, 
 'editable':False, 
 'enabled':False, 
--- 10,68 ----
 'components': [
 
+ {'type':'StaticText', 
+ 'name':'txt8b', 
+ 'position':(200, 60), 
+ 'enabled':False, 
+ 'font':{'style': 'bold', 'faceName': u'Sans', 'family': 'sansSerif', 'size': 10}, 
+ 'text':u'Done', 
+ 'visible':False, 
+ },
+ 
+ {'type':'StaticText', 
+ 'name':'txt8a', 
+ 'position':(10, 60), 
+ 'enabled':False, 
+ 'text':u'Creating tarball:', 
+ 'visible':False, 
+ },
+ 
+ {'type':'StaticText', 
+ 'name':'txt7b', 
+ 'position':(200, 35), 
+ 'enabled':False, 
+ 'font':{'style': 'bold', 'faceName': u'Sans', 'family': 'sansSerif', 'size': 10}, 
+ 'text':u'Done', 
+ 'visible':False, 
+ },
+ 
+ {'type':'StaticText', 
+ 'name':'txt7a', 
+ 'position':(10, 35), 
+ 'enabled':False, 
+ 'text':u'Creating manifest:', 
+ 'visible':False, 
+ },
+ 
+ {'type':'StaticText', 
+ 'name':'txt6b', 
+ 'position':(200, 10), 
+ 'enabled':False, 
+ 'font':{'style': 'bold', 'faceName': u'Sans', 'family': 'sansSerif', 'size': 10}, 
+ 'text':u'Done', 
+ 'visible':False, 
+ },
+ 
+ {'type':'StaticText', 
+ 'name':'txt6a', 
+ 'position':(10, 10), 
+ 'enabled':False, 
+ 'text':u'Creating temp directories:', 
+ 'visible':False, 
+ },
+ 
 {'type':'TextArea', 
 'name':'importError', 
 'position':(10, 10), 
 'size':(375, 205), 
 'editable':False, 
 'enabled':False, 
***************
*** 22,29 ****
 {'type':'Button', 
 'name':'clipBoardBtn', 
! 'position':(95, 225), 
! 'actionBindings':{}, 
! 'label':'Clipboard', 
! 'toolTip':'Click here to copy the PythonCard component imports line to the Windows clipboard', 
 },
 
--- 72,78 ----
 {'type':'Button', 
 'name':'clipBoardBtn', 
! 'position':(100, 225), 
! 'label':u'Clipboard', 
! 'toolTip':u'Click here to copy the PythonCard component imports line to the Windows clipboard', 
 },
 
***************
*** 31,36 ****
 'name':'closeBtn', 
 'position':(10, 225), 
! 'actionBindings':{}, 
! 'label':'Close', 
 },
 
--- 80,84 ----
 'name':'closeBtn', 
 'position':(10, 225), 
! 'label':u'Close', 
 },
 
***************
*** 38,43 ****
 'name':'txt5', 
 'position':(10, 90), 
! 'actionBindings':{}, 
! 'text':'Returned messages:', 
 },
 
--- 86,91 ----
 'name':'txt5', 
 'position':(10, 90), 
! 'size':(132, -1), 
! 'text':u'Returned messages:', 
 },
 
***************
*** 46,50 ****
 'position':(10, 105), 
 'size':(375, 110), 
- 'actionBindings':{}, 
 },
 
--- 94,97 ----
***************
*** 52,57 ****
 'name':'txt4c', 
 'position':(145, 70), 
! 'actionBindings':{}, 
! 'text':'please wait...', 
 'visible':False, 
 },
--- 99,103 ----
 'name':'txt4c', 
 'position':(145, 70), 
! 'text':u'please wait...', 
 'visible':False, 
 },
***************
*** 60,66 ****
 'name':'txt4b', 
 'position':(145, 70), 
- 'actionBindings':{}, 
 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 
! 'text':'Done', 
 'visible':False, 
 },
--- 106,111 ----
 'name':'txt4b', 
 'position':(145, 70), 
 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 
! 'text':u'Done', 
 'visible':False, 
 },
***************
*** 69,74 ****
 'name':'txt4a', 
 'position':(10, 70), 
! 'actionBindings':{}, 
! 'text':'Rebuilding distributable:', 
 'visible':False, 
 },
--- 114,118 ----
 'name':'txt4a', 
 'position':(10, 70), 
! 'text':u'Rebuilding distributable:', 
 'visible':False, 
 },
***************
*** 77,82 ****
 'name':'txt3c', 
 'position':(145, 50), 
! 'actionBindings':{}, 
! 'text':'please wait...', 
 'visible':False, 
 },
--- 121,125 ----
 'name':'txt3c', 
 'position':(145, 50), 
! 'text':u'please wait...', 
 'visible':False, 
 },
***************
*** 85,91 ****
 'name':'txt3b', 
 'position':(145, 50), 
- 'actionBindings':{}, 
 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 
! 'text':'Done', 
 'visible':False, 
 },
--- 128,133 ----
 'name':'txt3b', 
 'position':(145, 50), 
 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 
! 'text':u'Done', 
 'visible':False, 
 },
***************
*** 94,99 ****
 'name':'txt3a', 
 'position':(10, 50), 
! 'actionBindings':{}, 
! 'text':'Rebuilding application:', 
 'visible':False, 
 },
--- 136,140 ----
 'name':'txt3a', 
 'position':(10, 50), 
! 'text':u'Rebuilding application:', 
 'visible':False, 
 },
***************
*** 102,108 ****
 'name':'txt2b', 
 'position':(145, 30), 
- 'actionBindings':{}, 
 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 
! 'text':'Done', 
 'visible':False, 
 },
--- 143,148 ----
 'name':'txt2b', 
 'position':(145, 30), 
 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 
! 'text':u'Done', 
 'visible':False, 
 },
***************
*** 111,116 ****
 'name':'txt2a', 
 'position':(10, 30), 
! 'actionBindings':{}, 
! 'text':'Rebuilding versioninfo file:', 
 'visible':False, 
 },
--- 151,155 ----
 'name':'txt2a', 
 'position':(10, 30), 
! 'text':u'Rebuilding versioninfo file:', 
 'visible':False, 
 },
***************
*** 119,125 ****
 'name':'txt1b', 
 'position':(145, 10), 
- 'actionBindings':{}, 
 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 
! 'text':'Done', 
 'visible':False, 
 },
--- 158,163 ----
 'name':'txt1b', 
 'position':(145, 10), 
 'font':{'style': 'bold', 'faceName': 'Verdana', 'family': 'sansSerif', 'size': 8}, 
! 'text':u'Done', 
 'visible':False, 
 },
***************
*** 128,133 ****
 'name':'txt1a', 
 'position':(10, 10), 
! 'actionBindings':{}, 
! 'text':'Rebuilding spec file:', 
 'visible':False, 
 },
--- 166,170 ----
 'name':'txt1a', 
 'position':(10, 10), 
! 'text':u'Rebuilding spec file:', 
 'visible':False, 
 },
--- NEW FILE: buildDialog.rsrc.py ---
{'type':'CustomDialog',
 'name':'buildType',
 'title':'Select Linux build type',
 'position':(169, 114),
 'size':(260, 145),
 'components': [
{'type':'RadioGroup', 
 'name':'buildType', 
 'position':(95, 15), 
 'size':(158, 80), 
 'items':['Tarball only', 'Full binary'], 
 'label':u'Select build type', 
 'layout':'vertical', 
 'max':1, 
 'stringSelection':u'Tarball only', 
 },
{'type':'Image', 
 'name':'Image1', 
 'position':(0, 5), 
 'size':(80, 96), 
 'file':u'pixmaps/tuxlogo.png', 
 },
{'type':'Button', 
 'id':5100, 
 'name':'btnOK', 
 'position':(9, 110), 
 'default':1, 
 'label':u'OK', 
 },
{'type':'Button', 
 'id':5101, 
 'name':'btnCancel', 
 'position':(100, 110), 
 'label':u'Cancel', 
 },
] # end components
} # end CustomDialog
Index: customDialogs.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/customDialogs.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** customDialogs.py	3 Nov 2006 14:56:25 -0000	1.7
--- customDialogs.py	24 Oct 2007 00:51:18 -0000	1.8
***************
*** 102,105 ****
--- 102,124 ----
 arg.append(os.path.join(dirname,item))
 
+ class buildType(CustomDialog):
+ """Select the build type required on Linux platforms"""
+ 
+ def __init__(self, aBg):
+ path = os.path.join(aBg.application.applicationDirectory, 'buildDialog')
+ aDialogRsrc = resource.ResourceFile(model.internationalResourceName(path)).getResource()
+ CustomDialog.__init__(self, aBg, aDialogRsrc)
+ self.parent = aBg
+ 
+ def getType(self):
+ bType = self.components.buildType.stringSelection
+ return bType
+ 
+ def on_btnOK_mouseClick(self, event):
+ event.Skip()
+ 
+ def on_btnCancel_mouseClick(self, event):
+ event.Skip()
+ 
 class versionDialog(CustomDialog):
 """Displays a dialog for the next release version number"""
***************
*** 128,131 ****
--- 147,160 ----
 def on_btnCancel_mouseClick(self, event):
 event.Skip()
+ 
+ class helpManual(CustomDialog):
+ """Displays an HTML based about box"""
+ 
+ def __init__(self, aBg, pageName=None):
+ path = os.path.join(aBg.application.applicationDirectory, 'helpManual')
+ aDialogRsrc = resource.ResourceFile(model.internationalResourceName(path)).getResource()
+ CustomDialog.__init__(self, aBg, aDialogRsrc)
+ self.parent = aBg
+ self.components.HtmlWindow.text = pageName
 
 class HTMLHelp(CustomDialog):
***************
*** 137,141 ****
 CustomDialog.__init__(self, aBg, aDialogRsrc)
 self.parent = aBg
! self.components.notebook.SetSize((660,270))
 
 bgval = self.GetBackgroundColour()
--- 166,177 ----
 CustomDialog.__init__(self, aBg, aDialogRsrc)
 self.parent = aBg
! self.components.notebook.SetSize((505,240))
! 
! if sys.platform.startswith('win32'):
! fontSize = 2
! else:
! fontSize = 2
! 
! if links is None: links = ['doc/about.html', 'doc/author.html', 'doc/license.html']
 
 bgval = self.GetBackgroundColour()
***************
*** 145,151 ****
 aboutPanel = wx.Panel(self.components.notebook, -1)
 aboutPanelHtmlWindow = wx.html.HtmlWindow(aboutPanel, -1)
! aboutPanelHtmlWindow.SetSize((660,270))
 aboutPanelHtmlWindow.SetPosition((1,1))
! aboutPanelHtmlWindow.LoadPage('doc/about.html')
 aboutPanelHtmlWindow.SetBackgroundColour(bgval)
 self.components.notebook.AddPage(aboutPanel, 'About', True)
--- 181,188 ----
 aboutPanel = wx.Panel(self.components.notebook, -1)
 aboutPanelHtmlWindow = wx.html.HtmlWindow(aboutPanel, -1)
! aboutPanelHtmlWindow.SetSize((495,210))
 aboutPanelHtmlWindow.SetPosition((1,1))
! pText = open(links[0]).read() % locals()
! aboutPanelHtmlWindow.SetPage(pText)
 aboutPanelHtmlWindow.SetBackgroundColour(bgval)
 self.components.notebook.AddPage(aboutPanel, 'About', True)
***************
*** 153,159 ****
 authorPanel = wx.Panel(self.components.notebook, -1)
 authorPanelHtmlWindow = wx.html.HtmlWindow(authorPanel, -1)
! authorPanelHtmlWindow.SetSize((660,270))
 authorPanelHtmlWindow.SetPosition((1,1))
! authorPanelHtmlWindow.LoadPage('doc/author.html')
 authorPanelHtmlWindow.SetBackgroundColour(bgval)
 self.components.notebook.AddPage(authorPanel, 'Author', False)
--- 190,197 ----
 authorPanel = wx.Panel(self.components.notebook, -1)
 authorPanelHtmlWindow = wx.html.HtmlWindow(authorPanel, -1)
! authorPanelHtmlWindow.SetSize((495,210))
 authorPanelHtmlWindow.SetPosition((1,1))
! pText = open(links[1]).read() % locals()
! authorPanelHtmlWindow.SetPage(pText)
 authorPanelHtmlWindow.SetBackgroundColour(bgval)
 self.components.notebook.AddPage(authorPanel, 'Author', False)
***************
*** 161,167 ****
 licensePanel = wx.Panel(self.components.notebook, -1)
 licensePanelHtmlWindow = wx.html.HtmlWindow(licensePanel, -1)
! licensePanelHtmlWindow.SetSize((660,270))
 licensePanelHtmlWindow.SetPosition((1,1))
! licensePanelHtmlWindow.LoadPage('doc/license.html')
 licensePanelHtmlWindow.SetBackgroundColour(bgval)
 self.components.notebook.AddPage(licensePanel, 'License', False)
--- 199,206 ----
 licensePanel = wx.Panel(self.components.notebook, -1)
 licensePanelHtmlWindow = wx.html.HtmlWindow(licensePanel, -1)
! licensePanelHtmlWindow.SetSize((495,210))
 licensePanelHtmlWindow.SetPosition((1,1))
! pText = open(links[2]).read() % locals()
! licensePanelHtmlWindow.SetPage(pText)
 licensePanelHtmlWindow.SetBackgroundColour(bgval)
 self.components.notebook.AddPage(licensePanel, 'License', False)
***************
*** 531,534 ****
--- 570,574 ----
 #except:
 # pass
+ self.components.runInno.checked = self.parent.project.getboolean('Project', 'autoRunInnoSetup')
 
 def on_buildPathBtn_mouseClick(self, event):
***************
*** 611,614 ****
--- 651,656 ----
 else:
 self.parent.project.set('Project', 'onedir', '0')
+ self.parent.project.set('Project', 'autoRunInnoSetup', str(int(self.components.runInno.checked)))
+ 
 if self.parent.project != old: self.parent.documentChanged = True
 event.Skip()
Index: standaloneBuilder.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/standaloneBuilder.py,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** standaloneBuilder.py	28 Jul 2007 23:12:00 -0000	1.17
--- standaloneBuilder.py	24 Oct 2007 00:51:18 -0000	1.18
***************
*** 35,44 ****
 import time
 import pprint
 
 # pythoncard imports
 import wx
- # KEA 2007年07月28日
- # unused...
- #from wxPython.html import wxHtmlEasyPrinting
 from PythonCard import dialog, model, util
 from PythonCard.templates.dialogs import runOptionsDialog
--- 35,42 ----
 import time
 import pprint
+ import re
 
 # pythoncard imports
 import wx
 from PythonCard import dialog, model, util
 from PythonCard.templates.dialogs import runOptionsDialog
***************
*** 48,63 ****
 import outputWindow
 
! from PythonCard.components import button, checkbox, choice, image, imagebutton, list, notebook, spinner, staticbox, statictext, textarea, textfield
 
- # KEA 2007年07月28日
- # updated for wx package organization
 # temporary hack until we get it working properly under MacOS
 if wx.Platform == '__WXMAC__':
! app = wx.PySimpleApp()
 title = 'Sorry!'
! frame = wx.Frame(None, -1, title)
 message = 'standaloneBuilder currently does not work properly under MacOS. This shortcoming will '
 message += 'be fixed in a future release.\n\nClick OK to exit.'
! dialog = wx.MessageDialog(frame, wrap_string(message, 52), title, wx.ICON_EXCLAMATION | wx.OK)
 dialog.ShowModal()
 dialog.Destroy()
--- 46,60 ----
 import outputWindow
 
! from PythonCard.components import button, checkbox, choice, htmlwindow, image, imagebutton, list, notebook, radiogroup, spinner, staticbox, statictext, textarea, textfield
 
 # temporary hack until we get it working properly under MacOS
 if wx.Platform == '__WXMAC__':
! from wxPython.wx import wxPySimpleApp, wxFrame, wxMessageDialog, wxICON_EXCLAMATION, wxOK, wxVERSION_STRING
! app = wxPySimpleApp()
 title = 'Sorry!'
! frame = wxFrame(None, -1, title)
 message = 'standaloneBuilder currently does not work properly under MacOS. This shortcoming will '
 message += 'be fixed in a future release.\n\nClick OK to exit.'
! dialog = wxMessageDialog(frame, wrap_string(message, 52), title, wxICON_EXCLAMATION | wxOK)
 dialog.ShowModal()
 dialog.Destroy()
***************
*** 81,84 ****
--- 78,83 ----
 else:
 import commands
+ 
+ debug = False
 
 # imports required by mcmillan installer
***************
*** 143,150 ****
 
 def on_close(self, event):
! if self.doExit(): event.Skip()
 
 def on_menuFileExit_command(self, event):
 self.close()
 
 ##########################################################################
--- 142,154 ----
 
 def on_close(self, event):
! if self.doExit():
! if debug: print 'on_close: calling event.Skip()'
! event.Skip()
! if debug: print 'on_close: back from event.Skip()'
 
 def on_menuFileExit_command(self, event):
+ if debug: print 'menuFileExit'
 self.close()
+ if debug: print 'menuFileExit done'
 
 ##########################################################################
***************
*** 156,163 ****
 if self.documentPath is None:
 dir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text)
! if sys.platform.startswith('win'):
! filename = '%s.pmr' % self.components.projectName.text
! else:
! filename = 'Untitled.pmr'
 else:
 dir = os.path.dirname(self.documentPath)
--- 160,164 ----
 if self.documentPath is None:
 dir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text)
! filename = '%s.pmr' % self.components.projectName.text
 else:
 dir = os.path.dirname(self.documentPath)
***************
*** 273,280 ****
 
 def on_menuHelpManual_command(self, event):
! title = 'Sorry!'
! txt = 'Online manual functionality will be implemented in a future '
! txt += 'version of standaloneBuilder.'
! bull = dialog.alertDialog(self, txt, title)
 
 def on_menuHelpAbout_command(self, event):
--- 274,285 ----
 
 def on_menuHelpManual_command(self, event):
! #title = 'Sorry!'
! #txt = 'Online manual functionality will be implemented in a future '
! #txt += 'version of standaloneBuilder.'
! #bull = dialog.alertDialog(self, txt, title)
! manual = 'doc/standaloneBuilder.html'
! dlg = helpManual(self, manual)
! dlg.showModal()
! dlg.destroy()
 
 def on_menuHelpAbout_command(self, event):
***************
*** 333,340 ****
 title = 'Select icon'
 wildcard = "Icon files (*.ico)|*.ico;*.ICO|All files (*.*)|*.*"
 old = self.components.projectIcon.text
! result = dialog.openFileDialog(self, title, self.components.baseDir.text, '', wildcard=wildcard)
 if result.accepted:
! rpath = self.getRelativePath(self.components.baseDir.text, result.paths[0])
 if rpath != old:
 self.components.projectIcon.text = rpath
--- 338,349 ----
 title = 'Select icon'
 wildcard = "Icon files (*.ico)|*.ico;*.ICO|All files (*.*)|*.*"
+ basepath = self.components.baseDir.text
+ if not os.path.isabs(basepath):
+ basepath = os.path.join(self.cfg.get('ConfigData', 'projects'), basepath)
 old = self.components.projectIcon.text
! result = dialog.openFileDialog(self, title, basepath, '', wildcard=wildcard)
 if result.accepted:
! rpath = self.getRelativePath(basepath, result.paths[0])
! #rpath = result.paths[0]
 if rpath != old:
 self.components.projectIcon.text = rpath
***************
*** 362,365 ****
--- 371,376 ----
 title = 'Select main script file'
 basepath = self.components.baseDir.text
+ if not os.path.isabs(basepath):
+ basepath = os.path.join(self.cfg.get('ConfigData', 'projects'), basepath)
 old = self.components.mainScript.text
 wildcard = "Script files (*.py)|*.py;*.PY"
***************
*** 610,614 ****
 result = dialog.messageDialog(self, wrap_string(txt, 60), title, wx.ICON_EXCLAMATION | wx.YES_NO | wx.YES_DEFAULT)
 if result.accepted:
! self.buildInnoFile()
 else:
 return
--- 621,625 ----
 result = dialog.messageDialog(self, wrap_string(txt, 60), title, wx.ICON_EXCLAMATION | wx.YES_NO | wx.YES_DEFAULT)
 if result.accepted:
! self.buildInnoFile() ### FIXME ### this fails unless the project has been built once already
 else:
 return
***************
*** 648,653 ****
 # code plus associated files
 if sys.platform.startswith('linux') or sys.platform.startswith('freebsd'):
! self.rebuildLinux()
! return 0
 
 impFound, impLine = self.checkImports()
--- 659,669 ----
 # code plus associated files
 if sys.platform.startswith('linux') or sys.platform.startswith('freebsd'):
! dlg = buildType(self)
! dlg.ShowModal()
! bType = dlg.getType()
! dlg.Destroy()
! if bType != 'Full binary':
! self.rebuildLinux()
! return 0
 
 impFound, impLine = self.checkImports()
***************
*** 720,725 ****
 # delete all transient files from previous rebuilds
 basedir = str(os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text))
- #print 'using [%s] as basedir' % basedir
- #bull = raw_input()
 versionfile = os.path.join(basedir, 'versioninfo.txt')
 innofile = self.components.projectName.text + '.iss'
--- 736,739 ----
***************
*** 751,756 ****
 pass
 
! self.recursiveDirDelete(os.path.join(basedir, 'build'))
! self.recursiveDirDelete(os.path.join(basedir, 'dist'))
 
 # window for progress marks and output messages
--- 765,770 ----
 pass
 
! if not self.recursiveDirDelete(os.path.join(basedir, 'build')): return
! if not self.recursiveDirDelete(os.path.join(basedir, 'dist')): return
 
 # window for progress marks and output messages
***************
*** 798,801 ****
--- 812,824 ----
 self.outputWindow.Update()
 
+ # if the flag is set, run the Inno complier automatically
+ runInno = self.project.getboolean('Project', 'autoRunInnoSetup')
+ if not runInno:
+ # display yes/no prompt
+ title = 'Please confirm'
+ msg = 'Rebuild complete - run Inno compiler?'
+ result = dialog.messageDialog(self, wrap_string(msg, 60), title, wx.ICON_EXCLAMATION | wx.YES_NO | wx.YES_DEFAULT)
+ runInno = result.accepted
+ 
 # rebuild the Inno script file
 self.outputWindow.components.txt4a.visible = True # rebuilding distributable
***************
*** 803,813 ****
 self.outputWindow.Update()
 self.outputWindow.Refresh()
! if allokay: self.buildInnoFile()
 
 # rebuild the distributable
- #self.buildDistFile()
 self.outputWindow.components.txt4c.visible = False
 self.outputWindow.components.txt4b.visible = True # done
! if allokay:
 self.buildInstaller()
 #self.outputWindow.Update()
--- 826,835 ----
 self.outputWindow.Update()
 self.outputWindow.Refresh()
! if allokay and runInno: self.buildInnoFile()
 
 # rebuild the distributable
 self.outputWindow.components.txt4c.visible = False
 self.outputWindow.components.txt4b.visible = True # done
! if allokay and runInno:
 self.buildInstaller()
 #self.outputWindow.Update()
***************
*** 815,819 ****
 #self.outputWindow.Raise()
 else:
! self.outputWindow.components.txt4b.text = '*** ERROR ***' # rebuilding distributable 
 
 # if the project is not frozen, increment the build number to finish
--- 837,841 ----
 #self.outputWindow.Raise()
 else:
! if not allokay: self.outputWindow.components.txt4b.text = '*** ERROR ***' # rebuilding distributable 
 
 # if the project is not frozen, increment the build number to finish
***************
*** 877,887 ****
 ##############################################################################
 def recursiveDirDelete(self, path=None):
! # recursively delete a sub directory
! if path is None: return
! if not os.path.isdir(path): return
 for root, dirs, files in os.walk(path, topdown=False):
 for name in files: os.unlink (os.path.join(root, name))
 for name in dirs: os.rmdir(os.path.join(root, name))
! os.rmdir(path)
 
 def checkResourceFile(self, path):
--- 899,930 ----
 ##############################################################################
 def recursiveDirDelete(self, path=None):
! # recursively delete a sub directory - I'll do a better job of the
! # error checkiing in the next release...
! 
! #if path is None or not os.path.isdir(path):
! # title = 'Build error!'
! # txt = 'Internal error: invalid directory passed to recursiveDirDelete'
! # txt += ' function - name given was %s' % path
! # bull = dialog.alertDialog(self, wrap_string(txt, 60), title)
! # return False
! 
! 
 for root, dirs, files in os.walk(path, topdown=False):
 for name in files: os.unlink (os.path.join(root, name))
 for name in dirs: os.rmdir(os.path.join(root, name))
! 
! try:
! os.rmdir(path)
! except:
! pass
! #OSError, estring:
! #if estring.startwith'[
! #title = 'Build error!'
! #txt = 'Internal error: recursiveDirDelete failed to delete %s' % path
! #txt += '\n\nError returned was %s' % estring 
! #bull = dialog.alertDialog(self, wrap_string(txt, 60), title)
! #return False
! 
! return True
 
 def checkResourceFile(self, path):
***************
*** 995,1005 ****
 return args
 
! def getRelativePath(self, root, path):
 # remove the root part of an absolute path
! #print 'getRelativePath: root=[%s], path=[%s]' % (root, path)
 retPath = string.replace(path, root, '')
! if retPath[0] == os.sep: retPath = retPath[1:]
! #print 'getRelativePath: returning [%s]' % retPath
! #bull = raw_input()
 return retPath
 
--- 1038,1049 ----
 return args
 
! def getRelativePath(self, root, path, debug=False):
 # remove the root part of an absolute path
! root = root + os.sep
! if debug: print 'getRelativePath: root=[%s], path=[%s]' % (root, path)
 retPath = string.replace(path, root, '')
! #if retPath[0] == os.sep: retPath = retPath[1:]
! if debug: print 'getRelativePath: returning [%s]' % retPath
! if debug: bull = raw_input()
 return retPath
 
***************
*** 1079,1096 ****
 
 def doExit(self):
 if self.documentChanged:
 save = self.saveChanges()
 if save == wx.ID_CANCEL:
! return 0
 elif save == wx.ID_NO:
! return 1
 else:
 if self.documentPath is None:
! return self.on_menuFileSaveAs_select(None)
 else:
 self.saveFile(self.documentPath)
! return 1
! else:
! return 1
 
 def saveFile(self, path):
--- 1123,1144 ----
 
 def doExit(self):
+ bull = True
 if self.documentChanged:
 save = self.saveChanges()
 if save == wx.ID_CANCEL:
! bull = False # was 0
 elif save == wx.ID_NO:
! bull = True # was 1
 else:
 if self.documentPath is None:
! bull = self.on_menuFileSaveAs_select(None)
 else:
 self.saveFile(self.documentPath)
! bull = True # was 1
! #else:
! # return True # was 1
! 
! if debug: print 'doExit: returning [%s]' % bull
! return bull
 
 def saveFile(self, path):
***************
*** 1106,1109 ****
--- 1154,1158 ----
 except:
 pass
+ if debug: print 'saveFile: exiting'
 
 def saveChanges(self):
***************
*** 1112,1117 ****
 else:
 filename = self.documentPath
! msg = "The text in the %s file has changed.\n\nDo you want to save the changes?" % filename
! result = dialog.messageDialog(self, msg, 'textEditor', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL)
 return result.returned
 
--- 1161,1167 ----
 else:
 filename = self.documentPath
! msg = "Project details have been changed.\n\nDo you want to save these changes?"
! result = dialog.messageDialog(self, msg, 'Project has changed', wx.ICON_EXCLAMATION | wx.YES_NO | wx.CANCEL)
! if debug: print 'saveChanges: returning [%s]' % result.returned
 return result.returned
 
***************
*** 1155,1158 ****
--- 1205,1209 ----
 self.project.set('Project', 'appurl', '')
 self.project.set('Project', 'status', 'open')
+ self.project.set('Project', 'autoRunInnoSetup', '1')
 
 self.project.set('Project', 'applicence', os.path.normpath('doc/gpl.txt'))
***************
*** 1177,1181 ****
 
 for comp in self.components.keys():
! self.components[comp].enabled = 1
 
 def delItem(self, items, selected):
--- 1228,1232 ----
 
 for comp in self.components.keys():
! self.components[comp].enabled = True
 
 def delItem(self, items, selected):
***************
*** 1216,1219 ****
--- 1267,1284 ----
 # build a tarball for a Linux system
 # create a top level directory for the stuff to go in
+ self.outputWindow.clearLines()
+ for comp in self.outputWindow.components.keys():
+ self.outputWindow.components[comp].enabled = False
+ self.outputWindow.components[comp].visible = False
+ self.outputWindow.components.closeBtn.enabled = True
+ self.outputWindow.components.closeBtn.visible = True
+ self.outputWindow.components.returnedText.enabled = True
+ self.outputWindow.components.returnedText.visible = True
+ self.outputWindow.components.txt5.enabled = True
+ self.outputWindow.components.txt5.visible = True
+ self.outputWindow.Show()
+ self.outputWindow.components.txt6a.enabled = True # creating temporary directories
+ self.outputWindow.components.txt6a.visible = True
+ 
 vstring = self.project.get('Project', 'majorversion')
 vstring += '.' + self.project.get('Project', 'minorversion')
***************
*** 1229,1239 ****
 try:
 cmd = 'rm -rf %s' % tdir
! os.system(cmd)
! #os.removedirs(tdir)
 except:
 pass
 os.mkdir(tdir)
 
 # write everything out to a 'manifest.in' file
 basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text)
 manifestfile = os.path.join(basedir, 'manifest.in')
--- 1294,1307 ----
 try:
 cmd = 'rm -rf %s' % tdir
! os.system(cmd) 
 except:
 pass
 os.mkdir(tdir)
+ self.outputWindow.components.txt6b.enabled = True # done
+ self.outputWindow.components.txt6b.visible = True
 
 # write everything out to a 'manifest.in' file
+ self.outputWindow.components.txt7a.enabled = True # creating manifest
+ self.outputWindow.components.txt7a.visible = True
 basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text)
 manifestfile = os.path.join(basedir, 'manifest.in')
***************
*** 1256,1262 ****
--- 1324,1334 ----
 
 fd.close()
+ self.outputWindow.components.txt7b.enabled = True # done
+ self.outputWindow.components.txt7b.visible = True
 
 # use cpio to copy everything listed in manifest.in into the temp
 # directory just created
+ self.outputWindow.components.txt8a.enabled = True # creating tarball
+ self.outputWindow.components.txt8a.visible = True
 cmd = "cd %s; cat manifest.in|cpio -vdump %s" % (basedir, topdir)
 os.system(cmd)
***************
*** 1270,1293 ****
 pass
 tb = os.path.join(tb, tarball)
! cmd = "cd %s; tar -zcvf %s %s > /dev/null 2>&1" % (basedir, tb, topdir)
! os.system(cmd)
 
 # remove the temporary directory when done
 cmd = "cd %s; rm -rf %s" % (basedir, topdir)
 os.system(cmd)
 
 def checkImports(self):
 # if we're building from a PythonCard application, check that the
! # main script includes imports of the required PythonCard components
! ### TODO ###############################################################
! # #
! # make this work properly for a non-PythonCard project - it should #
! # return impFound=True if there are no PythonCard resource files in #
! # the project #
! ########################################################################
 imps = {}
 impline = 'from PythonCard.components import '
 basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text)
 
 for res in self.components.resList.items:
 fullpath = str(os.path.join(basedir, res))
--- 1342,1386 ----
 pass
 tb = os.path.join(tb, tarball)
! cmd = "cd %s; tar -zcvf %s %s" % (basedir, tb, topdir)
! self.outputWindow.Show()
! #os.system(cmd)
! stin, stout, sterr = os.popen3(cmd)
! stin.close()
! result = stout.readline()
! while result:
! self.outputWindow.addLine(result)
! self.outputWindow.Update()
! self.outputWindow.Refresh()
! result = stout.readline()
! stout.close()
! result = sterr.readline()
! while result:
! self.outputWindow.addLine(result)
! self.outputWindow.Update()
! self.outputWindow.Refresh()
! result = sterr.readline()
! sterr.close()
 
 # remove the temporary directory when done
 cmd = "cd %s; rm -rf %s" % (basedir, topdir)
 os.system(cmd)
+ self.outputWindow.components.txt8b.enabled = True # done
+ self.outputWindow.components.txt8b.visible = True
+ tbSize = self.commaSplit(str(os.stat(tb)[6]))
+ self.outputWindow.addLine('tarball size is %s bytes' % tbSize)
+ self.outputWindow.Update()
+ self.outputWindow.Refresh()
 
 def checkImports(self):
 # if we're building from a PythonCard application, check that the
! # main script includes imports of the required PythonCard components.
! # for a non-PythonCard project, i.e. a project with no defined resource
! # file, just return True
 imps = {}
 impline = 'from PythonCard.components import '
 basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text)
 
+ if len(self.components.resList.items) == 0: return (True, None)
+ 
 for res in self.components.resList.items:
 fullpath = str(os.path.join(basedir, res))
***************
*** 1317,1321 ****
 line = fd.readline()
 while line:
! if line == impline + '\n':
 impFound = True
 break
--- 1410,1414 ----
 line = fd.readline()
 while line:
! if line == impline + '\n' or line == impline + '\r\n':
 impFound = True
 break
***************
*** 1343,1351 ****
 
 # make sure we have a setup.py script in the current directory
 setupScript = os.path.join(basedir, 'setup.py')
! if not os.path.exists(setupScript):
! fd = open(setupScript, 'w')
! fd.write(self.setupCode)
! fd.close()
 
 specfile = os.path.join(basedir, self.components.projectName.text + '.spec')
--- 1436,1446 ----
 
 # make sure we have a setup.py script in the current directory
+ # it gets re-written every time, ,just in case someone decides
+ # to delete it...
 setupScript = os.path.join(basedir, 'setup.py')
! #if not os.path.exists(setupScript):
! fd = open(setupScript, 'w')
! fd.write(self.setupCode)
! fd.close()
 
 specfile = os.path.join(basedir, self.components.projectName.text + '.spec')
***************
*** 1380,1387 ****
 
 # add in all the pixmap files
! pixmap = self.project.get('Project', 'pixmapspath')
! tmp = (str(pixmap), [])
! for pix in self.components.pixmapList.items: tmp[1].append(str(os.path.join(pixmap, pix)))
! data_files.append(tmp)
 
 # now process everything in the 'other files' list that lives in its
--- 1475,1483 ----
 
 # add in all the pixmap files
! if len(self.components.pixmapList.items) > 0:
! pixmap = self.project.get('Project', 'pixmapspath')
! tmp = (str(pixmap), [])
! for pix in self.components.pixmapList.items: tmp[1].append(str(os.path.join(pixmap, pix)))
! data_files.append(tmp)
 
 # now process everything in the 'other files' list that lives in its
***************
*** 1427,1430 ****
--- 1523,1531 ----
 else:
 buildOpts['buildType'] = 'windows'
+ 
+ # add a flag to denote that a single-file build is required
+ if not self.project.getboolean('Project', 'onedir'):
+ buildOpts['singlefile'] = 1
+ 
 pprint.pprint(buildOpts, fd)
 fd.close()
***************
*** 1479,1484 ****
 spec = []
 spec.append("p = '%s%s' # defines project root directory" % (basedir, os.sep))
! spec.append("a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'),")
! spec.append(" os.path.join(HOMEPATH,'support\\useUnicode.py'),")
 spec.append(" p + '%s']," % self.components.mainScript.text)
 spec.append(" pathex=['%s'])" % self.cfg.get('ConfigData', 'installerpath'))
--- 1580,1585 ----
 spec = []
 spec.append("p = '%s%s' # defines project root directory" % (basedir, os.sep))
! spec.append("a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'),")
! spec.append(" os.path.join(HOMEPATH,'support/useUnicode.py'),")
 spec.append(" p + '%s']," % self.components.mainScript.text)
 spec.append(" pathex=['%s'])" % self.cfg.get('ConfigData', 'installerpath'))
***************
*** 1571,1575 ****
 basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), self.components.baseDir.text)
 versionfile = os.path.join(str(basedir), 'versioninfo.txt')
- #bull = raw_input('should now have [%s]' % versionfile)
 
 fd = open(versionfile, 'w')
--- 1672,1675 ----
***************
*** 1579,1582 ****
--- 1679,1685 ----
 def buildApplication(self):
 # run the pyInstaller build script and capture the output
+ 
+ # a single file build with pyInstaller requires a '-D' flag to be
+ # added to the command line
 if sys.platform.startswith('win'):
 cmd = 'python ' + GetShortPathName(self.cfg.get('ConfigData', 'installerpath'))
***************
*** 1587,1590 ****
--- 1690,1694 ----
 specfile = os.path.join(basedir, self.components.projectName.text + '.spec') # possible bug???
 cmd += ' "' + specfile + '" -o "' + os.path.join(basedir, self.pathJoin(self.project.get('Project','buildfilespath'))) + '"'
+ if debug: print cmd
 stin, stout, sterr = os.popen3(cmd)
 stin.close()
***************
*** 1611,1618 ****
 
 def buildInnoFile(self):
! # rebuild the Inno Setup spec file
 inno = []
 
 basedir = self.components.baseDir.text
 
 innofile = self.components.projectName.text + '.iss'
--- 1715,1725 ----
 
 def buildInnoFile(self):
! # rebuild the Inno Setup spec file - this does not actually run Inno
! # setup, it just builds the spec file that Inno uses later on
 inno = []
 
 basedir = self.components.baseDir.text
+ if not os.path.isabs(basedir):
+ basedir = os.path.join(self.cfg.get('ConfigData', 'projects'), basedir)
 
 innofile = self.components.projectName.text + '.iss'
***************
*** 1669,1672 ****
--- 1776,1782 ----
 outputDir = os.path.join(basedir, self.pathJoin(self.project.get('Project', 'distfilespath')))
 
+ if not os.path.exists(outputDir):
+ pass
+ 
 for f in os.listdir(outputDir):
 fullname = os.path.join(outputDir, f)
***************
*** 1893,1897 ****
 self.project.set('Project', 'projectdesc', self.components.projectDesc.text)
 self.project.set('Project', 'mainscript', self.components.mainScript.text)
! self.project.set('Project', 'iconfile', self.components.projectIcon.text)
 self.project.set('Project', 'innoscript', '%s.iss' % self.components.projectName.text)
 self.project.set('Project', 'specfile', '%s.spec' % self.components.projectName.text)
--- 2003,2010 ----
 self.project.set('Project', 'projectdesc', self.components.projectDesc.text)
 self.project.set('Project', 'mainscript', self.components.mainScript.text)
! if self.components.projectIcon.text != '':
! self.project.set('Project', 'iconfile', os.path.normpath(self.components.projectIcon.text))
! else:
! self.project.set('Project', 'iconfile', '')
 self.project.set('Project', 'innoscript', '%s.iss' % self.components.projectName.text)
 self.project.set('Project', 'specfile', '%s.spec' % self.components.projectName.text)
***************
*** 2148,2163 ****
 self.components.baseDir.text = self.project.get('Project', 'winbasepath')
 except ConfigParser.NoOptionError:
! self.components.baseDir.text = self.project.get('Project', 'basepath')
 elif sys.platform.startswith('linux'):
 try:
 self.components.baseDir.text = self.project.get('Project', 'linuxbasepath')
 except ConfigParser.NoOptionError:
! self.components.baseDir.text = self.project.get('Project', 'basepath')
 else:
! self.components.baseDir.text = self.project.get('Project', 'basepath')
 
 self.components.projectDesc.text = self.project.get('Project', 'projectdesc')
 self.components.mainScript.text = self.project.get('Project', 'mainscript')
! self.components.projectIcon.text = self.project.get('Project', 'iconfile')
 self.components.scriptList.items = self.sectionOutput('Scripts')
 self.components.resList.items = self.sectionOutput('ResourceFiles')
--- 2261,2286 ----
 self.components.baseDir.text = self.project.get('Project', 'winbasepath')
 except ConfigParser.NoOptionError:
! try:
! self.components.baseDir.text = self.project.get('Project', 'basepath')
! except ConfigParser.NoOptionError:
! self.components.baseDir.text = 'abc123'
 elif sys.platform.startswith('linux'):
 try:
 self.components.baseDir.text = self.project.get('Project', 'linuxbasepath')
 except ConfigParser.NoOptionError:
! try:
! self.components.baseDir.text = self.project.get('Project', 'basepath')
! except ConfigParser.NoOptionError:
! self.components.baseDir.text = 'abc123'
 else:
! try:
! self.components.baseDir.text = self.project.get('Project', 'basepath')
! except ConfigParser.NoOptionError:
! self.components.baseDir.text = 'abc123'
 
 self.components.projectDesc.text = self.project.get('Project', 'projectdesc')
 self.components.mainScript.text = self.project.get('Project', 'mainscript')
! self.components.projectIcon.text = os.path.normpath(self.project.get('Project', 'iconfile'))
! if self.components.projectIcon.text == '.': self.components.projectIcon.text = ''
 self.components.scriptList.items = self.sectionOutput('Scripts')
 self.components.resList.items = self.sectionOutput('ResourceFiles')
***************
*** 2241,2245 ****
 if not os.path.isabs(basePath):
 basePath = os.path.join(self.cfg.get('ConfigData', 'projects'), basePath)
! 
 if not os.path.exists(basePath):
 title = 'Invalid project path'
--- 2364,2368 ----
 if not os.path.isabs(basePath):
 basePath = os.path.join(self.cfg.get('ConfigData', 'projects'), basePath)
! 
 if not os.path.exists(basePath):
 title = 'Invalid project path'
***************
*** 2257,2260 ****
--- 2380,2391 ----
 pstatus = self.project.get('Project', 'status')
 
+ # default to running Inno Setup automatically if not otherwise specified
+ # in the project file
+ try:
+ bull = self.project.getboolean('Project', 'autoRunInnoSetup')
+ except ConfigParser.NoOptionError:
+ self.project.set('Project', 'autoRunInnoSetup', '1')
+ self.documentChanged = True
+ 
 if pstatus == 'frozen':
 title = 'Frozen project'
***************
*** 2327,2330 ****
--- 2458,2474 ----
 
 self.updateStatusBar()
+ #print self.components.scriptList.enabled
+ #self.Update()
+ #bull = raw_input('stopping for a rest... ')
+ 
+ # handy little function to comma seperate thousands in a number - got this from
+ # ASPN web site...http://aspn.ActiveState.com/ASPN/Cookbook/Python/Recipe/146461
+ def commaSplit(self, amount):
+ orig = amount
+ new = re.sub("^(-?\d+)(\d{3})", '\g<1>,\g<2>', amount)
+ if orig == new:
+ return new
+ else:
+ return...
 
[truncated message content]
Update of /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/doc
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19145
Modified Files:
	about.html author.html license.html license.txt pic12.jpg 
	standaloneBuilder.html 
Added Files:
	pic29.jpg 
Log Message:
Fixes and enhancements for standaloneBuilder v0.3.1, see changelog file for full details
Index: pic12.jpg
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/doc/pic12.jpg,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
Binary files /tmp/cvs107NEm and /tmp/cvsG1Ny3T differ
--- NEW FILE: pic29.jpg ---
(This appears to be a binary file; contents omitted.)
Index: standaloneBuilder.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/doc/standaloneBuilder.html,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** standaloneBuilder.html	3 Nov 2006 14:14:01 -0000	1.5
--- standaloneBuilder.html	24 Oct 2007 00:50:58 -0000	1.6
***************
*** 1,234 ****
! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
! <html>
! <head>
! <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
! <link rel="stylesheet" type="text/css" href="PythonCard.css" />
! <title>PythonCard standaloneBuilder tool</title>
! </head>
! <body>
! <div id="banner">
! <h1>PythonCard standaloneBuilder tool</h1>
! </div>
! <?php include "sidebar.php" ?>
! <div id="content">
! <h2>Introduction</h2>
! <p>The process of converting a PythonCard project into a stand-alone application,
! complete with installer and un-install entry, is fairly tedious to do 'by
! hand'. Whilst writing some documentation (see <a href="standalone.html">here</a>) to
! cover this, it became clear that there was a need for some application
! software (written using PythonCard, naturally!) to help automate the process. The
! <i>standaloneBuilder</i> tool is the result. The program offers the user the
! ability to manage the development and release of successive versions of an
! application project written using PythonCard.</p>
! 
! <p>Comments on this document and/or bug reports related to the <i>standaloneBuilder</i> tool
! may be posted to the PythonCard users mailing list, <a href="http://lists.sourceforge.net/lists/listinfo/pythoncard-users">http://lists.sourceforge.net/lists/listinfo/pythoncard-users</a>, for discussion.</p>
! 
! 	<h2>Pre-Requisites</h2>
! 	<p>As well as Python, wxPython and PythonCard, you will need to have installed and configured
! 	pyInstaller and/or py2exe together with Inno Setup on your computer. These packages can be downloaded from
! 	the following locations as of the time of writing:
 	<ul>
 	 <li>pyInstaller: <a href="http://pyinstaller.python-hosting.com/">http://pyinstaller.python-hosting.com/</a></li>
! 	 <li>py2exe: <a href="http://www.py2exe.org/">http://www.py2exe.org/</a></li>
! 		<li>Inno Setup: <a href="http://www.jrsoftware.org/isdl.php">http://www.jrsoftware.org/isdl.php</a></li>
! 	</ul>
! 	Both packages come with comprehensive documentation - installation and setup should be
! 	painless.</p>
! 
! 	<h2>Configuring <i>standaloneBuilder</i></h2>
! 	<p>When launching <i>standaloneBuilder</i> for the first time, it detects that the
! 	preferences need to be configured and drops you straight into the preferences
! 	dialog.</p>
! 	<div align="center"><img src="pic1.jpg" /></div>
! 	<p>You can come back to this dialog at any time by clicking the preferences
! 	button on the main screen. All of the options have help buttons (marked with
! 	'?') associated with them, so you can (hopefully) figure out what each one is
! 	for without too much difficulty. The program will try to find as much information as it
! 	can, you should only need to tell it your name and where to find the directory
! 	you keep all your projects in.</p>
! 	<div align="center"><img src="pic2.jpg" /></div>
! 
! 	<p>After filling in any missing information, click the OK button to save your
! 	preferences for use In future projects.
! 
! 	<h2>Creating a new project</h2>
! 
! 	<p>For the purposes of this
! 	document, we'll use the <i>standaloneBuilder</i> tool in conjunction with the
! 	application created in <a href="walkthrough2.html">walkthrough #2,</a> to illustrate
! 	the steps involved in the creation, development and distribution of a typical PythonCard
! 	program. We'll assume that you have already followed the walkthrough and you have the
! 	<i>counter.py</i> application fully functional.</p>
! 
! 	<div align="center"><img src="pic3.jpg" /></div>
! 
! 	<p>To begin, click on the 'New' button to start the new project wizard and fill
! 	in the details as required:</p>
! 	<div align="center"><img src="pic4.jpg" /></div><br />
! 	<div align="center"><img src="pic5.jpg" /></div><br />
! 	<div align="center"><img src="pic6.jpg" /></div><br />
! 	<div align="center"><img src="pic7.jpg" /></div><br />
! 	<div align="center"><img src="pic8.jpg" /></div><br />
! 
! 	<p>After completing the new project wizard, the program will create the project
! 	and add in some default folders and template files. A 'save' dialog will then
! 	be presented to allow the project details to be written to disk. The main
! 	window will now appear as shown below:</p>
! 
! 	<div align="center"><img src="pic9.jpg" /></div>
! 
! 	<h2>Adding files to the project</h2>
! 	<p>The first step will be to define the main script file for the project. In this case,
! 	there is only one script, namely <i>counter.py</i>, so click the '...' button next to
! 	the main script file text field. Navigate to the <i>sab-demo</i> folder and select the
! 	'counter.py' script. Click the Open button to add it to the project:</p>
! 
! 	<div align="center"><img src="pic10.jpg" /></div><br />
! 	<div align="center"><img src="pic11.jpg" /></div>
! 	
! 	<p>The program will automatically add in any matching PythonCard resource files, too.</p>
! 
! 	<p>A note is probably in order at this point about the <i>Script files</i> box. Generally,
! 	McMillan Installer is quite good at working out if there are any additional source files
! 	associated with the main script, simply by examining any <i>import</i> lines in the
! 	source code. This may appear to make the <i>Script files</i> box largely superfluous. If
! 	you intend to only ever build projects for Windows platforms, then you may well find that
! 	you never need to explicitly list any additional script files. If, however, you also want
! 	to distribute your project to Linux users, then things are slightly different. When running
! 	<i>standaloneBuilder</i> on Linux, the rebuild button simply builds a compressed tar file
! 	containing the items you have specified as making up your project. In this scenario, only
! 	those files that you have explicitly listed will be included in the tar file. Also, by
! 	including your script files explicitly, the usefulness of <i>standaloneBuilder</i> as a
! 	general purpose project manager comes into play. You can edit a given script file by
! 	simply selecting it in the list and clicking the <i>Edit...</i> button.</p>
! 
! 	<p>Any resource files which are added to the project can be opened in the resource editor simply by
! 	clicking on the Edit button on the main window. Files which are added in other sections
! 	of the main window can be edited in the same way. Script files will be opened using the
! 	program defined as the text editor in preferences. This defaults to the PythonCard code
! 	editor, but can be changed if required. Files listed under the Pixmaps section will
! 	be opened using whatever you specify as your default image editor in preferences,</p>
! 
! 	<h2>Project properties</h2>
! 	<p>That pretty much covers the mechanics of adding and editing the files which make up
! 	your project. The project properties dialog provides a number of options which affect
! 	how the final standalone version of your program is built. To access this, click the
! 	Properties button on the main window:</p>
! 
! 	<div align="center"><img src="pic13.jpg" /></div>
! 
! 	<p>The first few fields determine the folder layout within your project. All the paths
! 	used within standaloneBuilder are relative. For example, the default build directory
! 	is simply called 'build' - in practice, this folder would be created in whatever you
! 	specified as the base folder when the project was initially created, this would in turn
! 	be created as a sub folder of your top level 'projects' folder defined in the
! 	preferences. Thus, in this example:</p>
! 
! 	<ul>
! 		<li>Projects folder in preferences is <i>C:\Documents and Settings\pedwards\My Documents\Projects</i></li>
! 		<li>The project was created in a folder called <i>sab-demo</i></li>
! 		<li>The build directory is called simply <i>build</i></li>
! 	</ul>
! 
! 	<p>The full path to the build directory is therefore <i>C:\Documents and Settings\pedwards\My Documents\Projects\sab-demo\build</i>. Having
! 	all of the folder references relative to each other allows <i>standaloneBuilder</i>
! 	to maintain projects on both Windows and Linux platforms, with Python itself taking
! 	care of the differences in path separators.</p>
! 
! 	<p>The application publisher, application URL and application licence fields are
! 	used by Inno Setup when the final version of the program is built</p>
! 
! 	<p>The other options from <i>Deployment type</i> onwards correspond to the same
! 	options in the McMillan Installer. Note that new projects are always created with
! 	the <i>Console</i> option turned on - this is intended to aid with debugging. The
! 	build process generates a warning message to remind you to turn this off before making
! 	a release of your finished application.</p>
! 
! 	<h2>Changelog & README buttons</h2>
! 	<p>Clicking the Changelog button launches the text editor defined in preferences and
! 	opens the project changelog file for further editing:</p>
! 
! 	<div align="center"><img src="pic14.jpg" /></div>
! 
! 	<p>Additional entries can be made directly using this option. Alternatively, there
! 	is an 'add changelog entry' option on the 'tools' menu. This pops up a small text
! 	entry dialog like so:</p>
! 	<div align="center"><img src="pic15.jpg" /></div>
! 	<p>The entry then gets added to the changelog. Entries are made so that the
! 	most recently added is at the top:</p>
! 	<div align="center"><img src="pic16.jpg" /></div>
! 
! 	<p>The README button does a similar thing, but instead uses the text editor
! 	to open a file called <i>readme.txt</i> in the project base folder</p>
! 
! 	<h2>The Run Button</h2>
! 	<p>When clicked, the <i>Run...</i> button executes the main script of your project. It firstly pops
! 	up a small dialog wherein you can specify a number of useful command line options:</p>
! 	<div align="center"><img src="pic28.jpg" /></div>
! 	<p>There must be a reason why this looks suspiciously like the run-time options dialog
! 	from the PythonCard resource editor, but I'm sure I couldn't even begin to guess what
! 	that reason might be... :-)</p>
! 
! 	<h2>The Rebuild button</h2>
! 	<p>Clicking this button causes the standalone version of your application to be rebuilt. As
! 	<i>sab-demo</i> is a new project, it has been created with the console option switched on.
! 	The first thing <i>standaloneBuilder</i> does is to remind you about this:</p>
! 	<div align="center"><img src="pic17.jpg" /></div>
! 	<p>The build then proceeds. If all is successful, the program will tell you where it has
! 	stored the installer for the project:</p>
! 	<div align="center"><img src="pic18.jpg" /></div>
! 	<p>A scrolling text window is also displayed where you can see the output from the
! 	build process:</p>
! 	<div align="center"><img src="pic19.jpg" /></div>
! 	<p>When the build has completed, the self extracting installer executable can be
! 	copied to another Windows machine ad run. The resulting setup wizard looks the same
! 	as virtually any other piece of 'professionally' produced software:</p>
! 	<div align="center"><img src="pic21.jpg" /></div>
! 	<p>The executable itself looks and behaves exactly the same as any other program. This
! 	is the result of right-clicking the <i>sab-demo.exe</i> file and selecting 'Properties':</p>
! 	<div align="center"><img src="pic20.jpg" /></div>
! 
! 	<h2>The Release button</h2>
! 	<p>When you are happy that you have thoroughly debugged your project and are ready to
! 	release it to the outside world, you should open the project in <i>standaloneBuilder</i>
! 	and click the Release button. Doing this puts the current release of the project into
! 	a <i>frozen</i> state, in which no further changes can be made until you have checked and
! 	confirmed that the release is okay.</p>
! 
! 	<p>The first thing that happens upon clicking the Release button is that a warning dialog
! 	pops up to give you the option of changing your mind:</p>
! 	<div align="center"><img src="pic22.jpg" /></div>
! 
! 	<p>Assuming that you click OK at this point, a number of things then happen to the project.
! 	Firstly, the status gets changed from <i>Open</i> to <i>Frozen</i> and the majority
! 	of the controls on the main window get disabled:</p>
! 	<div align="center"><img src="pic23.jpg" /></div>
! 	<p>Secondly, the 'release date TBA' tag at the top of the project changelog gets replaced
! 	by the current date. At this point, only the <i>Rebuild</i> and <Release</i> buttons
! 	will work. You should carry out a final rebuild of your project under both Windows and
! 	Linux, if applicable. Under Linux, the <i>Rebuild</i> process simply produces a TAR archive
! 	of the files which make up your project, as opposed to a standalone binary executable.</p>
! 
! 	<p>When you are happy that everything has been rebuilt as you need it, you are ready to
! 	close off the current release and start the next version of your project. To do this, just
! 	click the <i>Release</i> button again. You will be presented with this dialog:</p>
! 	<div align="center"><img src="pic24.jpg" /></div>
! 	<p>Click OK to confirm the release. You then have an opportunity to decide what the next
! 	version number of your project will be, with the option to override what the program offers
! 	as a deafult. In the example shown below I have decided that the next release of the
! 	<i>sab-demo</i> project should have a version number of 0.9.1:</p>
! 	<div align="center"><img src="pic25.jpg" /></div>
! 	<p>The main window is then refreshed. The build number has been reset to 1 and a new
! 	changelog entry has been added to indicate the start of the release cycle for the new
! 	version number:</p>
! 	<div align="center"><img src="pic26.jpg" /></div><br />
! 	<div align="center"><img src="pic27.jpg" /></div>
! 
! 
! 
! <?php include "footer.php" ?>
! <p>$Revision$ : $Author$ : Last updated $Date$</p>
! </div> <!-- end of content -->
! </body>
! </html>
--- 1,239 ----
! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
! <html>
! <head>
! <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
! <link rel="stylesheet" type="text/css" href="PythonCard.css" />
! <title>PythonCard standaloneBuilder tool</title>
! </head>
! <body>
! <font size="2">
! <div id="banner">
! <h1>PythonCard standaloneBuilder tool</h1>
! </div>
! <?php include "sidebar.php" ?>
! <div id="content">
! <h2>Introduction</h2>
! <p>The process of converting a PythonCard project into a stand-alone application,
! complete with installer and un-install entry, is fairly tedious to do 'by
! hand'. Whilst writing some documentation (see <a href="standalone.html">here</a>) to
! cover this, it became clear that there was a need for some application
! software (written using PythonCard, naturally!) to help automate the process. The
! <i>standaloneBuilder</i> tool is the result. The program offers the user the
! ability to manage the development and release of successive versions of an
! application project written using PythonCard.</p>
! 
! <p>Comments on this document and/or bug reports related to the <i>standaloneBuilder</i> tool
! may be posted to the PythonCard users mailing list, <a href="http://lists.sourceforge.net/lists/listinfo/pythoncard-users">http://lists.sourceforge.net/lists/listinfo/pythoncard-users</a>, for discussion.</p>
! 
! 	<h2>Pre-Requisites</h2>
! 	<p>As well as Python, wxPython and PythonCard, you will need to have installed and configured
! 	pyInstaller and/or py2exe together with Inno Setup on your computer. These packages can be downloaded from
! 	the following locations as of the time of writing:
 	<ul>
 	 <li>pyInstaller: <a href="http://pyinstaller.python-hosting.com/">http://pyinstaller.python-hosting.com/</a></li>
! 	 <li>py2exe: <a href="http://www.py2exe.org/">http://www.py2exe.org/</a></li>
! 		<li>Inno Setup: <a href="http://www.jrsoftware.org/isdl.php">http://www.jrsoftware.org/isdl.php</a></li>
! 	</ul>
! 	All packages come with comprehensive documentation - installation and setup should be
! 	painless.</p>
! 
! 	<h2>Configuring <i>standaloneBuilder</i></h2>
! 	<p>When launching <i>standaloneBuilder</i> for the first time, it detects that the
! 	preferences need to be configured and drops you straight into the preferences
! 	dialog.</p>
! 	<div align="center"><img src="pic1.jpg" /></div>
! 	<p>You can come back to this dialog at any time by clicking the preferences
! 	button on the main screen. All of the options have help buttons (marked with
! 	'?') associated with them, so you can (hopefully) figure out what each one is
! 	for without too much difficulty. The program will try to find as much information as it
! 	can, you should only need to tell it your name and where to find the directory
! 	you keep all your projects in.</p>
! 	<div align="center"><img src="pic2.jpg" /></div>
! 
! 	<p>After filling in any missing information, click the OK button to save your
! 	preferences for use In future projects.
! 
! 	<h2>Creating a new project</h2>
! 
! 	<p>For the purposes of this
! 	document, we'll use the <i>standaloneBuilder</i> tool in conjunction with the
! 	application created in <a href="walkthrough2.html">walkthrough #2,</a> to illustrate
! 	the steps involved in the creation, development and distribution of a typical PythonCard
! 	program. We'll assume that you have already followed the walkthrough and you have the
! 	<i>counter.py</i> application fully functional.</p>
! 
! 	<div align="center"><img src="pic3.jpg" /></div>
! 
! 	<p>To begin, click on the 'New' button to start the new project wizard and fill
! 	in the details as required:</p>
! 	<div align="center"><img src="pic4.jpg" /></div><br />
! 	<div align="center"><img src="pic5.jpg" /></div><br />
! 	<div align="center"><img src="pic6.jpg" /></div><br />
! 	<div align="center"><img src="pic7.jpg" /></div><br />
! 	<div align="center"><img src="pic8.jpg" /></div><br />
! 
! 	<p>After completing the new project wizard, the program will create the project
! 	and add in some default folders and template files. A 'save' dialog will then
! 	be presented to allow the project details to be written to disk. The main
! 	window will now appear as shown below:</p>
! 
! 	<div align="center"><img src="pic9.jpg" /></div>
! 
! 	<h2>Adding files to the project</h2>
! 	<p>The first step will be to define the main script file for the project. In this case,
! 	there is only one script, namely <i>counter.py</i>, so click the '...' button next to
! 	the main script file text field. Navigate to the <i>sab-demo</i> folder and select the
! 	'counter.py' script. Click the Open button to add it to the project:</p>
! 
! 	<div align="center"><img src="pic10.jpg" /></div><br />
! 	<div align="center"><img src="pic11.jpg" /></div>
! 	<p>If <i>standaloneBuilder</i> finds a resource file with a name which matches the script
! 	you have just added, it will offer to add this for you as well:</p>
! 	<div align="center"><img src="pic29.jpg" alt="" /></div>
! 	<p>Simply click the <i>Yes</i> button to have the resource file added into the project:</p>
! 	<div align="center"><img src="pic12.jpg" alt="" /></div>
! 
! <p>A note is probably in order at this point about the <i>Script files</i> box.
! 	Generally, pyInstaller is quite good at working out if there are any additional source files
! 	associated with the main script, simply by examining any <i>import</i> lines in the
! 	source code. This may appear to make the <i>Script files</i> box largely superfluous. If
! 	you intend to only ever build projects for Windows platforms, then you may well find that
! 	you never need to explicitly list any additional script files. If, however, you also want
! 	to distribute your project to Linux users, then things are slightly different. When running
! 	<i>standaloneBuilder</i> on Linux, the rebuild button simply builds a compressed tar file
! 	containing the items you have specified as making up your project. In this scenario, only
! 	those files that you have explicitly listed will be included in the tar file. Also, by
! 	including your script files explicitly, the usefulness of <i>standaloneBuilder</i> as a
! 	general purpose project manager comes into play. You can edit a given script file by
! 	simply selecting it in the list and clicking the <i>Edit...</i> button.</p>
! 
! 	<p>Having added the resource file, you can now open it in the resource editor simply by
! 	clicking on the Edit button on the main window. Files which are added in other sections
! 	of the main window can be edited in the same way. Script files will be opened using the
! 	program defined as the text editor in preferences. This defaults to the PythonCard code
! 	editor, but can be changed if required. Files listed under the Pixmaps section will
! 	be opened using whatever you specify as your default image editor in preferences,</p>
! 
! 	<h2>Project properties</h2>
! 	<p>That pretty much covers the mechanics of adding and editing the files which make up
! 	your project. The project properties dialog provides a number of options which affect
! 	how the final standalone version of your program is built. To access this, click the
! 	Properties button on the main window:</p>
! 
! 	<div align="center"><img src="pic13.jpg" /></div>
! 
! 	<p>The first few fields determine the folder layout within your project. All the paths
! 	used within standaloneBuilder are relative. For example, the default build directory
! 	is simply called 'build' - in practice, this folder would be created in whatever you
! 	specified as the base folder when the project was initially created, this would in turn
! 	be created as a sub folder of your top level 'projects' folder defined in the
! 	preferences. Thus, in this example:</p>
! 
! 	<ul>
! 		<li>Projects folder in preferences is <i>C:\Documents and Settings\pedwards\My Documents\Projects</i></li>
! 		<li>The project was created in a folder called <i>sab-demo</i></li>
! 		<li>The build directory is called simply <i>build</i></li>
! 	</ul>
! 
! 	<p>The full path to the build directory is therefore <i>C:\Documents and Settings\pedwards\My Documents\Projects\sab-demo\build</i>. Having
! 	all of the folder references relative to each other allows <i>standaloneBuilder</i>
! 	to maintain projects on both Windows and Linux platforms, with Python itself taking
! 	care of the differences in path separators.</p>
! 
! 	<p>The application publisher, application URL and application licence fields are
! 	used by Inno Setup when the final version of the program is built</p>
! 
! 	<p>The other options from <i>Deployment type</i> onwards correspond to the same
! 	options in the McMillan Installer. Note that new projects are always created with
! 	the <i>Console</i> option turned on - this is intended to aid with debugging. The
! 	build process generates a warning message to remind you to turn this off before making
! 	a release of your finished application.</p>
! 
! 	<h2>Changelog & README buttons</h2>
! 	<p>Clicking the Changelog button launches the text editor defined in preferences and
! 	opens the project changelog file for further editing:</p>
! 
! 	<div align="center"><img src="pic14.jpg" /></div>
! 
! 	<p>Additional entries can be made directly using this option. Alternatively, there
! 	is an 'add changelog entry' option on the 'tools' menu. This pops up a small text
! 	entry dialog like so:</p>
! 	<div align="center"><img src="pic15.jpg" /></div>
! 	<p>The entry then gets added to the changelog. Entries are made so that the
! 	most recently added is at the top:</p>
! 	<div align="center"><img src="pic16.jpg" /></div>
! 
! 	<p>The README button does a similar thing, but instead uses the text editor
! 	to open a file called <i>readme.txt</i> in the project base folder</p>
! 
! 	<h2>The Run Button</h2>
! 	<p>When clicked, the <i>Run...</i> button executes the main script of your project. It firstly pops
! 	up a small dialog wherein you can specify a number of useful command line options:</p>
! 	<div align="center"><img src="pic28.jpg" /></div>
! 	<p>There must be a reason why this looks suspiciously like the run-time options dialog
! 	from the PythonCard resource editor, but I'm sure I couldn't even begin to guess what
! 	that reason might be... :-)</p>
! 
! 	<h2>The Rebuild button</h2>
! 	<p>Clicking this button causes the standalone version of your application to be rebuilt. As
! 	<i>sab-demo</i> is a new project, it has been created with the console option switched on.
! 	The first thing <i>standaloneBuilder</i> does is to remind you about this:</p>
! 	<div align="center"><img src="pic17.jpg" /></div>
! 	<p>The build then proceeds. If all is successful, the program will tell you where it has
! 	stored the installer for the project:</p>
! 	<div align="center"><img src="pic18.jpg" /></div>
! 	<p>A scrolling text window is also displayed where you can see the output from the
! 	build process:</p>
! 	<div align="center"><img src="pic19.jpg" /></div>
! 	<p>When the build has completed, the self extracting installer executable can be
! 	copied to another Windows machine ad run. The resulting setup wizard looks the same
! 	as virtually any other piece of 'professionally' produced software:</p>
! 	<div align="center"><img src="pic21.jpg" /></div>
! 	<p>The executable itself looks and behaves exactly the same as any other program. This
! 	is the result of right-clicking the <i>sab-demo.exe</i> file and selecting 'Properties':</p>
! 	<div align="center"><img src="pic20.jpg" /></div>
! 
! 	<h2>The Release button</h2>
! 	<p>When you are happy that you have thoroughly debugged your project and are ready to
! 	release it to the outside world, you should open the project in <i>standaloneBuilder</i>
! 	and click the Release button. Doing this puts the current release of the project into
! 	a <i>frozen</i> state, in which no further changes can be made until you have checked and
! 	confirmed that the release is okay.</p>
! 
! 	<p>The first thing that happens upon clicking the Release button is that a warning dialog
! 	pops up to give you the option of changing your mind:</p>
! 	<div align="center"><img src="pic22.jpg" /></div>
! 
! 	<p>Assuming that you click OK at this point, a number of things then happen to the project.
! 	Firstly, the status gets changed from <i>Open</i> to <i>Frozen</i> and the majority
! 	of the controls on the main window get disabled:</p>
! 	<div align="center"><img src="pic23.jpg" /></div>
! 	<p>Secondly, the 'release date TBA' tag at the top of the project changelog gets replaced
! 	by the current date. At this point, only the <i>Rebuild</i> and <Release</i> buttons
! 	will work. You should carry out a final rebuild of your project under both Windows and
! 	Linux, if applicable. Under Linux, the <i>Rebuild</i> process simply produces a TAR archive
! 	of the files which make up your project, as opposed to a standalone binary executable.</p>
! 
! 	<p>When you are happy that everything has been rebuilt as you need it, you are ready to
! 	close off the current release and start the next version of your project. To do this, just
! 	click the <i>Release</i> button again. You will be presented with this dialog:</p>
! 	<div align="center"><img src="pic24.jpg" /></div>
! 	<p>Click OK to confirm the release. You then have an opportunity to decide what the next
! 	version number of your project will be, with the option to override what the program offers
! 	as a deafult. In the example shown below I have decided that the next release of the
! 	<i>sab-demo</i> project should have a version number of 0.9.1:</p>
! 	<div align="center"><img src="pic25.jpg" /></div>
! 	<p>The main window is then refreshed. The build number has been reset to 1 and a new
! 	changelog entry has been added to indicate the start of the release cycle for the new
! 	version number:</p>
! 	<div align="center"><img src="pic26.jpg" /></div><br />
! 	<div align="center"><img src="pic27.jpg" /></div>
! 
! 
! 
! <?php include "footer.php" ?>
! <p>$Revision$ : $Author$ : Last updated $Date$</p>
! </div> <!-- end of content -->
! </font>
! </body>
! </html>
Index: license.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/doc/license.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** license.html	12 May 2006 16:26:20 -0000	1.3
--- license.html	24 Oct 2007 00:50:58 -0000	1.4
***************
*** 1,34 ****
! <html>
! <head>
! 	<title>PythonCard License</title>
! </head>
! <body>
! <pre>
! Copyright (c) 2001-2005 PythonCard developers
! All rights reserved.
! 
! Redistribution and use in source and binary forms, with or without
! modification, are permitted provided that the following conditions
! are met:
! 1. Redistributions of source code must retain the above copyright
! notice, this list of conditions and the following disclaimer.
! 2. Redistributions in binary form must reproduce the above copyright
! notice, this list of conditions and the following disclaimer in the
! documentation and/or other materials provided with the distribution.
! 3. The name of the author may not be used to endorse or promote products
! derived from this software without specific prior written permission.
! 
! THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
! NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
! TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
! PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
! LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
! NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
! EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 
! </pre>
! </body>
 </html>
--- 1,34 ----
! <html>
! <head>
! 	<title>PythonCard License</title>
! </head>
! <body>
! <font face="courier" size="%(fontSize)s">
! <p>Copyright (c) 2001-2007 PythonCard developers
! All rights reserved.</p>
! 
! <p>Redistribution and use in source and binary forms, with or without
! modification, are permitted provided that the following conditions
! are met:</p>
! <p><ol>
! <li>Redistributions of source code must retain the above copyright
! notice, this list of conditions and the following disclaimer.
! <li>Redistributions in binary form must reproduce the above copyright
! notice, this list of conditions and the following disclaimer in the
! documentation and/or other materials provided with the distribution.
! <li>The name of the author may not be used to endorse or promote products
! derived from this software without specific prior written permission.
! </ol></p>
! <p>THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
! NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
! TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
! PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
! LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
! NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
! EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
! </font>
! </body>
 </html>
Index: author.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/doc/author.html,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** author.html	9 Apr 2005 09:30:36 -0000	1.1
--- author.html	24 Oct 2007 00:50:58 -0000	1.2
***************
*** 1,22 ****
! <font face="verdana">
! <p>standaloneBuilder was developed by Phil Edwards &lt;ph...@li...&gt; I would
! like to also extend my grateful thanks to the following:</p>
! <br></br>
! <div align="center">
! <font face="verdana" size="2">
! <table width="90%%">
! <tr>
! <td>
! <hr>
! Kevin Altis <a href="mailto:al...@se...">al...@se...</a>,
! without whose excellent work on PythonCard none of this would be possible.
! </td>
! </tr>
! <tr>
! <td>
! <hr>
! </td>
! </tr>
! </table>
! </div>
 </font>
--- 1,28 ----
! <html>
! <head>
! </head>
! <body>
! <font face="verdana" size="%(fontSize)s">
! <p>standaloneBuilder was developed by Phil Edwards
! <a href="mailto:ph...@li...">ph...@li...</a> I would
! like to also extend my grateful thanks to the following:</p>
! <br />
! <!-- <div align="center"> -->
! <!-- <font face="verdana" size="2"> -->
! <table width="100%%">
! <tr>
! <td>
! <ul>
! <li>Kevin Altis <a href="mailto:al...@se...">al...@se...</a>,
! without whose excellent work on PythonCard none of this would be possible.
! <li>Alex Tweedly <a href="mailto:al...@tw...">al...@tw...</a> for
! assistance with testing and an uncanny ability to find the most
! obscure bugs! :-)
! </ul>
! </td>
! </tr>
! </table>
! <!-- </div> -->
 </font>
+ </body>
+ </html>
Index: about.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/doc/about.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** about.html	12 May 2006 16:26:20 -0000	1.3
--- about.html	24 Oct 2007 00:50:58 -0000	1.4
***************
*** 1,26 ****
! <html>
! <head>
! </head>
! <body bgcolor="7f7f7f">
! <font face="verdana" size="2">
! <table border="0" width="100%">
! <tr>
! <td colspan="2">
! <b>standaloneBuilder Version 0.1.4</b>
! </td>
! </tr>
! <tr>
! <td align="center" valign="top">&nbsp;</td>
! <td valign="top">
! 	standaloneBuilder is designed to help simplify the process of getting
! 	a PythonCard applpication distributed in standalone form, without the
! 	end user being required to install PythonCard, wxPython or even Python
! 	itself.
! <p>Developed using the PythonCard GUI toolkit and wxPython,
! <a href="http://pythoncard.sourceforge.net">http://pythoncard.sourceforge.net</a></p>
! </td>
! </tr>
! </table>
! </font>
! </body>
! </html>
--- 1,23 ----
! <html>
! <head>
! </head>
! <body>
! <font face="verdana" size="%(fontSize)s">
! <table border="0" width="100%%">
! <tr>
! <!-- <td align="center" valign="top">&nbsp;</td> -->
! <td valign="top">
! 	<p>standaloneBuilder is designed to help simplify the process of getting
! 	a PythonCard application distributed in standalone form, without the
! 	end user being required to install PythonCard, wxPython or even Python
! 	itself.</p>
! <p>Developed using Python, <a href="http://www.python.org">http://www.python.org</a>,
! wxPython, <a href="http://www.wxpython.org">http://www.wxpython.org</a></p>
! and the PythonCard GUI toolkit,
! <a href="http://pythoncard.sourceforge.net">http://pythoncard.sourceforge.net</a>
! </td>
! </tr>
! </table>
! </font>
! </body>
! </html>
Index: license.txt
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/doc/license.txt,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** license.txt	12 May 2006 16:26:20 -0000	1.3
--- license.txt	24 Oct 2007 00:50:58 -0000	1.4
***************
*** 1,27 ****
! Copyright (c) 2001-2005 PythonCard developers
! All rights reserved.
! 
! Redistribution and use in source and binary forms, with or without
! modification, are permitted provided that the following conditions
! are met:
! 1. Redistributions of source code must retain the above copyright
! notice, this list of conditions and the following disclaimer.
! 2. Redistributions in binary form must reproduce the above copyright
! notice, this list of conditions and the following disclaimer in the
! documentation and/or other materials provided with the distribution.
! 3. The name of the author may not be used to endorse or promote products
! derived from this software without specific prior written permission.
! 
! THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
! THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 
! PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
! AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
! BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
! SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
! NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
 USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
 OF SUCH DAMAGE.
--- 1,27 ----
! Copyright (c) 2001-2007 PythonCard developers
! All rights reserved.
! 
! Redistribution and use in source and binary forms, with or without
! modification, are permitted provided that the following conditions
! are met:
! 1. Redistributions of source code must retain the above copyright
! notice, this list of conditions and the following disclaimer.
! 2. Redistributions in binary form must reproduce the above copyright
! notice, this list of conditions and the following disclaimer in the
! documentation and/or other materials provided with the distribution.
! 3. The name of the author may not be used to endorse or promote products
! derived from this software without specific prior written permission.
! 
! THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
! THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 
! PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
! AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
! BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
! SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
! WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
! NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
 USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
 OF SUCH DAMAGE.
Update of /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/pixmaps
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19121
Added Files:
	manual.png tuxlogo.png 
Log Message:
Fixes and enhancements for standaloneBuilder v0.3.1, see changelog file for full details
--- NEW FILE: tuxlogo.png ---
(This appears to be a binary file; contents omitted.)
--- NEW FILE: manual.png ---
(This appears to be a binary file; contents omitted.)
From: Phil E. <l2...@us...> - 2007年10月24日 00:50:12
Update of /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/templates
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19089
Modified Files:
	setup.py 
Log Message:
Fixes and enhancements for standaloneBuilder v0.3.1, see changelog file for full details
Index: setup.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/templates/setup.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** setup.py	12 May 2006 16:26:20 -0000	1.1
--- setup.py	24 Oct 2007 00:50:11 -0000	1.2
***************
*** 36,41 ****
 buildOpts = eval((open('buildoptions.dat').read()))
 buildType = buildOpts['buildType']
! zipfile = r"lib/sharedlib"
! options = {"py2exe": {"compressed": 1, "optimize": 2}}
 
 if buildType != "windows":
--- 36,47 ----
 buildOpts = eval((open('buildoptions.dat').read()))
 buildType = buildOpts['buildType']
! if buildOpts.has_key('singlefile'):
! options = {"py2exe": {"compressed": 1, "optimize": 2, "bundle_files": 1, "ascii": 1}}
! zipfile = None
! else:
! options = {"py2exe": {"compressed": 1, "optimize": 2}}
! zipfile = r"lib/sharedlib"
! 
! print options
 
 if buildType != "windows":
From: Kevin A. <ka...@us...> - 2007年07月30日 14:31:30
Update of /cvsroot/pythoncard/PythonCard/docs/html
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17716/html
Modified Files:
	what_is_python.html 
Log Message:
switched to wingware.com urls
Index: what_is_python.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/what_is_python.html,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** what_is_python.html	30 Jul 2007 04:34:45 -0000	1.1
--- what_is_python.html	30 Jul 2007 14:31:12 -0000	1.2
***************
*** 55,68 ****
 
 <h2>Why Python?</h2>
! <p>Archaeopteryx Software provides some great information pages discussing the benefits of the Python programming language:</p>
 <blockquote>"Python is an open-source object-oriented programming language that offers two to ten fold programmer productivity increases over languages like C, C++, Java, C#, Visual Basic (VB), and Perl."</blockquote>
 <ul>
! <li><a href="http://archaeopteryx.com/python">Python Overview</a> 
! <li><a href="http://archaeopteryx.com/python/benefits">The benefits of Python</a> 
! <li><a href="http://archaeopteryx.com/python/evaluating">Evaluating Python for your project</a> 
! <li><a href="http://archaeopteryx.com/python/resources">Resources for evaluators</a></li></ul>
 <p><a href="http://www.catb.org/~esr/">Eric Raymond</a> explains <a href="http://www.linuxjournal.com/article.php?sid=3882">Why Python?</a> in a LinuxJournal article.</p>
 <p>Paul Prescod has his own reasons for <a href="http://www.prescod.net/python/why.html">why he promotes Python</a>.</p>
! <p>Some <a href="http://www.python.org/about/success/">Python Success Stories</a>.</p>
 <p>Watch a <a href="http://www.python.org/other/python.mov">15 minute movie Introducing Python</a> (68 MB) by some of its creators and users.</p><br>
 
--- 55,70 ----
 
 <h2>Why Python?</h2>
! <p>Wingware provides some great information pages discussing the benefits of the Python programming language:</p>
 <blockquote>"Python is an open-source object-oriented programming language that offers two to ten fold programmer productivity increases over languages like C, C++, Java, C#, Visual Basic (VB), and Perl."</blockquote>
 <ul>
! <li><a href="http://wingware.com/python">Python Overview</a> 
! <li><a href="http://wingware.com/python/success">Python Success Stories</a> 
! <li><a href="http://wingware.com/python/benefits">The benefits of Python</a> 
! <li><a href="http://wingware.com/python/evaluating">Evaluating Python for your project</a> 
! <li><a href="http://wingware.com/python/business">Open Source in Business</a></li>
! <li><a href="http://wingware.com/python/resources">Resources for evaluators</a></li></ul>
 <p><a href="http://www.catb.org/~esr/">Eric Raymond</a> explains <a href="http://www.linuxjournal.com/article.php?sid=3882">Why Python?</a> in a LinuxJournal article.</p>
 <p>Paul Prescod has his own reasons for <a href="http://www.prescod.net/python/why.html">why he promotes Python</a>.</p>
! <p>Dozens of categorized <a href="http://www.python.org/about/success/">Python Success Stories</a> on the Python.org site.</p>
 <p>Watch a <a href="http://www.python.org/other/python.mov">15 minute movie Introducing Python</a> (68 MB) by some of its creators and users.</p><br>
 
From: Kevin A. <ka...@us...> - 2007年07月30日 04:46:29
Update of /cvsroot/pythoncard/PythonCard/docs
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25121
Modified Files:
	changelog.txt 
Log Message:
changed to new release month, comments for doc changes
Index: changelog.txt
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/changelog.txt,v
retrieving revision 1.332
retrieving revision 1.333
diff -C2 -d -r1.332 -r1.333
*** changelog.txt	6 Aug 2006 23:55:52 -0000	1.332
--- changelog.txt	30 Jul 2007 04:46:30 -0000	1.333
***************
*** 8,12 ****
 
 
! Release 0.8.3 2006-08-??
 added Mac OS X Tiger installation instructions
 added drag and drop file support to codeEditor
--- 8,15 ----
 
 
! Release 0.8.3 2007-09-??
! added what_is_python.html page to docs
! updated Windows and Mac OS X Tiger install instructions for Python 2.5.1
! and wxPython 2.8.4.0
 added Mac OS X Tiger installation instructions
 added drag and drop file support to codeEditor
From: Kevin A. <ka...@us...> - 2007年07月30日 04:45:41
Update of /cvsroot/pythoncard/PythonCard/docs/html
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25073
Modified Files:
	donations.html 
Log Message:
fixed donation urls
Index: donations.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/donations.html,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** donations.html	26 Jul 2004 15:35:31 -0000	1.2
--- donations.html	30 Jul 2007 04:45:40 -0000	1.3
***************
*** 28,32 ****
 tax law, and all donations made by US residents are tax
 deductible (see the
! <a href="http://www.python.org/psf/donations.html">PSF donations page</a>
 for details).</p>
 <p>For more information on the PSF, please see the
--- 28,32 ----
 tax law, and all donations made by US residents are tax
 deductible (see the
! <a href="http://www.python.org/psf/donations/">PSF donations page</a>
 for details).</p>
 <p>For more information on the PSF, please see the
***************
*** 61,65 ****
 needed to springboard these kinds of projects.</p>
 <p>You may like to read the
! <a href="http://www.python.org/psf/mission.html">PSF Mission Statement</a>
 for more details.</p>
 <h2>OK, OK, where do I pay?</h2>
--- 61,65 ----
 needed to springboard these kinds of projects.</p>
 <p>You may like to read the
! <a href="http://www.python.org/psf/mission/">PSF Mission Statement</a>
 for more details.</p>
 <h2>OK, OK, where do I pay?</h2>
From: Kevin A. <ka...@us...> - 2007年07月30日 04:34:45
Update of /cvsroot/pythoncard/PythonCard/docs/html
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20471
Modified Files:
	sidebar.php 
Added Files:
	what_is_python.html 
Log Message:
added what is python and why python html from old blog entries
--- NEW FILE: what_is_python.html ---
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
 <head>
 <meta name="keywords" content="python, programming, hypercard, gui, development" />
 <meta name="author" content="Kevin Altis" />
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
 <link rel="stylesheet" href="PythonCard.css" type="text/css" />
 <title>What is Python and Why Python</title>
 </head>
 <body>
 <div id="banner">
 <h1>What is Python and Why Python</h1>
 </div>
 <?php include "sidebar.php" ?>
 <div id="content">
 <h2>What is Python?</h2>
 <p>Python is an agile programming language.</p>
 <p>There, I said it, so now everyone can stop using terms like scripting and interpreted or high-level 
 that either have negative connotations or don't really get across why Python is so great. 
 Just say <a href="http://www.python.org/">Python</a> is an 
 <a href="http://dictionary.reference.com/search?q=agile">agile</a> programming language. 
 Note that Java and C# are not agile languages, but that Ruby probably is based on what I know about Ruby. 
 If you use <a href="http://www.jython.org/">Jython</a> with Java that also counts as agile.</p>
 <p><a href="http://c2.com/cgi/wiki?WardCunningham">Ward Cunningham</a> and I came up with the idea of 
 calling Python an agile language during an evening get-together on March 14th, 2003 with 
 <a href="http://search.cpan.org/author/INGY/">Brian Ingerson</a>. We tried using the term all evening 
 and it seemed to work. Since then, I've brought it up with people at 
 <a href="http://www.python.org/pycon/">PyCon</a> and other events and everyone seems to like the term. 
 It looks like we have a winner.</a>
 <p>Here's the working list for what I'm calling agile programming languages.</p>
 <ul>
 <li>excellent for beginners, yet superb for experts 
 <li>highly scalable, suitable for large projects as well as small ones 
 <li>rapid development 
 <li>portable, cross-platform 
 <li>embeddable 
 <li>easily extensible 
 <li>object-oriented 
 <li>you can get the job done 
 <li>simple yet elegant 
 <li>stable and mature 
 <li>powerful standard libs 
 <li>wealth of 3rd party packages</li></ul>
 <p>And don't forget that with Python, programming is fun again!</p>
 <p>What is sort of interesting is that while I think Python is an excellent programming language to use 
 with <a href="http://www.computerworld.com/softwaretopics/software/appdev/story/0,10801,67952,00.html">Agile Development Methods</a> 
 I wasn't trying to just ride on that bandwagon. It is precisely because Python is an agile language 
 that it is applicable to agile development methods, quick one-off programs normally thought of as 
 scripts, and traditional software development done by solo programmers or teams. Most of the programming 
 world still hasn't embraced the tenets of the <a href="http://www.martinfowler.com/articles/newMethodology.html">agile methodology</A>, 
 but despite the programming style or type of program you're writing, Python will be applicable to the problem you're trying to solve.</p>
 <h2>Why Python?</h2>
 <p>Archaeopteryx Software provides some great information pages discussing the benefits of the Python programming language:</p>
 <blockquote>"Python is an open-source object-oriented programming language that offers two to ten fold programmer productivity increases over languages like C, C++, Java, C#, Visual Basic (VB), and Perl."</blockquote>
 <ul>
 <li><a href="http://archaeopteryx.com/python">Python Overview</a> 
 <li><a href="http://archaeopteryx.com/python/benefits">The benefits of Python</a> 
 <li><a href="http://archaeopteryx.com/python/evaluating">Evaluating Python for your project</a> 
 <li><a href="http://archaeopteryx.com/python/resources">Resources for evaluators</a></li></ul>
 <p><a href="http://www.catb.org/~esr/">Eric Raymond</a> explains <a href="http://www.linuxjournal.com/article.php?sid=3882">Why Python?</a> in a LinuxJournal article.</p>
 <p>Paul Prescod has his own reasons for <a href="http://www.prescod.net/python/why.html">why he promotes Python</a>.</p>
 <p>Some <a href="http://www.python.org/about/success/">Python Success Stories</a>.</p>
 <p>Watch a <a href="http://www.python.org/other/python.mov">15 minute movie Introducing Python</a> (68 MB) by some of its creators and users.</p><br>
 <?php include "footer.php" ?>
 <p>$Revision: 1.1 $ : $Author: kasplat $ : Last updated $Date: 2007年07月30日 04:34:45 $</p>
 </div>
 </body>
</html>
Index: sidebar.php
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/sidebar.php,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** sidebar.php	24 May 2006 23:14:27 -0000	1.8
--- sidebar.php	30 Jul 2007 04:34:45 -0000	1.9
***************
*** 39,43 ****
 <h4>Exits</h4>
 <ul>
! <li><a href="http://altis.pycs.net/stories/2003/04/16/whatIsPythonAndWhyPython.html">What is Python?</a></li>
 <li><a href="/learning_python.html">Learning Python</a></li>
 <li><a href="http://www.wxpython.org/">wxPython</a></li>
--- 39,43 ----
 <h4>Exits</h4>
 <ul>
! <li><a href="/what_is_python.html">What is Python?</a></li>
 <li><a href="/learning_python.html">Learning Python</a></li>
 <li><a href="http://www.wxpython.org/">wxPython</a></li>
From: Kevin A. <ka...@us...> - 2007年07月29日 06:00:33
Update of /cvsroot/pythoncard/PythonCard/samples/noresource
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14399/samples/noresource
Modified Files:
	autobutton.py 
Log Message:
updated to use dynamic string and exec for creating event handlers
Index: autobutton.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/samples/noresource/autobutton.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** autobutton.py	27 Jun 2007 01:35:02 -0000	1.1
--- autobutton.py	29 Jul 2007 06:00:28 -0000	1.2
***************
*** 14,18 ****
 'name':'bgMin',
 'title':'Minimal PythonCard Application',
! 'size':(200, 100),
 'components': [
 
--- 14,18 ----
 'name':'bgMin',
 'title':'Minimal PythonCard Application',
! 'size':(200, 120),
 'components': [
 
***************
*** 26,30 ****
 self.components['field1'] = {'type':'TextField',
 'name':'field1',
! 'position':(5,5),
 'size':(150, -1),
 'text':'Hello PythonCard'}
--- 26,30 ----
 self.components['field1'] = {'type':'TextField',
 'name':'field1',
! 'position':(5, 5),
 'size':(150, -1),
 'text':'Hello PythonCard'}
***************
*** 33,50 ****
 
 def mouseclick_factory(self, name):
! def function(self, event):
! # changed to event.target.name to verify we're getting
! # the correct target when button is clicked
! print "You clicked '%s'." % event.target.name
! # func_name seems to be the magic attribute rather than
! # just setting func.name
! function.func_name = "on_%s_mouseClick" % name
! self.addMethod(function)
 self.components[name] = {'type':'Button',
 'name':name,
 'label':name,
! 'position':(5,5+int(name[-1:])*30),
 'text':name}
- return function
 
 
--- 33,47 ----
 
 def mouseclick_factory(self, name):
! fname = 'on_%s_mouseClick' % name
! s = 'def %s(self, event):\n' % fname
! s += ' print "You clicked %s." % event.target.name\n'
! d = {}
! exec s in d
! self.addMethod(d[fname])
 self.components[name] = {'type':'Button',
 'name':name,
 'label':name,
! 'position':(5, 5 + int(name[-1:]) * 30),
 'text':name}
 
 
Update of /cvsroot/pythoncard/PythonCard/docs/html
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32192
Modified Files:
	macosx_tiger_installation.html windows_installation.html 
Log Message:
updated Windows and Mac OS X (Tiger) installation instructions for
Python 2.5.1 and wxPython 2.8.4.0
Index: macosx_tiger_installation.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/macosx_tiger_installation.html,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** macosx_tiger_installation.html	7 Aug 2006 00:16:53 -0000	1.4
--- macosx_tiger_installation.html	29 Jul 2007 02:31:46 -0000	1.5
***************
*** 31,39 ****
 <p>If you're running Tiger then you already have Python 2.3.5 installed on 
 your system, but we want a more up-to-date build of Python.</p>
! <p>Click on this <a href="http://www.python.org/ftp/python/2.4.3/Universal-MacPython-2.4.3.dmg">Universal-MacPython-2.4.3.dmg</a> 
 link to begin the download. Most Mac OS X browsers will save the file to your
 desktop.</p>
 <h2>Downloading wxPython</h2>
! <p>PythonCard relies on the wxPython package. Click on this <a href="http://prdownloads.sourceforge.net/wxpython/wxPython2.6-osx-unicode-2.6.3.3-universal10.4-py2.4.dmg">wxPython2.6-osx-unicode-2.6.3.3-universal10.4-py2.4.dmg</a> 
 link to begin the download. Again, most Mac OS X browsers will save the file 
 to your desktop.</p>
--- 31,39 ----
 <p>If you're running Tiger then you already have Python 2.3.5 installed on 
 your system, but we want a more up-to-date build of Python.</p>
! <p>Click on this <a href="http://www.python.org/ftp/python/2.5.1/python-2.5.1-macosx.dmg">python-2.5.1-macosx.dmg</a> 
 link to begin the download. Most Mac OS X browsers will save the file to your
 desktop.</p>
 <h2>Downloading wxPython</h2>
! <p>PythonCard relies on the wxPython package. Click on this <a href="http://internap.dl.sourceforge.net/sourceforge/wxpython/wxPython2.8-osx-unicode-2.8.4.0-universal10.4-py2.5.dmg">wxPython2.8-osx-unicode-2.8.4.0-universal10.4-py2.5.dmg</a> 
 link to begin the download. Again, most Mac OS X browsers will save the file 
 to your desktop.</p>
***************
*** 46,62 ****
 <p>Python arrives at your system as an installable disk image. All you have 
 to do is double-click on the file you downloaded (it's called 
! Universal-MacPython-2.4.3.dmg), then double-click the MacPython.mpkg icon and 
 follow the instructions in the installation wizard. The installer will create
! a new directory <span class="code">/Library/Frameworks/Python.framework/Versions/2.4/</span> 
 to contain the Python executables, documentation, tools, and standard 
! libraries. It will also create a folder in your Applications folder called MacPython 2.4 which contains
! the IDLE editor, PythonLauncher, and a large number of demos.</p>
 <h2>Installing wxPython</h2>
 <p>wxPython also comes as an installable disk image. Just double-click on the
! file you downloaded (it's called wxPython2.6-osx-unicode-2.6.3.3-universal10.4-py2.4.dmg), then
! double-click the wxPython2.6-osx-unicode-universal10.4-py2.4.pkg icon and follow the instructions. 
! wxPython will be installed into <span class="code">/Library/Frameworks/Python.framework/Versions/2.4/lib/python2.4/site-packages/</span>. </p>
! You should also download the Docs, Demos, and Samples for wxPython. Click on this <a href="http://prdownloads.sourceforge.net/wxpython/wxPython2.6-osx-docs-demos-2.6.3.3-universal10.4-py2.4.dmg">wxPython2.6-osx-docs-demos-2.6.3.3-universal10.4-py2.4.dmg</a> 
! link to begin the download.
 <p>I recommend creating a wxPython folder in your Applications folder and 
 copying the Apps, Docs, Samples, and README 1st.txt files to the wxPython 
--- 46,62 ----
 <p>Python arrives at your system as an installable disk image. All you have 
 to do is double-click on the file you downloaded (it's called 
! python-2.5.1-macosx.dmg), then double-click the MacPython.mpkg icon and 
 follow the instructions in the installation wizard. The installer will create
! a new directory <span class="code">/Library/Frameworks/Python.framework/Versions/2.5/</span> 
 to contain the Python executables, documentation, tools, and standard 
! libraries. It will also create a folder in your Applications folder called MacPython 2.5 which contains
! the IDLE editor, Python Launcher, and a large number of demos.</p>
 <h2>Installing wxPython</h2>
 <p>wxPython also comes as an installable disk image. Just double-click on the
! file you downloaded (it's called wxPython2.8-osx-unicode-2.8.4.0-universal10.4-py2.5.dmg), then
! double-click the wxPython2.8-osx-unicode-universal10.4-py2.5.pkg icon and follow the instructions. 
! wxPython will be installed into <span class="code">/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/</span>. </p>
! <p>You should also download the Docs, Demos, and Samples for wxPython. Click on this <a href="http://internap.dl.sourceforge.net/sourceforge/wxpython/wxPython2.8-osx-docs-demos-2.8.4.0-universal10.4-py2.5.dmg">wxPython2.8-osx-docs-demos-2.8.4.0-universal10.4-py2.5.dmg</a> 
! link to begin the download.</p>
 <p>I recommend creating a wxPython folder in your Applications folder and 
 copying the Apps, Docs, Samples, and README 1st.txt files to the wxPython 
***************
*** 68,72 ****
 You should now have a PythonCard-0.8.2 directory on your desktop. 
 Open the Terminal application and do a cd to that directory and then run the 
! setup.py script using the 2.3 Python you just installed. The sudo command 
 will prompt you for your password.</p>
 <p class="code">
--- 68,72 ----
 You should now have a PythonCard-0.8.2 directory on your desktop. 
 Open the Terminal application and do a cd to that directory and then run the 
! setup.py script using the 2.5.1 Python you just installed. The sudo command 
 will prompt you for your password.</p>
 <p class="code">
***************
*** 74,97 ****
 [mymachine:~/Desktop/PythonCard-0.8.2] bob% sudo python setup.py 
 install</p>
! <p>By default, the PythonCard framework will be installed into <span class="code">/Library/Frameworks/Python.framework/Versions/2.4/lib/python2.4/site-packages/PythonCard/</span>. 
 You'll probably want to make an alias to this directory to keep on your 
 desktop or home folder to make it easier to get to the PythonCard tools and 
 samples.</p>
 <h2>Confirming Installation</h2>
! <h3>Configuring PythonLauncher</h3>
 <p>The default install leaves .py and .pyw files associated with the Python 
! IDE rather than PythonLauncher which is the app used to run Python scripts 
! from the Finder. PythonLauncher is located in your Applications/MacPython 2.4 folder</p>
 <p>If you select a .py file you can choose Get Info from the File menu and 
! then change the files to open with PythonLauncher instead of the IDE if you 
 want to be able to double-click a file and have it run. Repeat the process 
 for .pyw files. Alternatively, you can hold down the control key and when you
! click on a .py file then you can select PythonLauncher from the Open With
 menu item.</p>
! <p class="imageCaption"><img src="http://pythoncard.sourceforge.net/images/pythonlauncher.png" alt="Mac Preferences Dialog" /><br />
! Figure 1. PythonLauncher Preferences</p>
 <h3>Acid Test</h3>
 <p>OK, now comes the acid test. Open the folder called &quot;minimal&quot; in
! <span class="code">/Library/Frameworks/Python.framework/Versions/2.4/lib/python2.4/site-packages/PythonCard/samples</span>. 
 Find the icon labeled minimal.py and double-click it. In a few moments (after 
 an operating system console window has appeared), a small window like the 
--- 74,97 ----
 [mymachine:~/Desktop/PythonCard-0.8.2] bob% sudo python setup.py 
 install</p>
! <p>By default, the PythonCard framework will be installed into <span class="code">/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/PythonCard/</span>. 
 You'll probably want to make an alias to this directory to keep on your 
 desktop or home folder to make it easier to get to the PythonCard tools and 
 samples.</p>
 <h2>Confirming Installation</h2>
! <h3>Configuring Python Launcher</h3>
 <p>The default install leaves .py and .pyw files associated with the Python 
! IDE rather than Python Launcher which is the app used to run Python scripts 
! from the Finder. Python Launcher is located in your Applications/MacPython 2.5 folder</p>
 <p>If you select a .py file you can choose Get Info from the File menu and 
! then change the files to open with Python Launcher instead of the IDE if you 
 want to be able to double-click a file and have it run. Repeat the process 
 for .pyw files. Alternatively, you can hold down the control key and when you
! click on a .py file then you can select Python Launcher from the Open With
 menu item.</p>
! <p class="imageCaption"><img src="http://pythoncard.sourceforge.net/images/pythonlauncher2.png" alt="Mac Preferences Dialog" /><br />
! Figure 1. Python Launcher Preferences</p>
 <h3>Acid Test</h3>
 <p>OK, now comes the acid test. Open the folder called &quot;minimal&quot; in
! <span class="code">/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/PythonCard/samples</span>. 
 Find the icon labeled minimal.py and double-click it. In a few moments (after 
 an operating system console window has appeared), a small window like the 
Index: windows_installation.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/windows_installation.html,v
retrieving revision 1.18
retrieving revision 1.19
diff -C2 -d -r1.18 -r1.19
*** windows_installation.html	6 Apr 2006 11:00:26 -0000	1.18
--- windows_installation.html	29 Jul 2007 02:31:46 -0000	1.19
***************
*** 24,39 ****
 </ol>
 <h2>Downloading Python</h2>
! <p>Python 2.4.3 is available from a couple of sources.</p>
 <ul>
! <li>The main <a href="http://www.python.org/2.4.3/">Python 2.4.3</a> page.</li>
! <li>The <a href="http://www.activestate.com/Products/ActivePython/more_information.plex">ActivePython</a> distribution</li>
 </ul>
 <p>For this guide, we'll be installing from the main Python site. Click on 
! this <a href="http://www.python.org/ftp/python/2.4.3/Python-2.4.3.exe">Python-2.4.3.exe</a> 
 link to begin the download. Tell your browser where you want the file stored 
 and the download proceeds. Note where on your system the file is saved by your
 browser.</p>
 <h2>Downloading wxPython</h2>
! <p>PythonCard relies on the wxPython package. Click on this <a href="http://prdownloads.sourceforge.net/wxpython/wxPython2.6-win32-ansi-2.6.3.0-py24.exe">win32-ansi 2.6.3 for Python 2.4</a> 
 link to begin the download. Tell your browser where you want the file stored 
 and the download proceeds. Note where on your system the file is saved by your
--- 24,39 ----
 </ol>
 <h2>Downloading Python</h2>
! <p>Python 2.5.1 is available from a couple of sources.</p>
 <ul>
! <li>The <a href="http://www.python.org/download/">Python downloads</a> page.</li>
! <li>The <a href="http://www.activestate.com/Products/activepython/">ActivePython</a> distribution</li>
 </ul>
 <p>For this guide, we'll be installing from the main Python site. Click on 
! this <a href="http://www.python.org/ftp/python/2.5.1/python-2.5.1.msi">Python-2.5.1.msi</a> 
 link to begin the download. Tell your browser where you want the file stored 
 and the download proceeds. Note where on your system the file is saved by your
 browser.</p>
 <h2>Downloading wxPython</h2>
! <p>PythonCard relies on the wxPython package. Click on this <a href="http://internap.dl.sourceforge.net/sourceforge/wxpython/wxPython2.8-win32-unicode-2.8.4.0-py25.exe">wxPython2.8-win32-unicode-2.8.4.0-py25.exe</a> 
 link to begin the download. Tell your browser where you want the file stored 
 and the download proceeds. Note where on your system the file is saved by your
***************
*** 48,65 ****
 <p>Python arrives at your system as an installable application. All you have 
 to do is double-click on the file you downloaded (it's called 
! Python-2.4.3.exe) and follow the instructions in the installation wizard. By 
! default, the installer will create a new directory C:\Python23 to contain the
 Python executables, documentation, tools, IDLE editor, and standard 
! libraries. We'll refer to that directory as just <strong>Python23</strong> for
 the remainder of the instructions.</p>
 <h2>Installing wxPython</h2>
 <p>wxPython also comes as an automatic installer. Just double-click on the
! file you downloaded (it's called wxPython2.6-win32-ansi-2.6.3.0-py24.exe) and follow 
 the instructions. By default, wxPython will be installed into 
! Python24\Lib\site-packages.</p>
 <h2>Installing PythonCard</h2>
 <p>PythonCard also comes as an automatic installer. Just double-click on the
 file you downloaded and follow the instructions. By default, the PythonCard 
! framework will be installed into Python23\Lib\site-packages.</p>
 <p>As part of the automated install some shortcuts and a program group on your
 start menu are created. If you have installed Python as a ordinary user (Who 
--- 48,67 ----
 <p>Python arrives at your system as an installable application. All you have 
 to do is double-click on the file you downloaded (it's called 
! python-2.5.1.msi) and follow the instructions in the installation wizard. By 
! default, the installer will create a new directory C:\Python25 to contain the
 Python executables, documentation, tools, IDLE editor, and standard 
! libraries. We'll refer to that directory as just <strong>Python25</strong> for
 the remainder of the instructions.</p>
 <h2>Installing wxPython</h2>
 <p>wxPython also comes as an automatic installer. Just double-click on the
! file you downloaded (it's called wxPython2.8-win32-unicode-2.8.4.0-py25.exe) and follow 
 the instructions. By default, wxPython will be installed into 
! Python25\Lib\site-packages.</p>
! <p>You should also download the Docs, Demos, and Samples for wxPython. Click on this <a href="http://internap.dl.sourceforge.net/sourceforge/wxpython/wxPython2.8-win32-docs-demos-2.8.4.0.exe">wxPython2.8-win32-docs-demos-2.8.4.0.exe</a> 
! link to begin the download.</p>
 <h2>Installing PythonCard</h2>
 <p>PythonCard also comes as an automatic installer. Just double-click on the
 file you downloaded and follow the instructions. By default, the PythonCard 
! framework will be installed into Python25\Lib\site-packages.</p>
 <p>As part of the automated install some shortcuts and a program group on your
 start menu are created. If you have installed Python as a ordinary user (Who 
***************
*** 72,76 ****
 <h2>Confirming Installation</h2>
 <p>OK, now comes the acid test. Open the folder called &quot;minimal&quot; in 
! Python23\Lib\site-packages\PythonCard\samples. Find the icon labeled
 minimal.py and double-click it. In a few moments (after an operating system 
 console window has appeared), a small window like the one shown in Figure 1 
--- 74,78 ----
 <h2>Confirming Installation</h2>
 <p>OK, now comes the acid test. Open the folder called &quot;minimal&quot; in 
! Python25\Lib\site-packages\PythonCard\samples. Find the icon labeled
 minimal.py and double-click it. In a few moments (after an operating system 
 console window has appeared), a small window like the one shown in Figure 1 
From: Kevin A. <ka...@us...> - 2007年07月28日 23:44:03
Update of /cvsroot/pythoncard/PythonCard
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2193
Modified Files:
	model.py 
Log Message:
tweaked addMethod and isPythonCardHandler to handle functions and methods
Index: model.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/model.py,v
retrieving revision 1.198
retrieving revision 1.199
diff -C2 -d -r1.198 -r1.199
*** model.py	28 Jul 2007 23:13:31 -0000	1.198
--- model.py	28 Jul 2007 23:44:04 -0000	1.199
***************
*** 537,541 ****
 Return true if the object is a PythonCard handler.
 """
! return isinstance(aObject, types.FunctionType) and aObject.__name__.split('_')[0] == 'on'
 
 def _addHandler(self, aMethod):
--- 537,543 ----
 Return true if the object is a PythonCard handler.
 """
! return isinstance(aObject, types.FunctionType) or \
! isinstance(aObject, types.MethodType) and \
! aObject.__name__.split('_')[0] == 'on'
 
 def _addHandler(self, aMethod):
***************
*** 547,552 ****
 
 def addMethod(self, aFunction):
! if isinstance(aFunction, types.FunctionType):
! if self.isPythonCardHandler(aFunction) :
 #aMethod = new.instancemethod(aFunction, self, self.__class__)
 aMethod = new.instancemethod(aFunction, None, self.__class__)
--- 549,554 ----
 
 def addMethod(self, aFunction):
! if self.isPythonCardHandler(aFunction):
! if isinstance(aFunction, types.FunctionType):
 #aMethod = new.instancemethod(aFunction, self, self.__class__)
 aMethod = new.instancemethod(aFunction, None, self.__class__)
***************
*** 555,576 ****
 #print aMethod.__name__
 #print aMethod
! setattr(self.__class__, aMethod.__name__, aMethod)
! # now add the method info to our handler lookup dictionary
! # KEA 2001年11月29日 simplified _addHandler
! #handler = event.Handler(aMethod.__name__, aMethod)
! #self._addHandler(aMethod.__name__, handler)
! self._addHandler(aMethod)
! 
! # KEA 2004年05月13日
! # will need to call _bindEvents here to make sure the event handler
! # is bound to the right component instances
! # trying to figure out all the components as well as the reverse mapping
! # from an event name like mouseDown to event.MouseDownEvent is tricky
! # at best so we'll probably need to have user-code make explicit calls
! # to _bindEvents for each component they want to bind
! # the name to event class mapping can be found by iterativing over the
! # events defined in the spec for a given component to find a name match
! # maybe just calling _bindEvents with a full list of relevant events
! # would work, since the boundEvents list will prevent double-binding 
 
 def findHandler(self, aString):
--- 557,580 ----
 #print aMethod.__name__
 #print aMethod
! else:
! aMethod = aFunction
! setattr(self.__class__, aMethod.__name__, aMethod)
! # now add the method info to our handler lookup dictionary
! # KEA 2001年11月29日 simplified _addHandler
! #handler = event.Handler(aMethod.__name__, aMethod)
! #self._addHandler(aMethod.__name__, handler)
! self._addHandler(aMethod)
! 
! # KEA 2004年05月13日
! # will need to call _bindEvents here to make sure the event handler
! # is bound to the right component instances
! # trying to figure out all the components as well as the reverse mapping
! # from an event name like mouseDown to event.MouseDownEvent is tricky
! # at best so we'll probably need to have user-code make explicit calls
! # to _bindEvents for each component they want to bind
! # the name to event class mapping can be found by iterativing over the
! # events defined in the spec for a given component to find a name match
! # maybe just calling _bindEvents with a full list of relevant events
! # would work, since the boundEvents list will prevent double-binding 
 
 def findHandler(self, aString):
From: Kevin A. <ka...@us...> - 2007年07月28日 23:13:30
Update of /cvsroot/pythoncard/PythonCard
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23489
Modified Files:
	model.py 
Log Message:
moved required version info to tuples and updated minimum requirements dialog
Index: model.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/model.py,v
retrieving revision 1.197
retrieving revision 1.198
diff -C2 -d -r1.197 -r1.198
*** model.py	13 Jan 2006 23:33:37 -0000	1.197
--- model.py	28 Jul 2007 23:13:31 -0000	1.198
***************
*** 11,18 ****
 # if they aren't met
 
 try:
 # some things might work with lesser
 # versions, but this is a reasonable base
! assert sys.version_info >= (2, 3)
 # sys.modules relative path fix
 sys.path[0] = os.path.abspath(sys.path[0])
--- 11,21 ----
 # if they aren't met
 
+ REQUIRED_PYTHON = (2, 3)
+ REQUIRED_WXPYTHON = (2, 6)
+ 
 try:
 # some things might work with lesser
 # versions, but this is a reasonable base
! assert sys.version_info >= REQUIRED_PYTHON
 # sys.modules relative path fix
 sys.path[0] = os.path.abspath(sys.path[0])
***************
*** 20,34 ****
 
 import wx
! assert wx.VERSION >= (2, 5, 2, 8)
 except AssertionError:
! from wxPython.wx import wxPySimpleApp, wxFrame, wxMessageDialog, wxICON_EXCLAMATION, wxOK, wxVERSION_STRING
! app = wxPySimpleApp()
! frame = wxFrame(None, -1, "Minimum Requirements Not Met")
! #frame.Show(1)
! message = "PythonCard minimum requirements:\nPython 2.3 and wxPython 2.5.2.8\n\n" + \
! "You are using Python %s\nand wxPython %s.\n\nClick OK to exit." % (sys.version, wxVERSION_STRING)
! dialog = wxMessageDialog(frame, message,
 "Minimum Requirements Not Met", 
! wxICON_EXCLAMATION | wxOK)
 dialog.ShowModal()
 dialog.Destroy()
--- 23,45 ----
 
 import wx
! assert wx.VERSION >= REQUIRED_WXPYTHON
 except AssertionError:
! app = wx.PySimpleApp()
! frame = wx.Frame(None, -1, "Minimum Requirements Not Met")
! message = """PythonCard minimum requirements:
! Python %s
! wxPython %s
! 
! You are using:
! Python %s
! wxPython %s
! 
! Click OK to exit.""" % \
! (".".join([str(c) for c in REQUIRED_PYTHON]), 
! ".".join([str(c) for c in REQUIRED_WXPYTHON]), 
! sys.version, wx.VERSION_STRING)
! dialog = wx.MessageDialog(frame, message,
 "Minimum Requirements Not Met", 
! wx.ICON_EXCLAMATION | wx.OK)
 dialog.ShowModal()
 dialog.Destroy()
From: Kevin A. <ka...@us...> - 2007年07月28日 23:12:00
Update of /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23098/tools/standaloneBuilder
Modified Files:
	standaloneBuilder.py 
Log Message:
removed import, switched to wx. style instead
Index: standaloneBuilder.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/standaloneBuilder.py,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** standaloneBuilder.py	28 Jul 2007 14:53:11 -0000	1.16
--- standaloneBuilder.py	28 Jul 2007 23:12:00 -0000	1.17
***************
*** 54,64 ****
 # temporary hack until we get it working properly under MacOS
 if wx.Platform == '__WXMAC__':
! from wx import PySimpleApp, Frame, MessageDialog, ICON_EXCLAMATION, OK, VERSION_STRING
! app = PySimpleApp()
 title = 'Sorry!'
! frame = Frame(None, -1, title)
 message = 'standaloneBuilder currently does not work properly under MacOS. This shortcoming will '
 message += 'be fixed in a future release.\n\nClick OK to exit.'
! dialog = MessageDialog(frame, wrap_string(message, 52), title, ICON_EXCLAMATION | OK)
 dialog.ShowModal()
 dialog.Destroy()
--- 54,63 ----
 # temporary hack until we get it working properly under MacOS
 if wx.Platform == '__WXMAC__':
! app = wx.PySimpleApp()
 title = 'Sorry!'
! frame = wx.Frame(None, -1, title)
 message = 'standaloneBuilder currently does not work properly under MacOS. This shortcoming will '
 message += 'be fixed in a future release.\n\nClick OK to exit.'
! dialog = wx.MessageDialog(frame, wrap_string(message, 52), title, wx.ICON_EXCLAMATION | wx.OK)
 dialog.ShowModal()
 dialog.Destroy()
Update of /cvsroot/pythoncard/PythonCard/docs/html
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28956
Modified Files:
	moreapplications.html walkthrough1.html 
Log Message:
fixed old instructions to refer to File->About menu item
Index: moreapplications.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/moreapplications.html,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** moreapplications.html	10 Nov 2004 19:22:21 -0000	1.7
--- moreapplications.html	28 Jul 2007 20:40:04 -0000	1.8
***************
*** 18,21 ****
--- 18,32 ----
 <hr />
 <dl>
+ <dt>Name:</dt> 
+ <dd>dijkstra</dd>
+ <dt>Description:</dt>
+ <dd>Dijkstra's Shortest Path Algorithm Demo</dd>
+ <dt>URL:</dt>
+ <dd><a href="http://codeshift.net/dijkstra">http://codeshift.net/dijkstra</a></dd>
+ </dl>
+ <p class="imageCaption"><img src="http://codeshift.net/dijkstra?action=AttachFile&do=get&target=dijkstra.png" alt="Screenshot of dijkstra" /></p>
+ 
+ <hr />
+ <dl>
 <dt>Name:</dt>
 <dd>PIMP: Photographic Image Management Package</dd>
Index: walkthrough1.html
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/docs/html/walkthrough1.html,v
retrieving revision 1.23
retrieving revision 1.24
diff -C2 -d -r1.23 -r1.24
*** walkthrough1.html	3 Jan 2006 18:28:32 -0000	1.23
--- walkthrough1.html	28 Jul 2007 20:40:04 -0000	1.24
***************
*** 171,175 ****
 GettingStarted&quot;. In that directory is a file called starter1.py. Launch 
 it in the usual way. It is a bare-bones PythonCard application. In fact, it's
! a copy of the minimal application you ran in the last section.</p>
 <p>Open the file starter1.py in your Python-aware editor of choice. The Python
 script is, as you'd expect, brief and to the point. Here's the important 
--- 171,175 ----
 GettingStarted&quot;. In that directory is a file called starter1.py. Launch 
 it in the usual way. It is a bare-bones PythonCard application. In fact, it's
! a copy of the minimal application you ran in the last section with just a few changes.</p>
 <p>Open the file starter1.py in your Python-aware editor of choice. The Python
 script is, as you'd expect, brief and to the point. Here's the important 
***************
*** 197,201 ****
 </pre>
 <p>Again, this new line of Python code is readable even if you're not a 
! Python guru yet. Now when the user selects the Exit menu, rather than doing 
 nothing, we'll display an alert dialog titled &quot;Showing Off&quot; that 
 says &quot;It works!&quot;</p>
--- 197,201 ----
 </pre>
 <p>Again, this new line of Python code is readable even if you're not a 
! Python guru yet. Now when the user selects the About menu item, rather than doing 
 nothing, we'll display an alert dialog titled &quot;Showing Off&quot; that 
 says &quot;It works!&quot;</p>
***************
*** 217,222 ****
 consequences because these editors use a different graphics library from 
 what PythonCard uses.</p>
! <p>Double-click the &quot;starter1&quot; application. When the window appears,
! select the Exit option from the File menu. You'll see a small dialog appear 
 as described above.</p>
 <p>Close the application by selecting its window's close box.</p>
--- 217,222 ----
 consequences because these editors use a different graphics library from 
 what PythonCard uses.</p>
! <p>Double-click the &quot;starter1.py&quot; application. When the window appears,
! select the About option from the File menu. You'll see a small dialog appear 
 as described above.</p>
 <p>Close the application by selecting its window's close box.</p>
***************
*** 231,237 ****
 takes its text from the text in a component called &quot;field1.&quot; That 
 happens, of course, to be the only field in our little application.</p>
! <p>Save the code. Then double-click the &quot;starter1&quot; application to 
 try out the change.</p>
! <p>Now when you change the text in the field and select File-&gt;Exit, you'll
 see a dialog box that contains the text you put into the field.</p>
 <h2>What We've Learned</h2>
--- 231,237 ----
 takes its text from the text in a component called &quot;field1.&quot; That 
 happens, of course, to be the only field in our little application.</p>
! <p>Save the code. Then double-click the &quot;starter1.py&quot; application to 
 try out the change.</p>
! <p>Now when you change the text in the field and select File-&gt;About, you'll
 see a dialog box that contains the text you put into the field.</p>
 <h2>What We've Learned</h2>
From: Kevin A. <ka...@us...> - 2007年07月28日 14:56:47
Update of /cvsroot/pythoncard/PythonCard/tools/codeEditor
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31378/tools/codeEditor
Modified Files:
	codeEditor.py 
Log Message:
moved code to find Python documentation (pythonDocumentationURL) to util.py
Index: codeEditor.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/codeEditor/codeEditor.py,v
retrieving revision 1.128
retrieving revision 1.129
diff -C2 -d -r1.128 -r1.129
*** codeEditor.py	10 Aug 2006 09:40:54 -0000	1.128
--- codeEditor.py	28 Jul 2007 14:56:43 -0000	1.129
***************
*** 53,71 ****
 pythoncard_url = util.documentationURL("documentation.html")
 shell_url = util.documentationURL("shell.html")
! 
! help_url = "http://docs.python.org/"
! if sys.platform.startswith("win"):
! fn = os.path.dirname(os.__file__)
! fn = os.path.join(fn, os.pardir, "Doc", "index.html")
! fn = os.path.normpath(fn)
! if os.path.isfile(fn):
! help_url = fn
! del fn
! elif sys.platform == 'darwin':
! fn = '/Library/Frameworks/Python.framework/Versions/' + \
! 'Current/Resources/Python.app/Contents/Resources/English.lproj/' + \
! 'PythonDocumentation/index.html'
! if os.path.exists(fn):
! help_url = "file://" + fn
 
 
--- 53,57 ----
 pythoncard_url = util.documentationURL("documentation.html")
 shell_url = util.documentationURL("shell.html")
! help_url = util.pythonDocumentationURL()
 
 
From: Kevin A. <ka...@us...> - 2007年07月28日 14:56:47
Update of /cvsroot/pythoncard/PythonCard
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31378
Modified Files:
	util.py 
Log Message:
moved code to find Python documentation (pythonDocumentationURL) to util.py
Index: util.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/util.py,v
retrieving revision 1.39
retrieving revision 1.40
diff -C2 -d -r1.39 -r1.40
*** util.py	18 May 2006 21:11:49 -0000	1.39
--- util.py	28 Jul 2007 14:56:43 -0000	1.40
***************
*** 120,123 ****
--- 120,146 ----
 return url
 
+ def pythonDocumentationURL():
+ help_url = "http://docs.python.org/"
+ if sys.platform.startswith("win"):
+ fn = os.path.dirname(os.__file__)
+ fn = os.path.join(fn, os.pardir, "Doc", "index.html")
+ fn = os.path.normpath(fn)
+ if os.path.isfile(fn):
+ help_url = fn
+ del fn
+ elif sys.platform == 'darwin':
+ fn = '/Library/Frameworks/Python.framework/Versions/' + \
+ 'Current/Resources/English.lproj/Documentation/index.html'
+ if os.path.exists(fn):
+ help_url = "file://" + fn
+ else:
+ fn = '/Library/Frameworks/Python.framework/Versions/' + \
+ 'Current/Resources/Python.app/Contents/Resources/English.lproj/' + \
+ 'PythonDocumentation/index.html'
+ if os.path.exists(fn):
+ help_url = "file://" + fn
+ return help_url
+ 
+ 
 def dirwalk(dir, patterns=['*'], recurse=1):
 """walk a directory tree, using a generator
From: Kevin A. <ka...@us...> - 2007年07月28日 14:56:47
Update of /cvsroot/pythoncard/PythonCard/tools/oneEditor
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31378/tools/oneEditor
Modified Files:
	tabcodeEditor.py 
Log Message:
moved code to find Python documentation (pythonDocumentationURL) to util.py
Index: tabcodeEditor.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/oneEditor/tabcodeEditor.py,v
retrieving revision 1.18
retrieving revision 1.19
diff -C2 -d -r1.18 -r1.19
*** tabcodeEditor.py	13 Jun 2006 16:11:45 -0000	1.18
--- tabcodeEditor.py	28 Jul 2007 14:56:43 -0000	1.19
***************
*** 56,74 ****
 pythoncard_url = util.documentationURL("documentation.html")
 shell_url = util.documentationURL("shell.html")
! 
! help_url = "http://docs.python.org/"
! if sys.platform.startswith("win"):
! fn = os.path.dirname(os.__file__)
! fn = os.path.join(fn, os.pardir, "Doc", "index.html")
! fn = os.path.normpath(fn)
! if os.path.isfile(fn):
! help_url = fn
! del fn
! elif sys.platform == 'darwin':
! fn = '/Library/Frameworks/Python.framework/Versions/' + \
! 'Current/Resources/Python.app/Contents/Resources/English.lproj/' + \
! 'PythonDocumentation/index.html'
! if os.path.exists(fn):
! help_url = "file://" + fn
 
 def getResourceFilename(path):
--- 56,60 ----
 pythoncard_url = util.documentationURL("documentation.html")
 shell_url = util.documentationURL("shell.html")
! help_url = util.pythonDocumentationURL()
 
 def getResourceFilename(path):
From: Kevin A. <ka...@us...> - 2007年07月28日 14:53:11
Update of /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29890
Modified Files:
	standaloneBuilder.py 
Log Message:
commented out unused wxHtmlEasyPrinting import
converted wxPython to wx imports so Mac startup error works correctly
Index: standaloneBuilder.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/tools/standaloneBuilder/standaloneBuilder.py,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -d -r1.15 -r1.16
*** standaloneBuilder.py	3 Nov 2006 14:56:25 -0000	1.15
--- standaloneBuilder.py	28 Jul 2007 14:53:11 -0000	1.16
***************
*** 38,42 ****
 # pythoncard imports
 import wx
! from wxPython.html import wxHtmlEasyPrinting
 from PythonCard import dialog, model, util
 from PythonCard.templates.dialogs import runOptionsDialog
--- 38,44 ----
 # pythoncard imports
 import wx
! # KEA 2007年07月28日
! # unused...
! #from wxPython.html import wxHtmlEasyPrinting
 from PythonCard import dialog, model, util
 from PythonCard.templates.dialogs import runOptionsDialog
***************
*** 48,60 ****
 from PythonCard.components import button, checkbox, choice, image, imagebutton, list, notebook, spinner, staticbox, statictext, textarea, textfield
 
 # temporary hack until we get it working properly under MacOS
 if wx.Platform == '__WXMAC__':
! from wxPython.wx import wxPySimpleApp, wxFrame, wxMessageDialog, wxICON_EXCLAMATION, wxOK, wxVERSION_STRING
! app = wxPySimpleApp()
 title = 'Sorry!'
! frame = wxFrame(None, -1, title)
 message = 'standaloneBuilder currently does not work properly under MacOS. This shortcoming will '
 message += 'be fixed in a future release.\n\nClick OK to exit.'
! dialog = wxMessageDialog(frame, wrap_string(message, 52), title, wxICON_EXCLAMATION | wxOK)
 dialog.ShowModal()
 dialog.Destroy()
--- 50,64 ----
 from PythonCard.components import button, checkbox, choice, image, imagebutton, list, notebook, spinner, staticbox, statictext, textarea, textfield
 
+ # KEA 2007年07月28日
+ # updated for wx package organization
 # temporary hack until we get it working properly under MacOS
 if wx.Platform == '__WXMAC__':
! from wx import PySimpleApp, Frame, MessageDialog, ICON_EXCLAMATION, OK, VERSION_STRING
! app = PySimpleApp()
 title = 'Sorry!'
! frame = Frame(None, -1, title)
 message = 'standaloneBuilder currently does not work properly under MacOS. This shortcoming will '
 message += 'be fixed in a future release.\n\nClick OK to exit.'
! dialog = MessageDialog(frame, wrap_string(message, 52), title, ICON_EXCLAMATION | OK)
 dialog.ShowModal()
 dialog.Destroy()
From: Kevin A. <ka...@us...> - 2007年06月27日 01:35:02
Update of /cvsroot/pythoncard/PythonCard/samples/noresource
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13296
Added Files:
	autobutton.py 
Log Message:
simple usage example of addmethod
--- NEW FILE: autobutton.py ---
#!/usr/bin/python
"""
__version__ = "$Revision: 1.1 $"
__date__ = "$Date: 2007年06月27日 01:35:02 $"
"""
from PythonCard import model
rsrc = {'application':{'type':'Application',
 'name':'Minimal',
 'backgrounds': [
 {'type':'Background',
 'name':'bgMin',
 'title':'Minimal PythonCard Application',
 'size':(200, 100),
 'components': [
] # end components
} # end background
] # end backgrounds
} }
class Minimal(model.Background):
 def on_initialize(self, event):
 self.components['field1'] = {'type':'TextField',
 'name':'field1',
 'position':(5,5),
 'size':(150, -1),
 'text':'Hello PythonCard'}
 self.mouseclick_factory("Button1")
 self.mouseclick_factory("Button2")
 def mouseclick_factory(self, name):
 def function(self, event):
 # changed to event.target.name to verify we're getting
 # the correct target when button is clicked
 print "You clicked '%s'." % event.target.name
 # func_name seems to be the magic attribute rather than
 # just setting func.name
 function.func_name = "on_%s_mouseClick" % name
 self.addMethod(function)
 self.components[name] = {'type':'Button',
 'name':name,
 'label':name,
 'position':(5,5+int(name[-1:])*30),
 'text':name}
 return function
if __name__ == '__main__':
 app = model.Application(Minimal, None, rsrc)
 app.MainLoop()
From: Kevin A. <ka...@us...> - 2007年06月27日 01:33:05
Update of /cvsroot/pythoncard/PythonCard/docs/text
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12511
Added Files:
	addmethod.txt 
Log Message:
added text directory and addmethod doc
--- NEW FILE: addmethod.txt ---
Updated for PythonCard 0.8.2 and later on 2007年06月26日
Subject: [Pythoncard-users] addMethod, dynamic method binding
I made an addition to the Scriptable class in model.py so that we can add
methods during runtime. It uses 'instanceMethod' from the 'new' module. The
following interaction in the shell shows how this can be used. Startup
minimal.py with the shell and type the following lines to add a button with
a mouseClick handler.
>>> def on_btn1_mouseClick(self, event):
... 	self.components.field1.text = event.target.name
...
>>> self.addMethod(on_btn1_mouseClick)
>>> comp['btn1'] = {'type':'Button', 'name':'btn1', 'position':(0, 30), 'label':'btn1 hello'}
This simplifies creating PythonCard UIs on the fly. The more important
reason for making this addition is to bring us closer to runtime editing of
scripts.
It is critical that you call addMethod prior to creating your component so
that the automatic event binding works correctly.
From: Kevin A. <ka...@us...> - 2007年06月27日 01:32:13
Update of /cvsroot/pythoncard/PythonCard/docs/text
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12495/text
Log Message:
Directory /cvsroot/pythoncard/PythonCard/docs/text added to the repository
From: Kevin A. <ka...@us...> - 2006年12月17日 17:19:26
Update of /cvsroot/pythoncard/PythonCard/samples/financial
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17768/samples/financial
Modified Files:
	mortgage.py 
Log Message:
fixed missing colon
Index: mortgage.py
===================================================================
RCS file: /cvsroot/pythoncard/PythonCard/samples/financial/mortgage.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** mortgage.py	13 Dec 2005 11:13:22 -0000	1.2
--- mortgage.py	17 Dec 2006 17:19:24 -0000	1.3
***************
*** 12,16 ****
 import pyfi
 
! class MyBackground(model.Background)
 
 def on_initialize(self, event):
--- 12,16 ----
 import pyfi
 
! class MyBackground(model.Background):
 
 def on_initialize(self, event):

Showing results of 993

1 2 3 .. 40 > >> (Page 1 of 40)
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.
Thanks for helping keep SourceForge clean.
X





Briefly describe the problem (required):
Upload screenshot of ad (required):
Select a file, or drag & drop file here.
Screenshot instructions:

Click URL instructions:
Right-click on the ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)

More information about our ad policies

Ad destination/click URL:

AltStyle によって変換されたページ (->オリジナル) /