From 4f4000ad93aaa7edc1abb21db2fe08b18b04db5f Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Tue, 16 Nov 2010 16:54:57 +0000 Subject: putting python sample code into individual files --- diff --git a/pysamples/copy_from_heap.py b/pysamples/copy_from_heap.py new file mode 100644 index 0000000..8483fde --- /dev/null +++ b/pysamples/copy_from_heap.py @@ -0,0 +1,35 @@ +#Copyright (c) 2010, Walter Bender, Tony Forster + +#Permission is hereby granted, free of charge, to any person obtaining a copy +#of this software and associated documentation files (the "Software"), to deal +#in the Software without restriction, including without limitation the rights +#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +#copies of the Software, and to permit persons to whom the Software is +#furnished to do so, subject to the following conditions: + +#The above copyright notice and this permission notice shall be included in +#all copies or substantial portions of the Software. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +#THE SOFTWARE. + +# This procedure is invoked when the user-definable block on the "extras" +# palette is selected. + +def myblock(lc, x): + + ########################################################################### + # + # Copy heap to clipboard + # + ########################################################################### + + from gtk import Clipboard + from tautils import data_to_string + + Clipboard().set_text(data_to_string(lc.heap)) diff --git a/pysamples/dotted_line.py b/pysamples/dotted_line.py new file mode 100644 index 0000000..9db7f9d --- /dev/null +++ b/pysamples/dotted_line.py @@ -0,0 +1,151 @@ +#Copyright (c) 2009-10, Walter Bender + +#Permission is hereby granted, free of charge, to any person obtaining a copy +#of this software and associated documentation files (the "Software"), to deal +#in the Software without restriction, including without limitation the rights +#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +#copies of the Software, and to permit persons to whom the Software is +#furnished to do so, subject to the following conditions: + +#The above copyright notice and this permission notice shall be included in +#all copies or substantial portions of the Software. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +#THE SOFTWARE. + +# +# This procedure is invoked when the user-definable block on the "extras" +# palette is selected. Some examples of how to use this block are included +# below. Try uncommenting an example or write your own Python code. +# +# To uncomment code, remove the '# ' in the Python code. Take care to preserve +# the proper indentations. +# +# +# NOTES: +# +# Turtle Art is created in object oriented Python code. This is based +# around the definition of classes and the creation of object(s) which +# are instance(s) of that class. These objects then have properties and +# methods which are defined by their class. +# +# See http://docs.python.org/tutorial/classes.html for a description of +# classes in Python. +# +# Class Defined in Instance Created in +# TurtleArtWindow tawindow.py tw TurtleArtActivity.py +# LogoCode talogo.py lc tawindow.py +# TurtleGraphics tacanvas.py canvas tawindow.py +# Turtles, Turtle taturtle.py turtles tawindow.py, +# tacanvas.py +# Blocks, Block tablock.py block_list tawindow.py +# +# +# Class TurtleArtWindow -- useful properties and methods (from within +# tamyblock.py, lc.tw is the class instance) +# +# Methods and data attributes Example +# set_fullscreen(self) lc.tw.set_fullscreen() +# Note: Hides the Sugar toolbar +# set_cartesian(self, flag) lc.tw.set_cartesian(True) +# Note: True will make the overlay visible; +# False will make it invisible +# set_polar(self, flag) lc.tw.set_polar(True) +# Note: True will make the overlay visible; +# False will make it invisible +# hideshow_button(self, flag) lc.tw.hideshow_button() +# Note: Toggles visibility of blocks and palettes +# self.active_turtle lc.tw.active_turtle +# Note: The active turtle instance +# +# +# Class TurtleGraphics -- useful properties and methods (from within +# tamyblock.py, lc.tw.canvas is the class instance) +# +# Methods and data attributes Example +# clearscreen(self) lc.tw.canvas.clearscreen() +# Note: Clears the screen and resets all turtle and +# pen attributes to default values +# setpen(self, flag) lc.tw.canvas.setpen(True) +# Note: True will set the pen "down", enabling drawing; +# False will set the pen "up" +# forward(self, n) lc.tw.canvas.forward(100) +# Note: Move the turtle forward 100 units +# arc(self, a, r) lc.tw.canvas.arc(120, 50) +# Note: Move the turtle along an arc of 120 degrees +# (clockwise) and radius of 50 units +# setheading(self, a) lc.tw.canvas.setheading(180) +# Note: Set the turtle heading to 180 +# (towards the bottom of the screen) +# self.heading lc.tw.canvas.heading +# Note: The current heading +# setpensize(self, n) lc.tw.canvas.setpensize(25) +# Note: Set the turtle pensize to 25 units +# self.pensize lc.tw.canvas.pensize +# Note: The current pensize +# setcolor(self, c) lc.tw.canvas.color(70) +# Note: Set the pen color to 70 (blue) +# self.color lc.tw.canvas.color +# Note: The current pen color +# setshade(self, s) lc.tw.canvas.shade(50) +# Note: Set the pen shade to 50 +# self.shade lc.tw.canvas.shade +# Note: The current pen shade +# fillscreen(self, c, s) lc.tw.canvas.fillscreen(70, 90) +# Note: Fill the screen with color 70, shade 90 (light blue) +# setxy(self, x, y) lc.tw.canvas.setxy(100,100) +# Note: Move the turtle to position (100, 100) +# self.xcor lc.tw.canvas.xcor +# Note: The current x coordinate of the turtle +# (scaled to current units) +# self.ycor lc.tw.canvas.ycor +# Note: The current y coordinate of the turtle +# (scaled to current units) +# self.set_turtle(name) lc.tw.canvas.set_turtle(1) +# Note: Set the current turtle to turtle '1' +# +# +# Other useful Python functions +# Module Example +# from math import pow pow(2,3) returns 2 to the 3rd power +# Note: See http://docs.python.org/library/math.html +# from math import sin, pi sin(45*pi/180) returns sin of 45 (0.707) +# Note: See http://docs.python.org/library/math.html +# from time import localtime localtime().tm_hour returns the current hour +# Note: See http://docs.python.org/library/time.html +# lc.heap.append(data) adds data to the heap +# Note: See http://docs.python.org/tutorial/datastructures.html +# data = lc.heap.pop(-1) pops data off the heap +# Note: See http://docs.python.org/tutorial/datastructures.html +# + +def myblock(lc, x): + + ########################################################################### + # + # Draw a dotted line of length x. + # + ########################################################################### + + try: # make sure x is a number + x = float(x) + except ValueError: + return + if lc.tw.canvas.pendown: + dist = 0 + while dist+lc.tw.canvas.pensize < x: # repeat drawing dots + lc.tw.canvas.setpen(True) + lc.tw.canvas.forward(1) + lc.tw.canvas.setpen(False) + lc.tw.canvas.forward((lc.tw.canvas.pensize*2)-1) + dist += (lc.tw.canvas.pensize*2) + lc.tw.canvas.forward(x-dist) # make sure we have moved exactly x + lc.tw.canvas.setpen(True) + else: + lc.tw.canvas.forward(x) + return diff --git a/pysamples/load_journal_entry_to_heap.py b/pysamples/load_journal_entry_to_heap.py new file mode 100644 index 0000000..7416554 --- /dev/null +++ b/pysamples/load_journal_entry_to_heap.py @@ -0,0 +1,35 @@ +#Copyright (c) 2010, Walter Bender, Tony Forster + +#Permission is hereby granted, free of charge, to any person obtaining a copy +#of this software and associated documentation files (the "Software"), to deal +#in the Software without restriction, including without limitation the rights +#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +#copies of the Software, and to permit persons to whom the Software is +#furnished to do so, subject to the following conditions: + +#The above copyright notice and this permission notice shall be included in +#all copies or substantial portions of the Software. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +#THE SOFTWARE. + +# This procedure is invoked when the user-definable block on the "extras" +# palette is selected. + +def myblock(lc, x): + + ########################################################################### + # + # Load heap from journal + # + ########################################################################### + + from tautils import chooser + + # Choose a datastore object and push data to heap (Sugar only) + chooser(lc.tw.parent, '', lc.push_file_data_to_heap) diff --git a/pysamples/paste_to_heap.py b/pysamples/paste_to_heap.py new file mode 100644 index 0000000..9255a93 --- /dev/null +++ b/pysamples/paste_to_heap.py @@ -0,0 +1,39 @@ +#Copyright (c) 2010, Walter Bender, Tony Forster + +#Permission is hereby granted, free of charge, to any person obtaining a copy +#of this software and associated documentation files (the "Software"), to deal +#in the Software without restriction, including without limitation the rights +#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +#copies of the Software, and to permit persons to whom the Software is +#furnished to do so, subject to the following conditions: + +#The above copyright notice and this permission notice shall be included in +#all copies or substantial portions of the Software. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +#THE SOFTWARE. + +# This procedure is invoked when the user-definable block on the "extras" +# palette is selected. + +def myblock(lc, x): + + ########################################################################### + # + # Paste from clipboard to heap + # + ########################################################################### + + from gtk import Clipboard + from tautils import data_from_string + + text = Clipboard().wait_for_text() + if text is not None: + for val in data_from_string(text): + lc.heap.append(val) + lc.update_label_value('pop', val) diff --git a/pysamples/push_mouse_event.py b/pysamples/push_mouse_event.py new file mode 100644 index 0000000..a79f53e --- /dev/null +++ b/pysamples/push_mouse_event.py @@ -0,0 +1,40 @@ +#Copyright (c) 2009-10, Walter Bender, Tony Forster + +#Permission is hereby granted, free of charge, to any person obtaining a copy +#of this software and associated documentation files (the "Software"), to deal +#in the Software without restriction, including without limitation the rights +#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +#copies of the Software, and to permit persons to whom the Software is +#furnished to do so, subject to the following conditions: + +#The above copyright notice and this permission notice shall be included in +#all copies or substantial portions of the Software. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +#THE SOFTWARE. + +# +# This procedure is invoked when the user-definable block on the "extras" +# palette is selected. + +def myblock(lc, x): + + ########################################################################### + # + # Push mouse event to stack + # + ########################################################################### + + if lc.tw.mouse_flag == 1: + # push y first so x will be popped first + lc.heap.append(lc.tw.mouse_y) + lc.heap.append(lc.tw.mouse_x) + lc.heap.append(1) # mouse event + lc.tw.mouse_flag = 0 + else: + lc.heap.append(0) # no mouse event diff --git a/pysamples/push_time.py b/pysamples/push_time.py new file mode 100644 index 0000000..ae22684 --- /dev/null +++ b/pysamples/push_time.py @@ -0,0 +1,37 @@ +#Copyright (c) 2009-10, Walter Bender + +#Permission is hereby granted, free of charge, to any person obtaining a copy +#of this software and associated documentation files (the "Software"), to deal +#in the Software without restriction, including without limitation the rights +#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +#copies of the Software, and to permit persons to whom the Software is +#furnished to do so, subject to the following conditions: + +#The above copyright notice and this permission notice shall be included in +#all copies or substantial portions of the Software. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +#THE SOFTWARE. + +# This procedure is invoked when the user-definable block on the "extras" +# palette is selected. + +def myblock(lc, x): + + ########################################################################### + # + # Push hours, minutes, seconds onto the FILO. + # Use three 'pop' blocks to retrieve these values. + # Note: because we use a FILO (first in, last out heap), + # the first value you pop off of the FILO will be seconds. + # + ########################################################################### + + lc.heap.append(localtime().tm_hour) + lc.heap.append(localtime().tm_min) + lc.heap.append(localtime().tm_sec) diff --git a/pysamples/save_heap_to_journal_entry.py b/pysamples/save_heap_to_journal_entry.py new file mode 100644 index 0000000..c4f2d50 --- /dev/null +++ b/pysamples/save_heap_to_journal_entry.py @@ -0,0 +1,55 @@ +#Copyright (c) 2010, Walter Bender, Tony Forster + +#Permission is hereby granted, free of charge, to any person obtaining a copy +#of this software and associated documentation files (the "Software"), to deal +#in the Software without restriction, including without limitation the rights +#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +#copies of the Software, and to permit persons to whom the Software is +#furnished to do so, subject to the following conditions: + +#The above copyright notice and this permission notice shall be included in +#all copies or substantial portions of the Software. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +#THE SOFTWARE. + +# This procedure is invoked when the user-definable block on the "extras" +# palette is selected. + +def myblock(lc, x): + + ########################################################################### + # + # Save heap to journal (Sugar only) + # + ########################################################################### + + import os.path + from gettext import gettext as _ + + from sugar.activity import activity + from sugar.datastore import datastore + from sugar import profile + + from tautils import get_path, data_to_file + + # Save JSON-encoded heap to temporary file + heap_file = os.path.join(get_path(activity, 'instance'), str(x) + '.txt') + data_to_file(lc.heap, heap_file) + + # Create a datastore object + dsobject = datastore.create() + + # Write any metadata (specifically set the title of the file + # and specify that this is a plain text file). + dsobject.metadata['title'] = str(x) + dsobject.metadata['icon-color'] = profile.get_color().to_string() + dsobject.metadata['mime_type'] = 'text/plain' + dsobject.set_file_path(heap_file) + datastore.write(dsobject) + dsobject.destroy() diff --git a/pysamples/set_rgb.py b/pysamples/set_rgb.py new file mode 100644 index 0000000..f524ec6 --- /dev/null +++ b/pysamples/set_rgb.py @@ -0,0 +1,50 @@ +#Copyright (c) 2009-10, Walter Bender + +#Permission is hereby granted, free of charge, to any person obtaining a copy +#of this software and associated documentation files (the "Software"), to deal +#in the Software without restriction, including without limitation the rights +#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +#copies of the Software, and to permit persons to whom the Software is +#furnished to do so, subject to the following conditions: + +#The above copyright notice and this permission notice shall be included in +#all copies or substantial portions of the Software. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +#THE SOFTWARE. + +# +# This procedure is invoked when the user-definable block on the "extras" +# palette is selected and expanded to 3 arguments. + +def myblock(lc, x): + + ########################################################################### + # + # Set rgb color from values + # + ########################################################################### + + # assuming x is an array [r, g, b] + b = int(x[2]) + while b < 0: + b += 256 + while b > 255: + b -= 256 + g = int(x[1]) + while g < 0: + g += 256 + while g > 255: + g -= 256 + r = int(x[0]) + while r < 0: + r += 256 + while r > 255: + r -= 256 + rgb = "#%02x%02x%02x" % (r,g,b) + lc.tw.canvas.fgcolor = lc.tw.canvas.cm.alloc_color(rgb) -- cgit v0.9.1