Thread: [Boa Constr] Progress Check
Status: Beta
Brought to you by:
riaan
From: Rich S. <rsh...@ap...> - 2005-11-14 22:10:38
Attachments:
modModule.py
boa-log.txt
|
Attached is a module that I'd like on the first page of a multi-page notebook. Is it done correctly? I've no idea where the sizer fits into the equation as I cannot see it to place the other widgets within its slots. After defining a new module, I added a wx.Panel, then a wx.FlexGridSizer. I added the other widgets on the wx.Panel surface because that was all I saw when I opened the Designer. If this is not how it's done using Boa, please point me in the right direction. Also, after changing the widget names to be descriptive (rather than Button1, Button2, etc.), I keep getting errors when I try to save the design. The error log is attached. While I understand the words, I don't understand what it is telling me or why it was generated. TIA, Rich -- Richard B. Shepard, Ph.D. | Author of "Quantifying Environmental Applied Ecosystem Services, Inc. (TM) | Impact Assessments Using Fuzzy Logic" <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Werner F. B. <wer...@fr...> - 2005-11-15 19:08:52
Attachments:
modModule.py
|
Hi Rich, Rich Shepard wrote: > Attached is a module that I'd like on the first page of a multi-page > notebook. Is it done correctly? I've no idea where the sizer fits into the > equation as I cannot see it to place the other widgets within its slots. > > After defining a new module, I added a wx.Panel, then a > wx.FlexGridSizer. I > added the other widgets on the wx.Panel surface because that was all I saw > when I opened the Designer. > > If this is not how it's done using Boa, please point me in the right > direction. > > Also, after changing the widget names to be descriptive (rather than > Button1, Button2, etc.), I keep getting errors when I try to save the > design. > The error log is attached. While I understand the words, I don't understand > what it is telling me or why it was generated. > > TIA, > > Rich > I attached a changed modul. What I did: - removed the flexgirdsizer - added a box sizer - set the sizer property for the wx.Panel to the box sizer - added a gridbag sizer which holds all controls - added the gridbag sizer to the box sizer (using the "more new" button on its collection editor - added a staticbox sizer - added a flexgridsizer for the buttons - added all sizers and controls to the gridbag sizer To do: - add borders to space things nicely - add flags for borders and expand or similar Sorry I don't get the error you got, however I got an error that indentation was not correct, so I used File/Reindent whole file and then made manual corrections. Hope this helps Werner |
From: Rich S. <rsh...@ap...> - 2005-11-15 19:21:15
|
On Tue, 15 Nov 2005, Werner F. Bruhin wrote: Hello, Werner: > I attached a changed module. Thank you very much. This is invaluable. > What I did: > - removed the flexgirdsizer > - added a box sizer > - set the sizer property for the wx.Panel to the box sizer > - added a gridbag sizer which holds all controls > - added the gridbag sizer to the box sizer (using the "more new" button on > its collection editor > - added a staticbox sizer > - added a flexgridsizer for the buttons > - added all sizers and controls to the gridbag sizer I'll need to study the code closely to really understand it. I assume that this was all done within Boa and in the order defined above. It's what I did not pick up from the tutorial or my reading of the wxPython docs. > To do: > - add borders to space things nicely > - add flags for borders and expand or similar I'll do this. > Sorry I don't get the error you got, however I got an error that > indentation was not correct, so I used File/Reindent whole file and then > made manual corrections. I'm getting strange errors. The application will hang after complaining of an error, but I cannot find the text in the code about which it complains. Very strange ... and frustrating because I have to kill the process and reload boa. I don't know why it's being so difficult here. Many thanks, Rich -- Richard B. Shepard, Ph.D. | Author of "Quantifying Environmental Applied Ecosystem Services, Inc. (TM) | Impact Assessments Using Fuzzy Logic" <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Werner F. B. <wer...@fr...> - 2005-11-15 20:37:48
|
Hi Rich, Rich Shepard wrote: > On Tue, 15 Nov 2005, Werner F. Bruhin wrote: > > Hello, Werner: > >> I attached a changed module. > > > Thank you very much. This is invaluable. Your welcome. > >> What I did: >> - removed the flexgirdsizer >> - added a box sizer >> - set the sizer property for the wx.Panel to the box sizer >> - added a gridbag sizer which holds all controls >> - added the gridbag sizer to the box sizer (using the "more new" >> button on its collection editor >> - added a staticbox sizer >> - added a flexgridsizer for the buttons >> - added all sizers and controls to the gridbag sizer > > > I'll need to study the code closely to really understand it. I assume > that > this was all done within Boa and in the order defined above. Yeap, all done in Boa using the GUI frame designer (mainly the Sizer tab) and on the Property inspector to set the sizer to the wx.Panel. It's what I > did > not pick up from the tutorial or my reading of the wxPython docs. > >> To do: >> - add borders to space things nicely >> - add flags for borders and expand or similar > > > I'll do this. > >> Sorry I don't get the error you got, however I got an error that >> indentation was not correct, so I used File/Reindent whole file and then >> made manual corrections. > > > I'm getting strange errors. The application will hang after > complaining of > an error, but I cannot find the text in the code about which it complains. > Very strange ... and frustrating because I have to kill the process and > reload boa. I don't know why it's being so difficult here. If you can't get it fixed, post all the files you did belonging to the app here and I will try to have a look at it tomorrow (it is getting late down here in the South of France) See you Werner > > Many thanks, > > Rich > |
From: Rich S. <rsh...@ap...> - 2005-11-15 23:12:07
|
On Tue, 15 Nov 2005, Werner F. Bruhin wrote: > Yeap, all done in Boa using the GUI frame designer (mainly the Sizer tab) > and on the Property inspector to set the sizer to the wx.Panel. Werner, I need to add another widget -- not a standard wxWidget widget, but one for matplotlib -- on the modModel.py module. I need to expand that frame, move the modDescStr and modDescTxt under the two widgets on the left, and leave room for the plotting widget on the right. modDescStr's properties show it associated with no sizer. How do I determine in which sizer they have been placed so I can both expand that sizer and move the two widgets? I'm learning more with your help, but it's a slow climb up the learning curve. Rich -- Richard B. Shepard, Ph.D. | Author of "Quantifying Environmental Applied Ecosystem Services, Inc. (TM) | Impact Assessments Using Fuzzy Logic" <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Rich S. <rsh...@ap...> - 2005-11-15 23:25:37
Attachments:
eikos.tgz
|
On Tue, 15 Nov 2005, Rich Shepard wrote: > I need to add another widget -- not a standard wxWidgets widget, but one for > matplotlib -- on the modModel.py module. I need to expand that frame, move > the modDescStr and modDescTxt under the two widgets on the left, and leave > room for the plotting widget on the right. And, in response to your bedtime comment, the current state of the code is attached as a tarball. Rich -- Richard B. Shepard, Ph.D. | Author of "Quantifying Environmental Applied Ecosystem Services, Inc. (TM) | Impact Assessments Using Fuzzy Logic" <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Werner F. B. <wer...@fr...> - 2005-11-16 12:04:15
|
Hi Rich, Rich Shepard wrote: > On Tue, 15 Nov 2005, Rich Shepard wrote: > >> I need to add another widget -- not a standard wxWidgets widget, but >> one for >> matplotlib -- on the modModel.py module. I need to expand that frame, >> move >> the modDescStr and modDescTxt under the two widgets on the left, and >> leave >> room for the plotting widget on the right. > > > And, in response to your bedtime comment, the current state of the > code is > attached as a tarball. I started to look at this. - there are some indentation problems - had to fix them with File/Indent whole file and then manually correct some of it (from def __init__ all had to be indented). Strange, would be interesting to figure out why this happened in the first place, maybe because you are on Linux and I am on WinXP?). - I also have problems with some of the imports of your modules, they are not found (also they are there). In eikosFrame1 they don't work when they are at the top of the file. I moved the DlgHelp one down into the menu event and it works there - this is some Python thing which I don't understand. See you Werner > > Rich > |
From: Werner F. B. <wer...@fr...> - 2005-11-16 12:11:43
|
Hi Rich, Rich Shepard wrote: > On Tue, 15 Nov 2005, Werner F. Bruhin wrote: > >> Yeap, all done in Boa using the GUI frame designer (mainly the Sizer tab) >> and on the Property inspector to set the sizer to the wx.Panel. > > > Werner, > > I need to add another widget -- not a standard wxWidget widget, but > one for > matplotlib -- on the modModel.py module. I need to expand that frame, move > the modDescStr and modDescTxt under the two widgets on the left, and leave > room for the plotting widget on the right. This would be easy in a FlexGridSizer, however as a GridBagSizer is used one has to create space first, i.e. move everying thing which is on line 1 (zero based) and lower down by one and then move the two controls to line 1. However it is even a bit worse then that as you want to put a matplotlib control on. There are probably other ways but how I did it in my application (www.thewinecellarbook.com) is to have a splitterwindow, in which I add a left panel with my selection stuff (your controls you currently have and then add the matplotlib frame to the right side (this is NOT done in Boa). - I couldn't get it to work with gridbagsizer, but I think that was just because I overlooked adding one of the controls. Anyhow I have done it using flexgridsizer for the page (fgsPage), note that the splitter can't be seen in there - I think this might be a bug with Boa or it could also be as it is empty and will only be filled with self.panel1 and the matplotlib canvas during __init__. Due to the matplotlib stuff I don't think it can be done differently - but I am not sure. > > modDescStr's properties show it associated with no sizer. How do I > determine in which sizer they have been placed so I can both expand that > sizer and move the two widgets? It is contained in a sizer, i.e. sizer.AddWindow(control) and not control.SetSizer - which is what shows in the Inspector property. > > I'm learning more with your help, but it's a slow climb up the learning > curve. > > Rich > The sizer stuff for me is very often still a lot of trial an error instead of just doing the right thing - can be quit frustrating! I think especially the splitter window does not play nicely, even in my app I try not to touch this too often as I get each time a few more grey hair! The widget sizes still need to be worked on. Oh, the import problem is also gone, the modModel was mispelled. I just didn't see that, only when I moved the about stuff away and put things onto individual lines did I catch on. The modModel panel needs to be defined as a custom_class it has to be imported this way "from modModel import modModel" as in custom_class you can't have "modModel.modModel". On the matplot stuff, I added what I use you obviously need to adjust this and add the actual plotting commands etc. See you Werner |
From: Werner F. B. <wer...@fr...> - 2005-11-16 15:32:54
|
Sorry for the double post, got a message that posting was too big, so posted again in a zip. See you Werner |
From: Rich S. <rsh...@ap...> - 2005-11-16 17:29:45
Attachments:
screenshot.png
|
On Wed, 16 Nov 2005, Werner F. Bruhin wrote: > This would be easy in a FlexGridSizer, however as a GridBagSizer is used > one has to create space first, i.e. move everying thing which is on line 1 > (zero based) and lower down by one and then move the two controls to line > 1. Hello, Werner: I'll have to figure out how to do this. I cannot tell where anything in with regard to sizers because there are no colored lines when I look at the Designer (see attached screenshot). > However it is even a bit worse then that as you want to put a matplotlib > control on. There are probably other ways but how I did it in my > application (www.thewinecellarbook.com) is to have a splitterwindow, in > which I add a left panel with my selection stuff (your controls you > currently have and then add the matplotlib frame to the right side (this is > NOT done in Boa). That is a very impressive application you've developed. With my non-allergic rhinitis (that is, chronic stuffed nose) I cannot even pretend to be a gourmet or enophile. I either like a wine or I don't. :-) > - I couldn't get it to work with gridbagsizer, but I think that was just > because I overlooked adding one of the controls. Anyhow I have done it using > flexgridsizer for the page (fgsPage), note that the splitter can't be seen in > there - I think this might be a bug with Boa or it could also be as it is > empty and will only be filled with self.panel1 and the matplotlib canvas > during __init__. Due to the matplotlib stuff I don't think it can be done > differently - but I am not sure. I need to rummage around in Boa more to try to understand how you've done what you did. In the main file you've imported modModel and modPolicy (yes, I did have it mis-spelled there), but I also see that you've prefixed them with a 'u': u'modPolicy': [0, '', u'modPolicy.py']} ^ ^ Why? >> modDescStr's properties show it associated with no sizer. How do I >> determine in which sizer they have been placed so I can both expand that >> sizer and move the two widgets? > It is contained in a sizer, i.e. sizer.AddWindow(control) and not > control.SetSizer - which is what shows in the Inspector property. Well, none of those widgets are displayed in modModel.py. They're in the source code but not visible in the Designer. I need to look at the Inspector and see if I can figure out where they went. > The sizer stuff for me is very often still a lot of trial an error instead > of just doing the right thing - can be quit frustrating! I think especially > the splitter window does not play nicely, even in my app I try not to touch > this too often as I get each time a few more grey hair! What can I read to learn when to use a splitter window, a sash window, or no window at all? I know about sizers from my C work with GTK+, but there are more of them in wxPython and a slew of windows, too. The wxWidgets web site's class list has brief descriptions that are like man pages: nice reminders of syntax and use when you already know what to do but need a reminder. I'd like to better understand how to select the appropriate widget when I need it. > The modModel panel needs to be defined as a custom_class it has to be > imported this way "from modModel import modModel" as in custom_class you > can't have "modModel.modModel". Why does modModule's panel need to be a custom_class? Do all five modules that will eventually become pages on the tabbed noteboob in eikosFrame1 also need to be custom_classes? So much to learn ... Thanks, Rich -- Richard B. Shepard, Ph.D. | Author of "Quantifying Environmental Applied Ecosystem Services, Inc. (TM) | Impact Assessments Using Fuzzy Logic" <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Rich S. <rsh...@ap...> - 2005-11-15 20:26:04
|
On Tue, 15 Nov 2005, Werner F. Bruhin wrote: > What I did: > - added a box sizer > - set the sizer property for the wx.Panel to the box sizer > - added a gridbag sizer which holds all controls > - added the gridbag sizer to the box sizer (using the "more new" button on > its collection editor > - added a staticbox sizer > - added a flexgridsizer for the buttons > - added all sizers and controls to the gridbag sizer Werner, What determines this set of sizers, and in this sequence? In my inexperience, I thought that the flexgridsizer was all that was needed. If you added these sizers using the GUI, how did you know what was going where? > Hope this helps This is very helpful. None of this I would have figured out on my own. Rich -- Richard B. Shepard, Ph.D. | Author of "Quantifying Environmental Applied Ecosystem Services, Inc. (TM) | Impact Assessments Using Fuzzy Logic" <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |
From: Werner F. B. <wer...@fr...> - 2005-11-16 11:51:50
|
Hi Rich, Rich Shepard wrote: > On Tue, 15 Nov 2005, Werner F. Bruhin wrote: > >> What I did: > > >> - added a box sizer >> - set the sizer property for the wx.Panel to the box sizer >> - added a gridbag sizer which holds all controls >> - added the gridbag sizer to the box sizer (using the "more new" >> button on its collection editor >> - added a staticbox sizer >> - added a flexgridsizer for the buttons >> - added all sizers and controls to the gridbag sizer > > > Werner, > > What determines this set of sizers, and in this sequence? Why do I do this - good question:) - flexgridsizer, it might be possible to just add the buttons to the gbs (gridbagsizer), but when I did this I seem to get to much space for them, so I added them to a fgs and added it to the gbs. - staticbox sizer, is a special one to handle static boxes, if you had more then one widget within the static box you would need to add them to another sizer which you add into the static box sizer (e.g. a fgs. - gridbagsizer, as Tacao pointed out it is the only one which allows you to have grid cells of different sizes (check the wxPython demo) and it allows positional insertion. But that also makes it a bit a pain moving things around - you have to open its Collection Editor, click on each item and change the position property. - boxsizer, I guess this is a bad habit of mine as most of my stuff has a listctrl and e.g. a notebook or some other controls I add these two blocks to a boxsizer. I just removed it and moved the gbs to be the primary sizer. In my > inexperience, I thought that the flexgridsizer was all that was needed. > > If you added these sizers using the GUI, how did you know what was going > where? This is not that easy and is one thing as there is no nice and easy graphical way of doing the sizer stuff. If you have some ideas on how this could be done I am sure Riaan would be interested - but I think it should be in another thread. The indications you get are the yellow and green lines around the widgets, they indicate that the widget is sizer controlled. To add widgets you have to use the collection editor of the individual sizer. Actually you have to add the widget first to the panel and then assign it to the sizer - obviously it would be nicer if one could just DnD it onto the sizer slot. See you Werner > >> Hope this helps > > > This is very helpful. None of this I would have figured out on my own. > > Rich > |
From: Werner F. B. <wer...@fr...> - 2005-11-16 18:44:36
|
Hi Rich, Rich Shepard wrote: > On Wed, 16 Nov 2005, Werner F. Bruhin wrote: > >> This would be easy in a FlexGridSizer, however as a GridBagSizer is used >> one has to create space first, i.e. move everying thing which is on >> line 1 >> (zero based) and lower down by one and then move the two controls to line >> 1. > > > Hello, Werner: > > I'll have to figure out how to do this. I cannot tell where anything in > with regard to sizers because there are no colored lines when I look at the > Designer (see attached screenshot). Yes, that would make it a bit more difficult. I have no idea what is going on here, hopefully others on Linux or NON Windows platforms could confirm what is going on. Some setting, a Boa bug, an install issue? > >> However it is even a bit worse then that as you want to put a matplotlib >> control on. There are probably other ways but how I did it in my >> application (www.thewinecellarbook.com) is to have a splitterwindow, in >> which I add a left panel with my selection stuff (your controls you >> currently have and then add the matplotlib frame to the right side >> (this is >> NOT done in Boa). > > > That is a very impressive application you've developed. Thanks! With my > non-allergic rhinitis (that is, chronic stuffed nose) I cannot even pretend > to be a gourmet or enophile. I either like a wine or I don't. :-) Maybe a regular glass of wine would cure that? :) > >> - I couldn't get it to work with gridbagsizer, but I think that was >> just because I overlooked adding one of the controls. Anyhow I have >> done it using flexgridsizer for the page (fgsPage), note that the >> splitter can't be seen in there - I think this might be a bug with Boa >> or it could also be as it is empty and will only be filled with >> self.panel1 and the matplotlib canvas during __init__. Due to the >> matplotlib stuff I don't think it can be done differently - but I am >> not sure. > > > I need to rummage around in Boa more to try to understand how you've done > what you did. > > In the main file you've imported modModel and modPolicy (yes, I did > have it > mis-spelled there), but I also see that you've prefixed them with a 'u': > > u'modPolicy': [0, '', u'modPolicy.py']} > ^ ^ > Why? The "u" is added by Boa, it seems to do this if you have mixed case and/or numbers in the name. BTW, I first added them because I thought it had something to do with the import problem. But I think it is a good thing to add whatever code you have for the project to the main file, it gives you an project wide todo list, when clicking the yellow button on any of these files will run the application instead of just running the module. > >>> modDescStr's properties show it associated with no sizer. How do I >>> determine in which sizer they have been placed so I can both expand that >>> sizer and move the two widgets? >> >> It is contained in a sizer, i.e. sizer.AddWindow(control) and not >> control.SetSizer - which is what shows in the Inspector property. > > > Well, none of those widgets are displayed in modModel.py. They're in the > source code but not visible in the Designer. I need to look at the > Inspector > and see if I can figure out where they went. A good way to do this is open the Frame designer and click on the Inspector and select the Objs tab it shows you all the controls. You can see there that they are on the self.panel1 and they don't show on the designer as the self.panel1 is only set as Window1 of the splitter window during __init__. To make them visable in the designer you have to find a way of defining the matplotlib (in the sample self.canvas) stuff in a way that the designer knows about it - I don't know if that is possible. > >> The sizer stuff for me is very often still a lot of trial an error >> instead >> of just doing the right thing - can be quit frustrating! I think >> especially >> the splitter window does not play nicely, even in my app I try not to >> touch >> this too often as I get each time a few more grey hair! > > > What can I read to learn when to use a splitter window, a sash window, or > no window at all? I know about sizers from my C work with GTK+, but > there are > more of them in wxPython and a slew of windows, too. The wxWidgets web > site's > class list has brief descriptions that are like man pages: nice > reminders of > syntax and use when you already know what to do but need a reminder. I'd > like > to better understand how to select the appropriate widget when I need it. I use the wxPython demo for this. It shows for most if not all widgets an example. > >> The modModel panel needs to be defined as a custom_class it has to be >> imported this way "from modModel import modModel" as in custom_class >> you can't have "modModel.modModel". > > > Why does modModule's panel need to be a custom_class? modModule is based on panel, to get it into the frame designer it has be something Boa knows (i.e. a widget on one of Boa's tabs), with the custom_class you can very easily tell Boa that you want to use a wx.Panel but NOT the standard one but one you sub-classed. Do all five modules > that will eventually become pages on the tabbed noteboob in eikosFrame1 > also > need to be custom_classes? If you use a notebook then I wouldn't do this, in eikosFrame1 I would just put the notebook with the frame designer and then add the pages in your code by hand, at least that what I did. On the other hand you might be able to define them as custom_classes and then use Boa to add pages to the notebook. BTW, you might want to check out the new notebookctrl Andrea posted on the wxPython list, it sounds very nice. > > So much to learn ... Yeap, it took me probably about 6 month (part time) - BUT keep in mind that I don't have a programmers background, i.e. the only other programming I did was some ..... time back on IBM minis (S/34 and S/36 using a language called RPGII). > > Thanks, > > Rich > See you Werner |
From: Rich S. <rsh...@ap...> - 2005-11-16 19:18:07
|
On Wed, 16 Nov 2005, Werner F. Bruhin wrote: > Yes, that would make it a bit more difficult. I have no idea what is going > on here, hopefully others on Linux or NON Windows platforms could confirm > what is going on. Some setting, a Boa bug, an install issue? Werner, I found it by clicking on the object tree. It was shrunk down and crammed against the top of the frame. I've expanded it and that seems to have solved this problem. > Maybe a regular glass of wine would cure that? :) Except for the calories, I agree completely. Of course, I'm living in the craft ale brewing capital of the country as well as great wine country, so I have a lot of choices. > The "u" is added by Boa, it seems to do this if you have mixed case and/or > numbers in the name. OK. > BTW, I first added them because I thought it had something to do with the > import problem. But I think it is a good thing to add whatever code you > have for the project to the main file, it gives you an project wide todo > list, when clicking the yellow button on any of these files will run the > application instead of just running the module. OK. > A good way to do this is open the Frame designer and click on the Inspector > and select the Objs tab it shows you all the controls. You can see there > that they are on the self.panel1 and they don't show on the designer as the > self.panel1 is only set as Window1 of the splitter window during __init__. That's what I figured out to do. I think that most of my problems are due to a lack of documentation for me to read. I think that I'll go look at the wxWidgets book and see if that gives me a better understanding while I'm waiting for the wxPython book to come out. The Boa docs are rather sparse, too, so when I get errors saving a Designer session I've no idea why. > I use the wxPython demo for this. It shows for most if not all widgets an > example. I'll do this, too. I added a flexgridsizer, put a button in it, then it's no longer available so I can add other widgets to it. This must be due to my not understanding how to set up the FGS or how to place widgets in it at defined positions. > modModule is based on panel, to get it into the frame designer it has be > something Boa knows (i.e. a widget on one of Boa's tabs), with the > custom_class you can very easily tell Boa that you want to use a wx.Panel > but NOT the standard one but one you sub-classed. Do all five modules Ah, now I see. > If you use a notebook then I wouldn't do this, in eikosFrame1 I would just > put the notebook with the frame designer and then add the pages in your > code by hand, at least that what I did. On the other hand you might be able > to define them as custom_classes and then use Boa to add pages to the > notebook. I think I'll add the notebook in eikosFrame1, add the two pages I have so far, and then work on the third. > BTW, you might want to check out the new notebookctrl Andrea posted on the > wxPython list, it sounds very nice. I saw the thread but have not looked at it yet. > Yeap, it took me probably about 6 month (part time) - BUT keep in mind that I > don't have a programmers background, i.e. the only other programming I did > was some ..... time back on IBM minis (S/34 and S/36 using a language called > RPGII). I'm also not a professional coder, but I learned with FORTRAN on the IBM S/360 and the HP-3000. Since 1987 I've written the stuff I've needed in C on microcomputers. I certainly know of RPG, Algol, PL/1 and the other languages. I think it's time to go through the wxPython demos again and pick up what I missed before. I'm sure I'll be back here with more questions sooner or later. :-) Thanks, Rich -- Richard B. Shepard, Ph.D. | Author of "Quantifying Environmental Applied Ecosystem Services, Inc. (TM) | Impact Assessments Using Fuzzy Logic" <http://www.appl-ecosys.com> Voice: 503-667-4517 Fax: 503-667-8863 |