Add the bulk of SF patch 595111 by Attila Babo.

This adds new methods heading(), setheading(), position(),
window_width(), window_height(), setx(), and sety(), to make this more
functionality-compatible with Logo turtle graphics (Attila's last
words, not mine :-).  I had to fix the sety() code which was broken in
Attila's patch.

I'm not adopting the functionality change that Attila claimed was a
bugfix (no output without tracing), because I disagree that it's a
bug.
diff --git a/Lib/lib-tk/turtle.py b/Lib/lib-tk/turtle.py
index 1b418eb..d59cd7a 100644
--- a/Lib/lib-tk/turtle.py
+++ b/Lib/lib-tk/turtle.py
@@ -2,6 +2,7 @@
 
 from math import * # Also for export
 import Tkinter
+
 class Error(Exception):
     pass
 
@@ -53,7 +54,6 @@
         self._delete_turtle()
         self._draw_turtle()
 
-
     def tracer(self, flag):
         self._tracing = flag
         if not self._tracing:
@@ -118,7 +118,6 @@
         self._color = color
         self._draw_turtle()
 
-
     def write(self, arg, move=0):
         x, y = start = self._position
         x = x-1 # correction -- calibrated for Windows
@@ -200,6 +199,40 @@
         if self._filling:
             self._path.append(self._position)
         self._draw_turtle()
+            
+    def heading(self):
+        return self._angle
+
+    def setheading(self, angle):
+        self._angle = angle
+        self._draw_turtle()
+
+    def window_width(self):
+        width = self._canvas.winfo_width()
+        if width <= 1:	# the window isn't managed by a geometry manager
+            width = self._canvas['width']
+        return width
+
+    def window_height(self):
+        height = self._canvas.winfo_height()
+        if height <= 1:	# the window isn't managed by a geometry manager
+            height = self._canvas['height']
+        return height
+
+    def position(self):
+        x0, y0 = self._origin
+        x1, y1 = self._position
+        return [x1-x0, -y1+y0]
+
+    def setx(self, xpos):
+        x0, y0 = self._origin
+        x1, y1 = self._position
+        self._goto(x0+xpos, y1)
+
+    def sety(self, ypos):
+        x0, y0 = self._origin
+        x1, y1 = self._position
+        self._goto(x1, y0-ypos)
 
     def goto(self, *args):
         if len(args) == 1:
@@ -326,6 +359,13 @@
 def fill(flag): _getpen().fill(flag)
 def circle(radius, extent=None): _getpen().circle(radius, extent)
 def goto(*args): apply(_getpen().goto, args)
+def heading(): return _getpen().heading()
+def setheading(angle): _getpen().setheading(angle)
+def position(): return _getpen().position()
+def window_width(): return _getpen().window_width()
+def window_height(): return _getpen().window_height()
+def setx(xpos): _getpen().setx(xpos)
+def sety(ypos): _getpen().sety(ypos)
 
 def demo():
     reset()