I think it would be a good idea to add a feature to the Android App Inventor GUI blocks editor to render the visual code blocks as pseudo-Python code (in, say, a pop-up window).
Doing so improves readability, especially for complex blocks with lots of nested expressions. Also, it gives students practice reading code in textual form, which could help them transition to more advanced programming courses.
The rendered pseudo-Python code would be read-only; students would still edit code visually using the blocks editor. The purpose of the Python code is merely illustrative; it is obviously not meant to be executable.
Since I do not have access to the App Inventor source code, I wrote a prototype script (with an online demo) that converts the compiled .yail files into pseudo-Python code. (App Inventor compiles the visual code blocks into .yail files, a Scheme-based intermediate representation, so those files contain all the information present in the blocks.)
Below I show some code blocks from tutorials that my script rendered as pseudo-Python code. Please let me know if this seems like a useful feature to implement in App Inventor.
|
No Text While Driving
pseudo-Python:
response = 'text'
when Screen1.Initialize():
response = TinyDB1.GetValue('responseMessage')
if (len(response) > 0):
MessageTextbox.Text = response
when SubmitResponseButton.Click():
TinyDB1.StoreValue('responseMessage', MessageTextbox.Text)
when Texting1.MessageReceived(number, messageText):
Texting1.PhoneNumber = number
Texting1.Message = MessageTextbox.Text
Texting1.SendMessage()
|
|
No
Text While Driving, Part 2
pseudo-Python:
lastKnownLocation = 'unknown'
response = 'text'
when Screen1.Initialize():
response = TinyDB1.GetValue('responseMessage')
if (len(response) > 0):
MessageTextbox.Text = response
when SubmitResponseButton.Click():
TinyDB1.StoreValue('responseMessage', MessageTextbox.Text)
when Texting1.MessageReceived(number, messageText):
Texting1.PhoneNumber = number
Texting1.Message = MessageTextbox.Text + ' My location is ' + lastKnownLocation
Texting1.SendMessage()
TextToSpeech1.Speak('message from ' + number + ' ' + messageText)
when LocationSensor1.LocationChanged(latitude, longitude, altitude):
lastKnownLocation = LocationSensor1.CurrentAddress
|
|
Broadcaster
Hub
pseudo-Python:
BroadcastList = []
def displayBroadcastList():
BroadcastListLabel.Text = 'Phone Numbers...'
for pnumber in BroadcastList:
BroadcastListLabel.Text = BroadcastListLabel.Text + '\n' + pnumber
valueFromDB = 'text'
when Screen1.Initialize():
valueFromDB = TinyDB1.GetValue('broadcastList')
if (len(valueFromDB) > 0):
BroadcastList = valueFromDB
displayBroadcastList()
when Texting1.MessageReceived(number, messageText):
if (number in BroadcastList):
Texting1.Message = messageText
for var in BroadcastList:
Texting1.PhoneNumber = var
Texting1.SendMessage()
LogLabel.Text = 'message from:' + number + ' broadcast\n' + LogLabel.Text
else:
Texting1.PhoneNumber = number
if (messageText == 'joinabc'):
BroadcastList.append(number)
displayBroadcastList()
Texting1.Message = 'Congrats, you have joined the abc broadcast list'
TinyDB1.StoreValue('broadcastList', BroadcastList)
else:
Texting1.Message = " To join this broadcast list, text 'joinabc' to this number."
Texting1.SendMessage()
|
|
Android,
Where's My Car?
pseudo-Python:
tempAddress = 'text'
when Screen1.Initialize():
tempAddress = TinyDB1.GetValue('address')
if (len(tempAddress) > 0):
RememberedAddressDataLabel.Text = tempAddress
RememberedLatLabel.Text = TinyDB1.GetValue('lat')
RememberedLongLabel.Text = TinyDB1.GetValue('long')
DirectionsButton.Enabled = True
when RememberButton.Click():
RememberedAddressDataLabel.Text = LocationSensor1.CurrentAddress
RememberedLatLabel.Text = LocationSensor1.Latitude
RememberedLongLabel.Text = LocationSensor1.Longitude
TinyDB1.StoreValue('address', LocationSensor1.CurrentAddress)
TinyDB1.StoreValue('lat', LocationSensor1.Latitude)
TinyDB1.StoreValue('long', LocationSensor1.Longitude)
DirectionsButton.Enabled = True
when DirectionsButton.Click():
ActivityStarter1.DataUri = 'http://maps.google.com/maps?saddr=' \
+ CurrentLatLabel.Text + ',' \
+ CurrentLongLabel.Text + '&daddr=' \
+ RememberedLatLabel.Text + ',' \
+ RememberedLongLabel.Text
ActivityStarter1.StartActivity()
when LocationSensor1.LocationChanged(latitude, longitude, altitude):
CurrentAddressDataLabel.Text = LocationSensor1.CurrentAddress
CurrentLatLabel.Text = latitude
CurrentLongLabel.Text = longitude
RememberButton.Enabled = True
|
|
Text Group Part II: Adding and Removing Members
pseudo-Python:
def displayMembers():
MembersLabel.Text = ''
for number in PhoneNumbers:
MembersLabel.Text = MembersLabel.Text + '\n' + number
valueFromDB = ''
PhoneNumbers = []
when Screen1.Initialize():
valueFromDB = TinyDB1.GetValue('textGroup')
if (type(valueFromDB) is list):
PhoneNumbers = valueFromDB
displayMembers()
when TextGroupButton.Click():
Texting1.Message = MessageText.Text
for var in PhoneNumbers:
Texting1.PhoneNumber = var
Texting1.SendMessage()
StatusLabel.Text = 'last message sent:' + MessageText.Text
when PhoneNumberPicker1.AfterPicking():
PhoneNumbers.append(PhoneNumberPicker1.PhoneNumber)
TinyDB1.StoreValue('textGroup', PhoneNumbers)
displayMembers()
when RemoveListPicker.BeforePicking():
RemoveListPicker.Elements = PhoneNumbers
when RemoveListPicker.AfterPicking():
yail-list-remove-item!(PhoneNumbers, yail-list-index(RemoveListPicker.Selection, PhoneNumbers))
TinyDB1.StoreValue('textGroup', PhoneNumbers)
displayMembers()
|