On Dec 4, 2007 1:33 AM, johnf <[EMAIL PROTECTED]> wrote:
> Well, two things have pop'd up that are really important.  The first is very
> important – the definition of "RegID".  I said that Dabo will assign a unique
> RegID if one is not assigned by the programmer.  This is WRONG!  "RegID" must
> be assigned by the programmer.  It was my misunderstanding.  However, it is
> still a very cool and simple way to reference an object on a form as long as
> the RegID is unique.   The fact that the RegID has to be unique presents
> problems when you folks start creating re-useable classes.  But for now
> creating re-usable classes are beyond this tutorial.
>
> The second is I used the word 'variable' while describing my code segments. In
> python everything is an object or a reference to an object.   Ed has provided
> several code examples that explain what and why it's important to make sure
> everyone understands.  But I like the way Paul explained it in words.  So I'm
> going to quote him:
>
> "I don't think it is frowned upon to call them 'variables', however when
> people start asking whether arguments are passed by reference or passed
> by value, and whether variables are pointers etc. then it starts
> becoming apparent that they are in the c mindset and need a tutorial on
> names and namespaces in Python.
>
> Calling them 'variables' in the tutorial is fine IMO, since everyone
> from other languages understands what a variable is, but give a sidebar
> explaining that Python really doesn't have variables how they probably
> understand them, but merely names in local namespaces bound to objects."
>
> So let's continue with tutorial.  Just please don't dismiss the comments made
> by others on the mistakes I have made in this tutorial.  They are important
> and will make you better Dabo programmers if you follow the advise.  I asked
> two questions in the last installment.  First what was a the short cut way of
> binding an event to an object and the other was how to get the selected file
> name into the textbox.
>
> Ed and Paul are programmers and by definition are lazy (we all are).  So they
> have created short cuts for many of the things that you'll do daily while
> programming with Dabo.  There are many so I'll only show two and let you
> explore/find the others for yourself.  The first deals with sizers.  Recall
> that when I'm appending to a sizer I have pass two parameters as in:

It's not being lazy by any means.  It is just being more productive. 8)

>
> Vsizer.append(dabo.ui.dButton(self, Caption='Button'),1,'x')
> also written as
> Vsizer.append(dabo.ui.dButton(self, Caption='Button'), proportion=1, "expand")
>
> You will type the last two parameters (proportion=1 , "expand") often.  Ed got
> tried of doing that and created a short cut:
>
> Vsizer.append1x(dabo.ui.dButton(self, Caption='Button'))  simple right - note
> the "append1x".

Note here that you can write this as:

Vsizer.append(dabo.ui.dButton(self, Caption='Button'),1,'x')

or

Vsizer.append(dabo.ui.dButton(self, Caption='Button'),'x',1)

Dabo will automatically switch the arguments if you have them in the
wrong order.

>
> The second has to do with binding an event.  In my code I did the following:
>
> ourButton=dabo.ui.dButton(self,RegID="selectButton",Caption= "...")
> ourButton.bindEvent(dEvents.Hit, self._openDialog)
> hs.append(ourButton,0)
>
> The easy way and all on one line is as follows:
> hs.append(dabo.ui.dButton(self,RegID="selectButton",Caption= 
> "...",OnHit=self._openDialog),0)
>
> Notice I added " OnHit=self._openDialog".  This does exactly what the other
> three lines do.  When we get into using bizobjects we will use more short
> cuts.  Just remember that short cuts are just that – short cuts for typing.
> They do not change the way the code works.

Note that OnHit is generally the controls main event.  On a button
that means when it is pressed.  On a list control it is when a list
item is selected.  On a dTextBox it is when you enter text and hit the
enter key.  It is a convenient thing to know.  If you need specific
events, for instance on mouse over, then you can bind them with
bindEvent.  However, only the Hit event may be bound from the control
instantiation.

I also want to let you in on another trick if you use RegIDs...

Let's take the line
"hs.append(dabo.ui.dButton(self,RegID="selectButton",Caption=
"...",0)"

Since you declared a RegID, the Hit event is automatically bound to a
method on the form called onHit_selectButton.  You can do this with
other events too I do believe.  If the methods aren't present, no big
deal, but if they are they will be called.  Note they have to reside
in the form class.  Saves some code but can be very confusing if you
don't know what is going on.

>
>
> The last question was how to fill the textbox with the filename selected in
> the file dialog.  Here is the code:
> def _openDialog(self,evt):
>                 # need to receive the evt (in this case a click or Hit)
>                 evt.stop()
>                 theDialog=dabo.ui.dFileDialog(self)
>                 theDialog.show()
>                 if sys.platform == 'win32':
>                         myseperator = "\\"  # someone should post why I 
> needed two slashes
>                 else:
>                         myseperator = "/"
>
>                 myReturnFileValue= theDialog.FileName
>                 myReturnDirectory = theDialog.Directory
>
>                 # recall "filename" is the RegID of the textbox
>                 self.filename.Value= myReturnDirectory + myseperator + 
> myReturnFileValue

Why the evt.stop()?

>
> It's easy to read but you must be asking yourself how did he know
> about "theDialog.FileName" and "theDialog.Directory".  Fact is I've used
> dFileDialog in the past.  But there was the first time I had to use it and I
> haven't forgotten how I found the return values.
>
> The first thing I did was check the DaboDoc's for a description of
> dFileDialog.  I didn't find it - but there are lots of things covered in
> those html documents.  So that's always the first place I check.  Then I
> checked the source code for dFileDialog.  Dabo source code has all the
> properties of the object gathered together (all in one spot within the
> source).   What do I see but two properties - "FileName" and "Directory".
> Pretty descriptive – but still I don't know what's in them.
>
> At this point I could just place a few print statements around and that would
> tell me.  And sometimes I do just that.  But Dabo has a very neat feature to
> help us discover values of the attributes and properties of objects.
>
> Run our form or any Dabo form and type a "control-d" (might be something
> different for the Mac).  Wow! A "dShell" opens up.  A python shell that knows
> about all your current objects (that are in scope) and that includes the Dabo
> objects.  Try typing in "app." and wait a faction of second.  See the
> properties and attributes appear?  Finish with "app.BasePrefKey"  you should
> get 'fileTutor' for a response.  You can thank Ed and Paul for that little
> goodie.
>
> Our instance of "dabo.ui.dFileDialog()" will not be in scope if you try it in
> dShell.  Can someone figure a way to get it in scope (hint change the source
> code).  And did anyone notice how I assigned the property values of
> dFileDialog to the textbox using the RegID?
>
>
> #!/usr/bin/env python
> # -*- coding: utf-8 -*-
> import os
> import sys
> import dabo
> import dabo.dEvents as dEvents
> import dabo.dException as dException
> dabo.ui.loadUI('wx')
>
> class MainForm(dabo.ui.dForm):
>
>         def afterInit(self):
>                 self.Caption = "File Tutorial"
>                 self.Sizer =hs= dabo.ui.dSizer("h")
>
>                 hs.append(dabo.ui.dLabel(self, Caption= "Select a file"),0)
>                 hs.append(dabo.ui.dTextBox(self,RegID = "filename"),1)
>                 #didn't use the short way - you might want to try it!
>                 ourButton=dabo.ui.dButton(self,RegID="selectButton",Caption= 
> "...")
>                 ourButton.bindEvent(dEvents.Hit, self._openDialog)
>                 hs.append(ourButton,0)
>
>                 self.layout()
>
>         def _openDialog(self,evt):
>                 # need to receive the evt (in this case a click or Hit)
>                 evt.stop()
>                 theDialog=dabo.ui.dFileDialog(self)
>                 theDialog.show()
>                 if sys.platform == 'win32':
>                         myseparator  = "\\"  # some should post why I needed 
> two slashes
>                 else:
>                         myseparator  = "/"
>
>                 myReturnFileValue= theDialog.FileName
>                 myReturnDirectory = theDialog.Directory
>
>                 self.filename.Value= myReturnDirectory + myseparator  + 
> myReturnFileValue
>
> if __name__ == "__main__":
>         app = dabo.dApp()
>
>         app.BasePrefKey = "fileTutor"
>         app.setAppInfo("appName", "File Tutorial ")
>
>         app.MainFormClass = MainForm
>
>         app.start()
>

On one last note, I think that you should make the dTextBox read only.
 Coming from a correct code standpoint, if the users are entering the
dTextBox value through the dFileDialog, you should never want them to
type in the dTextBox directly.  Makes error checking easier because
you only have to check for NULL and if the file is still there.  I am
nit-picking, but it makes for good code.

Cheers,

Nate L.


_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://leafe.com/mailman/listinfo/dabo-users
Searchable Archives: http://leafe.com/archives/search/dabo-users
This message: http://leafe.com/archives/byMID/dabo-users/[EMAIL PROTECTED]

Reply via email to