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:
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".
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.
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
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()
--
John Fabiani
_______________________________________________
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]