Answers.Body: <h2>Start with Scratch!</h2>
  <p>Scratch has all of the turtle concepts in it natively (they call the turtles <em>sprites</em>, and you can use the pen extension to draw), plus a ton of advantages that are critical for beginner programmers (especially young folks, but not exclusively; <a href="https://cs50.harvard.edu/scratch/" rel="nofollow noreferrer">Harvard uses Scratch for introducing coding in CS50</a>):</p>
  <ul>
  <li><p>No typing skills are required (less of a problem for older learners, but can be a major blocker for youngsters -- I've taught Scratch to classes of 1st and 2nd graders and that's virtually impossible with Python).</p>
  </li>
  <li><p>No syntax frustrations because the blocks are all there in front of you.</p>
  </li>
  <li><p>It's largely self-documenting; the blocks are all there in front of you.</p>
  </li>
  <li><p>Having all the blocks right there means you learn more by hands-on experiementation in Scratch; Python turtle shifts the focus to reading documentation and tutorials, switching between tabs or consulting books and guides, activities that tend to only be accessible to older audiences.</p>
  </li>
  <li><p>Scratch's design eliminates many classes of silly bugs and lets students focus more on the payoff (fun) and on the high-level programming concepts without getting bogged down by the endless minutiae, gotchas and quirks that come with any powerful general-purpose language like Python.</p>
  </li>
  <li><p>Scratch runs in the browser (the place where beginners will likely be working) natively, unlike Python which is not a browser technology; no need for (often buggy/slow/poor UX/UI) third-party sites like <a href="https://trinket.io/python" rel="nofollow noreferrer">trinket</a> or <a href="https://replit.com/languages/python_turtle" rel="nofollow noreferrer">repl.it</a> or installing/setting up offline IDEs to make the development workflow tolerable.</p>
  </li>
  <li><p>Scratch has a great community of inspirational projects (this can be a downside; some classes I've taught Scratch in turn into a battle against kids playing <a href="https://scratch.mit.edu/users/griffpatch/" rel="nofollow noreferrer">griffpatch</a> games all hour -- <a href="https://snap.berkeley.edu/" rel="nofollow noreferrer">Snap</a> or offline Scratch solves this problem, or using a browser extension or whitelist to keep them tied down to projects starting with their username...).</p>
  </li>
  <li><p>Scratch has built-in, incredibly easy-to-use sprite, sound and audio editors; computer vision motion detection; advanced collision detection between sprites and colors; integrations with hardware extensions; etc. These features would be prohibitive to implement with a beginner in Python.</p>
  </li>
  <li><p>Scratch makes asset management (images, sounds) effortless.</p>
  </li>
  <li><p>Scratch has great builtin assets so students can get to creating something visually impressive right away. With turtle, they'll generally be drawing simple shapes for starters.</p>
  </li>
  <li><p>Scratch is more effortlessly powerful than Python turtle in ways that are specific to the sort of projects beginners typically want to make (in addition to making turtle-oriented apps easier to make).</p>
  </li>
  <li><p>Scratch offers a gentle introduction to coordinates by showing the mouse and sprite positions when the program isn't running. In general, Scratch has anticipated pain points like this and has baked solutions into the UI in ways Python turtle hasn't (and can't).</p>
  </li>
  <li><p>Scratch isn't exactly object-oriented, yet it has separate scripts for each sprite (data is shared globally but usually doesn't play much of a role in a typical beginner-level Scratch program), so there's enough separation but without all the baggage of OOP.</p>
  <p>It's true that state management and event handling for clones can be a major pain but that's pretty advanced Scratch that will probably never be encountered except by the most dedicated students.</p>
  </li>
  <li><p>Control flow in Scratch largely <em>just works</em>. You can slap on a bunch of &quot;forever&quot; blocks and run the app without having to fuss with putting <code>turtle.mainloop()</code> in the proper location. Event handling, clicks and messages are generally very easy to deal with for basic and intermediate use-cases.</p>
  </li>
  </ul>
  <p>Furthermore, Python turtle has a ton of disadvantages (or &quot;characteristics&quot;, to use a more measured word) that harm its usefulness for beginners:</p>
  <ul>
  <li><p>To be able to use Python turtle, you have to use Python on a decent-enough level. Python is a full-featured programming language that isn't trivial to gain a basic command of in its own right.</p>
  <p>If the primary goal is to learn <em>Python</em> specifically, turtle isn't a bad way to do it, particularly for younger learners. But then again, most folks will probably learn Python without graphics because they're probably old enough to want to use it for something other than game design or animations.</p>
  <p>Scratch totally eliminates the distinction between the language and the graphical module (clearly, having decoupled modules is key to the usefulness of a general-purpose language like Python, but it's just a hindrance if you're only using it for turtle -- sort of like buying a whole car just to listen to the radio).</p>
  </li>
  <li><p>Variables and state are a bigger deal in Python, and it's really easy to get into ugly situations with global variables and functions and wind up with a mess. Yes, Scratch variables are global, but you can get pretty far without using them much at all.</p>
  </li>
  <li><p>By nature, you (sort of) have to teach a certain amount of <a href="https://en.wikipedia.org/wiki/Object-oriented_programming" rel="nofollow noreferrer">OOP</a> along with Python's brand of turtle, but then the turtle module itself breaks various rules of OOP in ways that are questionable and sources of confusion, like <a href="https://stackoverflow.com/questions/42874183/difference-between-turtle-and-turtle">calling methods from the procedural interface along with the object-oriented interface</a>.</p>
  </li>
  <li><p>The design of the turtle library from a software engineering perspective is a bit weird, involving various <a href="https://stackoverflow.com/a/16120087/6243352">awkward ways of doing basic things</a>, <a href="https://docs.python.org/3/library/turtle.html#turtle.down" rel="nofollow noreferrer">redundant and poorly-named methods</a> (What does &quot;pu&quot; do? Does &quot;down&quot; move my turtle down? Oh wait, it puts the <em>pen</em> down...), questionable design choices and a lot of bloat (150+ methods just to achieve what Scratch does in a few dozen blocks -- yes, half of these methods are duplicates in defiance of the <a href="https://www.python.org/dev/peps/pep-0020/" rel="nofollow noreferrer">Zen</a>).</p>
  </li>
  <li><p>Window/screen/event management in turtle can be a headache.</p>
  </li>
  <li><p>Control flow in Python turtle can quickly ruin the party -- it requires some understanding of timers, blocking calls, first-class functions (for event handlers) and so forth. It's not uncommon for a student to <a href="https://stackoverflow.com/questions/51991587/python-turtle-module-wont-run-my-code-on-python-3-6">put a blocking call above other code and wind up wondering why the program hangs</a> or <a href="https://stackoverflow.com/questions/19018243/python-turtle-graphics-window-only-opens-briefly-then-closes">forget to make a blocking call</a> <a href="https://stackoverflow.com/questions/7217405/turtle-graphics-not-responding">to run the animation loop</a>. Misunderstandings like this get in the way less frequently in Scratch. It's not impossible to miss some <a href="https://stackoverflow.com/questions/60480328/attributeerror-partially-initialized-module-turtle-has-no-attribute-turtle"><em>extremely</em> subtle detail</a> <a href="https://stackoverflow.com/questions/53692691/dont-understand-this-attributeerror-module-turtle-has-no-attribute-turtle">that halts your app</a>, just harder with Scratch.</p>
  </li>
  <li><p>Python turtle involves a lot of <a href="https://docs.python.org/3/library/turtle.html" rel="nofollow noreferrer">combing the docs</a> to figure out what stuff does. And that's just the module, not to mention the rest of the language.</p>
  <p>Add to that the fact that Python 2 has many subtle differences from Python 3, so it's super easy to wind up looking at the wrong docs entirely.</p>
  <p>Sure, these skills are super-important for actual development, but there's no point foisting them on anyone until they're mentally ready for the challenge.</p>
  </li>
  <li><p>Python has limited options for further pursuit of graphics/interactive applications. <a href="https://en.wikipedia.org/wiki/Pygame" rel="nofollow noreferrer">Pygame</a> is a typical next step after Python turtle, but it can be a leap in both power and complexity and runs into the same old environment issues where it's simply <a href="https://stackoverflow.com/a/8634287/6243352">non-native for the browser</a>, the de-facto beginner development environment. Once again, Scratch covers most of the features of Pygame a beginner would use and be able to appreciate.</p>
  <p>After turtle and Pygame (and maybe a <a href="https://codereview.stackexchange.com/questions/240237/zork-like-text-adventure-w-python">text adventure</a> project), the stuff Python is useful for (<a href="https://www.datacamp.com/learn/python" rel="nofollow noreferrer">data science</a>, AI/CV/NLP/ML, backend web apps, data mining, etc...) tends to be too complex and abstract for beginners of any age who prefer visualizations and interactivity. It's fine to switch between languages, though, so this isn't a complete deal-breaker, and Python certainly is used as a scripting language for most things eager students might want to investigate (say, robotics) and has a fantastic ecosystem of packages, so this is a somewhat minor point.</p>
  </li>
  </ul>
  <p>Ironically (because of the very non-beginner-level context), one of the most effective uses of Python's turtle I've seen was as a lightweight visualizer in the coursework for a <a href="https://www.udacity.com/course/artificial-intelligence-for-robotics--cs373" rel="nofollow noreferrer">graduate-level AI course on robotics</a>.</p>
  <p>Although this seems like a big rant against Python turtle (or even Python in general), I'm actually quite fond of turtle. It's a useful, simple, fun drawing package that's a great tool to have in Python. But I think it's overprescribed to many curricula or individual learners when Scratch would be far easier and more effective at achieving the goals of engagement and communicating the basics of programming for most audiences, particularly young ones.</p>
  <p>I emphasize the quirks of Python turtle because, as experienced programmers and educators, it's easy to forget all of the countless frustrations that come with learning programming for the first time. The extent to which Scratch streamlines the development experience and lets users work at a high enough level that they can build cool stuff with a minimal amount of frustrations and gotchas is remarkable.</p>
  <p>Students will have plenty of time to learn how to navigate docs, engineering patterns and language quirks once their appetite for coding has been whet and they're confident with basic control structures and logic.</p>
  <h2>Does Python/turtle offer anything to beginners?</h2>
  <p>Of course. Students who've spent at least a bit of time with Scratch and are eager to move on to Python specifically and have a decent reason for pursuing the language should be a fine fit for turtle. Turtle can be used for a handful of lessons to gently help translate concepts from Scratch into written code while introducing Python syntax and concepts like objects and methods.</p>
  <p>Some students feel that Scratch is a silly toy (understandable, given the colorful drag 'n drop interface and chipper, wholesome look, but incorrect) and want the feeling of something more &quot;grown up&quot;, i.e. a written language. In many cases, I've found ambitious students sometimes get more than they've bargained for and wind up going back to Scratch, at least temporarily, upon tasting the difficulty of Python: syntax errors, typing the code out, having no idea what to type or where to find help, little concept for the syntax and semantics of a program, etc.</p>
  <p>Students in typed languages are likely to require more hand-holding and guidance, and may develop less independence than block languages like Scratch.</p>
  <p>Python with turtle might be a better fit than Scratch for math classes for older students because stacking tons of math blocks in Scratch can get nasty. Peter Farrell has a great book and blog called <a href="http://hackingmathclass.blogspot.com/" rel="nofollow noreferrer">Hacking Math Class</a> (but then again, he's <a href="https://codepen.io/peterfarrell66/" rel="nofollow noreferrer">using a ton of p5.js nowadays</a>; more on this below) that seems like a potential opportunity for turtle over Scratch. This use-case is mostly single-turtle (meaning you can use the procedural interface) and non-sprite-oriented, with coding based mostly on simple movement commands and focus on math formulas.</p>
  <p>That said, Python isn't necessarily my first choice to recommend as a beginner language, even after Scratch, because it's not as natively interactive as HTML5 (HTML, CSS and JavaScript). I think the benefits of Python for beginners are overrated, particularly for younger folk. Which brings me to my next point.</p>
  <h2>Consider HTML (and HTML5, <a href="https://p5js.org/" rel="nofollow noreferrer">p5.js</a>)</h2>
  <p>It hasn't been mentioned yet in this thread, but HTML is a fantastic option to consider as an alternative to (or in addition to) a turtle-oriented curriculum. Yes, HTML is typed, isn't a genuine programming language, doesn't teach logic commands as turtle does and doesn't let you make games nearly as easily as Scratch (JavaScript required), but it has many benefits:</p>
  <ul>
  <li>Instantaneous visual results with just a few lines of code.</li>
  <li>Most everyone's used a webpage, so the motivation is obvious.</li>
  <li>HTML is the most browser-native thing imaginable, so there are endless high-quality development environments that are robust and non-hacky.</li>
  <li>You can have fun interacting with famous websites by changing text, background colors, images, etc, often to silly effect.</li>
  <li>HTML is an extremely practical foundational lifelong skill even for people who don't consider themselves coders.</li>
  <li>&quot;Math-y&quot; logic like loops and conditional statements are gone, so HTML can bring practical, creative computer skills to a different audience.</li>
  <li>Web design scratches a different creative itch than Scratch, enabling students make a home on the internet and express their interests, values, personality, share images and ideas, link to other sites they like, and so forth.</li>
  <li>With some assistance, it's not difficult to do quizzes and interactive fiction projects using text, links and images and introduce interactivity into projects incrementally.</li>
  <li>HTML teaches tons of core CS concepts like trees/nesting/parent/child/ancestor, the idea of a <em>node</em> or <em>element</em> with state (input boxes) and properties, etc.</li>
  <li>HTML is a forgiving language -- things can get messed up but even if the markup a student has written is pretty borked, you can get something on the screen and avoid intimidating errors. Linters and validators built into most IDEs these days will auto-close tags and show problems. The most typical problem is something not showing up because it's in the wrong spot or a missed closing tag.</li>
  <li>HTML leads right into CSS and JavaScript, two outstanding domains for education. Adding style, buttons, alerts and forms to a basic HTML page can be tons of fun.</li>
  <li>It's easy to add interactive videos and audio to pages.</li>
  <li>CSS is extremely powerful and can do a lot with a little; cool animations can be added by copying and pasting from <a href="https://www.w3schools.com/" rel="nofollow noreferrer">w3schools</a> (yes, developers cringe, but just let beginners have fun making a mess!)</li>
  <li>Ditto for JS: let students copy little trinkets and click handlers into their page that can flash alerts, change text and colors, etc.</li>
  </ul>
  <p>With these basics in place, <a href="https://p5js.org/" rel="nofollow noreferrer">p5.js</a> becomes a logical next step as an alternative to Pygame or Python turtle. JS is natively visual and p5 is easy to run; just navigate to <a href="https://editor.p5js.org/" rel="nofollow noreferrer">p5's web editor</a> or open a <a href="https://codepen.io/p5js/pen/wreBKy" rel="nofollow noreferrer">Codepen template</a>. These environments are less brittle than the hacky Python graphics IDEs for browsers.</p>
  <p>HTML, CSS and JS offers a rich variety of next-steps for pretty much any interest, even traditionally Python-oriented domains like data visualization, robotics and AI. p5 can do turtle-style graphics with an arguably better/more intuitive design than Python turtle (particularly the setup/draw loop).</p>
  <p>p5's <a href="https://p5js.org/reference/" rel="nofollow noreferrer">docs</a> and <a href="https://p5js.org/examples/" rel="nofollow noreferrer">examples</a> are fantastic.</p>
  <p>Going the JS route instead of Python as a next step after Scratch seems like a great fit for students who are visually-oriented and prefer interactivity to console-based programs and utilities (although NodeJS does that just fine, too).</p>
  <h2>Consider Code.org</h2>
  <p>As <a href="https://cseducators.stackexchange.com/a/6937/9426">another post</a> mentioned, <a href="https://code.org/" rel="nofollow noreferrer">code.org</a> is also great! The benefit of code.org over Scratch is that Scratch is a relatively unstructured sandbox which can overwhelm some learners. Code.org offers short block programming puzzles with clear structure and goals, teaching control flow, state and basic logic.</p>
  <p>Among many other small apps and sites, there's a code.org-like <a href="https://www.google.com/doodles/celebrating-50-years-of-kids-coding" rel="nofollow noreferrer">Google Doodle</a> that I've gotten good mileage out of with coding novices of all ages and might make a fantastic day-one start to a curriculum.</p>
  <h2>Honorable mentions</h2>
  <p>I don't have much experience with these, but <a href="https://en.wikipedia.org/wiki/Racket_(programming_language)" rel="nofollow noreferrer">Racket</a> (for older students -- it does turtle graphics nicely, but the language is a Lisp) and something like <a href="https://en.wikipedia.org/wiki/Lego_Mindstorms" rel="nofollow noreferrer">Lego Mindstorms</a>, a block language for robotics, deserve mention (controlling a robot in Mindstorms is the same as controlling an on-screen turtle).</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2021-05-26T20:19:53.053Z
Answers.Text: This is a fantastic answer -- I'm not sure how I missed it before.  (I tend to read every word on this site, so it's rare that something slips my gaze) -- welcome to CSEd!!
Answers.UserDisplayName: Ben I.
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2021-05-26T20:31:44.160Z
Answers.Text: Thanks for reading and the welcome! I was worried the answer didn't recommend enough Python Turtle courses after writing it all out, but I'll update it if I find more.
Answers.UserDisplayName: ggorlen
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2021-05-23T01:27:46.060Z
Answers.LastActivityDate: 2021-05-23T05:05:05.567Z
Answers.LastEditDate: 2021-05-23T05:05:05.567Z
Answers.UserDisplayName: ggorlen
Answers.Body: <p>I disagree with other commenters who say Turtle is not the best intro to programming. I've explained a planned curriculum in another answer, <a href="https://cseducators.stackexchange.com/a/6651/9632">https://cseducators.stackexchange.com/a/6651/9632</a></p>
  <p>The great thing about turtle is that it can be used to teach modularity through procedures. Teach to extract the repeating pattern. Teach to name things (and yes, sensible naming of things is a problem for beginners). Teach typing familiarity with full names <code>turtle.forward(50)</code>, rather some simplified. Teach procedure parameters and how they pass through functions. Teach procedure as an argument to procedure. Teach Descartes coords and coords manipulation. Teach events.</p>
  <p>Each of these is hard topic, and turtle can provide lots of visual feedback to simplify understanding. Parametric graphics/animation is a good start.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-12-04T18:06:37.300Z
Answers.Text: I'm glad to be wrong about this one! :)
Answers.UserDisplayName: Ben I.
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2021-05-22T21:10:04.067Z
Answers.Text: These concepts are very important foundational software engineering principles, but complete novices could care less. They want to make interactive stories, animations and games as quickly as possible, and Python is a huge barrier to this happening initially. It's a blank slate where one typo causes the program to stop. Typing is hard to learn and struggling with two things at once can kill interest. Once students have spent a semester or two mastering Scratch and have naturally run into limitations and frustrating bugs, then they'll be receptive to typed languages and SWE principles.
Answers.UserDisplayName: ggorlen
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-12-04T12:44:41.257Z
Answers.LastActivityDate: 2020-12-04T12:44:41.257Z
Answers.UserDisplayName: danbst
Answers.Body: <p>If these kids are true beginners Python is a bit much.  Try Scratch or Alice.  If you really want a line-code language go for Small Basic.  All of these have excellent resources available on their website.  Thunkable and App Inventor can also be a good start if you want to try something different.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-08-08T14:09:59.893Z
Answers.LastActivityDate: 2020-08-08T14:09:59.893Z
Answers.UserDisplayName: Garth Flint
Answers.Body: <p>I have found that Python is not the best tool for teaching elementary and middle school students an intro to programming.  Turtle is nice, but you run out of things to do pretty quickly.  If you move on from Turtle to console based coding, many students find it less engaging.</p>
  <p>Scratch and similar visual languages are much more engaging for younger learners.  You will be surprised how full featured they are.  There is a lot of great algorithmic teaching that you can do with these.</p>
  <p>If you really want a traditional text-based language, you might check out Greenfoot (for Java).  But again, younger learners get lost in the symbols pretty quickly, so it would not be my first recommendation.  Scratch can be much more intuitive for them.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-08-03T20:14:17.573Z
Answers.LastActivityDate: 2020-08-03T20:14:17.573Z
Answers.UserDisplayName: Bryan R
Answers.Body: <p>LibreLogo, available as default plugin of Writer LibreOffice is a good choice. I teach it to primary teacher students but I also made labs with 7-10 years old kids. Unfortunately, the manual I wrote is in Italian (<a href="http://iamarf.ch/unifi/Piccolo-manuale-LibreLogo.pdf" rel="nofollow noreferrer">Piccolo manuale di LibreLogo</a> - Creative Commons License 2.5) but the coding examples are in English Logo. This text was written with the Bruner spiral curriculum in mind, i.e. you can find examples suited for primary school as well as secondary school students. I'm writing an English version (Building knowledge with turtle geometry) where I'm using both LibreLogo and Python. Will distribute it in the same way as soon as ready.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2021-05-08T20:42:19.777Z
Answers.LastActivityDate: 2021-05-08T20:42:19.777Z
Answers.UserDisplayName: Andreas
Answers.Body: <p>I think I've recommended code.org before, but here I am recommending it again! I particularly like tools like AppLab (<a href="https://code.org/educate/applab" rel="nofollow noreferrer">Link to the homepage of Code.org's AppLab</a>) that allows students to flip between block-based and text-based (JavaScript) programming.</p>
  <p>If you're interested in diving into hardware with them (which I would recommend because kids love to make stuff they can play with) Makecode (<a href="https://makecode.microbit.org/projects/turtle" rel="nofollow noreferrer">Link to MakeCode turtle projects page</a>) allows you to flip between blocks and Javascript or Python. You don't have to buy the hardware to get started because there's a simulator. Makecode Arcade (<a href="https://arcade.makecode.com/" rel="nofollow noreferrer">Link to homepage of MakeCode Arcade</a>) also let's you flip languages to build games.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2021-05-07T19:31:09.713Z
Answers.LastActivityDate: 2021-05-07T19:31:09.713Z
Answers.UserDisplayName: Randi W
Answers.Body: <p>I concur with Bryan R that Turtle might not be a great choice for an in-depth introduction.  A quick google search for &quot;python turtle lesson plans&quot; reveals that most plans are for one to three lessons, after which, you have pretty much exhausted what Turtle has to offer.</p>
  <p>There are various paid resources for Python Turtle at <a href="https://www.teacherspayteachers.com/Browse/Search:python%20turtle" rel="nofollow noreferrer">teacherspayteachers</a>.</p>
  <p>If you are open to a slightly different, more graphical, version of Turtle (called &quot;Tina&quot;), there is a whole book of lesson plans available <a href="https://nclab.com/wp-content/media/2017/12/Turtle1LessonPlans.pdf" rel="nofollow noreferrer">at nclab</a>.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2020-08-03T20:23:54.027Z
Answers.LastActivityDate: 2020-08-03T20:23:54.027Z
Answers.UserDisplayName: Ben I.
Body: <p>I would like to start volunteering with kids and young teengers in my community by introducing them to programming. I thought teaching them the basics of python would be a good start. I have some experience with teaching in general (but not with teaching kids about programming).</p>
  <p>Are there any resources that could help me or at least inspire me to make a good curriculum that goes over many concepts with turtle?</p>
  <p>Thank you!</p>
  
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2020-08-03T19:32:21.753Z
Comments.Text: I'm surprised that this doesn't have an answer yet.  I'll see what I can dig up.
Comments.UserDisplayName: Ben I.
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2021-05-13T08:26:07.030Z
Comments.Text: Python is not good for teaching a kid. Early days start from basic language.
Comments.UserDisplayName: Chanchal Sutradhar
Tags: <curriculum-design>
Title: Any good resource for introducing kids to programming using Python's Turtle Graphics?
ThreadText: # Any good resource for introducing kids to programming using Python's Turtle Graphics?
  
  (Asked by: username_0 on 2020-07-31)
  
  I would like to start volunteering with kids and young teengers in my community by introducing them to programming. I thought teaching them the basics of python would be a good start. I have some experience with teaching in general (but not with teaching kids about programming).
  
  Are there any resources that could help me or at least inspire me to make a good curriculum that goes over many concepts with turtle?
  
  Thank you!
  
  **Tags:** curriculum-design
  
  > **Comments:**
  > **username_1**: I'm surprised that this doesn't have an answer yet.  I'll see what I can dig up.  
  > **username_2**: Python is not good for teaching a kid. Early days start from basic language.  
  
  ---
  
  ## 7 answers
  
  ### Answer by username_6 on 2020-08-03. Score: 5 | Accepted answer
  
  I have found that Python is not the best tool for teaching elementary and middle school students an intro to programming. Turtle is nice, but you run out of things to do pretty quickly. If you move on from Turtle to console based coding, many students find it less engaging.
  
  Scratch and similar visual languages are much more engaging for younger learners. You will be surprised how full featured they are. There is a lot of great algorithmic teaching that you can do with these.
  
  If you really want a traditional text-based language, you might check out Greenfoot (for Java). But again, younger learners get lost in the symbols pretty quickly, so it would not be my first recommendation. Scratch can be much more intuitive for them.
  
  
  ---
  
  ### Answer by username_7 on 2021-05-08. Score: 3
  
  LibreLogo, available as default plugin of Writer LibreOffice is a good choice. I teach it to primary teacher students but I also made labs with 7-10 years old kids. Unfortunately, the manual I wrote is in Italian ([Piccolo manuale di LibreLogo](http://iamarf.ch/unifi/Piccolo-manuale-LibreLogo.pdf) - Creative Commons License 2.5) but the coding examples are in English Logo. This text was written with the Bruner spiral curriculum in mind, i.e. you can find examples suited for primary school as well as secondary school students. I'm writing an English version (Building knowledge with turtle geometry) where I'm using both LibreLogo and Python. Will distribute it in the same way as soon as ready.
  
  
  ---
  
  ### Answer by username_8 on 2021-05-07. Score: 3
  
  I think I've recommended code.org before, but here I am recommending it again! I particularly like tools like AppLab ([Link to the homepage of Code.org's AppLab](https://code.org/educate/applab)) that allows students to flip between block-based and text-based (JavaScript) programming.
  
  If you're interested in diving into hardware with them (which I would recommend because kids love to make stuff they can play with) Makecode ([Link to MakeCode turtle projects page](https://makecode.microbit.org/projects/turtle)) allows you to flip between blocks and Javascript or Python. You don't have to buy the hardware to get started because there's a simulator. Makecode Arcade ([Link to homepage of MakeCode Arcade](https://arcade.makecode.com/)) also let's you flip languages to build games.
  
  
  ---
  
  ### Answer by username_1 on 2020-08-03. Score: 2
  
  I concur with username_6 R that Turtle might not be a great choice for an in-depth introduction. A quick google search for "python turtle lesson plans" reveals that most plans are for one to three lessons, after which, you have pretty much exhausted what Turtle has to offer.
  
  There are various paid resources for Python Turtle at [teacherspayteachers](https://www.teacherspayteachers.com/Browse/Search:python%20turtle).
  
  If you are open to a slightly different, more graphical, version of Turtle (called "Tina"), there is a whole book of lesson plans available [at nclab](https://nclab.com/wp-content/media/2017/12/Turtle1LessonPlans.pdf).
  
  
  ---
  
  ### Answer by username_3 on 2021-05-23. Score: 1
  
  ## Start with Scratch!
  
  Scratch has all of the turtle concepts in it natively (they call the turtles *sprites*, and you can use the pen extension to draw), plus a ton of advantages that are critical for beginner programmers (especially young folks, but not exclusively; [Harvard uses Scratch for introducing coding in CS50](https://cs50.harvard.edu/scratch/)):
  
  * No typing skills are required (less of a problem for older learners, but can be a major blocker for youngsters -- I've taught Scratch to classes of 1st and 2nd graders and that's virtually impossible with Python).
  * No syntax frustrations because the blocks are all there in front of you.
  * It's largely self-documenting; the blocks are all there in front of you.
  * Having all the blocks right there means you learn more by hands-on experiementation in Scratch; Python turtle shifts the focus to reading documentation and tutorials, switching between tabs or consulting books and guides, activities that tend to only be accessible to older audiences.
  * Scratch's design eliminates many classes of silly bugs and lets students focus more on the payoff (fun) and on the high-level programming concepts without getting bogged down by the endless minutiae, gotchas and quirks that come with any powerful general-purpose language like Python.
  * Scratch runs in the browser (the place where beginners will likely be working) natively, unlike Python which is not a browser technology; no need for (often buggy/slow/poor UX/UI) third-party sites like [trinket](https://trinket.io/python) or [repl.it](https://replit.com/languages/python_turtle) or installing/setting up offline IDEs to make the development workflow tolerable.
  * Scratch has a great community of inspirational projects (this can be a downside; some classes I've taught Scratch in turn into a battle against kids playing [griffpatch](https://scratch.mit.edu/users/griffpatch/) games all hour -- [Snap](https://snap.berkeley.edu/) or offline Scratch solves this problem, or using a browser extension or whitelist to keep them tied down to projects starting with their username...).
  * Scratch has built-in, incredibly easy-to-use sprite, sound and audio editors; computer vision motion detection; advanced collision detection between sprites and colors; integrations with hardware extensions; etc. These features would be prohibitive to implement with a beginner in Python.
  * Scratch makes asset management (images, sounds) effortless.
  * Scratch has great builtin assets so students can get to creating something visually impressive right away. With turtle, they'll generally be drawing simple shapes for starters.
  * Scratch is more effortlessly powerful than Python turtle in ways that are specific to the sort of projects beginners typically want to make (in addition to making turtle-oriented apps easier to make).
  * Scratch offers a gentle introduction to coordinates by showing the mouse and sprite positions when the program isn't running. In general, Scratch has anticipated pain points like this and has baked solutions into the UI in ways Python turtle hasn't (and can't).
  * Scratch isn't exactly object-oriented, yet it has separate scripts for each sprite (data is shared globally but usually doesn't play much of a role in a typical beginner-level Scratch program), so there's enough separation but without all the baggage of OOP.
  
    It's true that state management and event handling for clones can be a major pain but that's pretty advanced Scratch that will probably never be encountered except by the most dedicated students.
  * Control flow in Scratch largely *just works*. You can slap on a bunch of "forever" blocks and run the app without having to fuss with putting `turtle.mainloop()` in the proper location. Event handling, clicks and messages are generally very easy to deal with for basic and intermediate use-cases.
  
  Furthermore, Python turtle has a ton of disadvantages (or "characteristics", to use a more measured word) that harm its usefulness for beginners:
  
  * To be able to use Python turtle, you have to use Python on a decent-enough level. Python is a full-featured programming language that isn't trivial to gain a basic command of in its own right.
  
    If the primary goal is to learn *Python* specifically, turtle isn't a bad way to do it, particularly for younger learners. But then again, most folks will probably learn Python without graphics because they're probably old enough to want to use it for something other than game design or animations.
  
    Scratch totally eliminates the distinction between the language and the graphical module (clearly, having decoupled modules is key to the usefulness of a general-purpose language like Python, but it's just a hindrance if you're only using it for turtle -- sort of like buying a whole car just to listen to the radio).
  * Variables and state are a bigger deal in Python, and it's really easy to get into ugly situations with global variables and functions and wind up with a mess. Yes, Scratch variables are global, but you can get pretty far without using them much at all.
  * By nature, you (sort of) have to teach a certain amount of [OOP](https://en.wikipedia.org/wiki/Object-oriented_programming) along with Python's brand of turtle, but then the turtle module itself breaks various rules of OOP in ways that are questionable and sources of confusion, like [calling methods from the procedural interface along with the object-oriented interface](https://stackoverflow.com/questions/42874183/difference-between-turtle-and-turtle).
  * The design of the turtle library from a software engineering perspective is a bit weird, involving various [awkward ways of doing basic things](https://stackoverflow.com/a/16120087/6243352), [redundant and poorly-named methods](https://docs.python.org/3/library/turtle.html#turtle.down) (What does "pu" do? Does "down" move my turtle down? Oh wait, it puts the *pen* down...), questionable design choices and a lot of bloat (150+ methods just to achieve what Scratch does in a few dozen blocks -- yes, half of these methods are duplicates in defiance of the [Zen](https://www.python.org/dev/peps/pep-0020/)).
  * Window/screen/event management in turtle can be a headache.
  * Control flow in Python turtle can quickly ruin the party -- it requires some understanding of timers, blocking calls, first-class functions (for event handlers) and so forth. It's not uncommon for a student to [put a blocking call above other code and wind up wondering why the program hangs](https://stackoverflow.com/questions/51991587/python-turtle-module-wont-run-my-code-on-python-3-6) or [forget to make a blocking call](https://stackoverflow.com/questions/19018243/python-turtle-graphics-window-only-opens-briefly-then-closes) [to run the animation loop](https://stackoverflow.com/questions/7217405/turtle-graphics-not-responding). Misunderstandings like this get in the way less frequently in Scratch. It's not impossible to miss some [*extremely* subtle detail](https://stackoverflow.com/questions/60480328/attributeerror-partially-initialized-module-turtle-has-no-attribute-turtle) [that halts your app](https://stackoverflow.com/questions/53692691/dont-understand-this-attributeerror-module-turtle-has-no-attribute-turtle), just harder with Scratch.
  * Python turtle involves a lot of [combing the docs](https://docs.python.org/3/library/turtle.html) to figure out what stuff does. And that's just the module, not to mention the rest of the language.
  
    Add to that the fact that Python 2 has many subtle differences from Python 3, so it's super easy to wind up looking at the wrong docs entirely.
  
    Sure, these skills are super-important for actual development, but there's no point foisting them on anyone until they're mentally ready for the challenge.
  * Python has limited options for further pursuit of graphics/interactive applications. [Pygame](https://en.wikipedia.org/wiki/Pygame) is a typical next step after Python turtle, but it can be a leap in both power and complexity and runs into the same old environment issues where it's simply [non-native for the browser](https://stackoverflow.com/a/8634287/6243352), the de-facto beginner development environment. Once again, Scratch covers most of the features of Pygame a beginner would use and be able to appreciate.
  
    After turtle and Pygame (and maybe a [text adventure](https://codereview.stackexchange.com/questions/240237/zork-like-text-adventure-w-python) project), the stuff Python is useful for ([data science](https://www.datacamp.com/learn/python), AI/CV/NLP/ML, backend web apps, data mining, etc...) tends to be too complex and abstract for beginners of any age who prefer visualizations and interactivity. It's fine to switch between languages, though, so this isn't a complete deal-breaker, and Python certainly is used as a scripting language for most things eager students might want to investigate (say, robotics) and has a fantastic ecosystem of packages, so this is a somewhat minor point.
  
  Ironically (because of the very non-beginner-level context), one of the most effective uses of Python's turtle I've seen was as a lightweight visualizer in the coursework for a [graduate-level AI course on robotics](https://www.udacity.com/course/artificial-intelligence-for-robotics--cs373).
  
  Although this seems like a big rant against Python turtle (or even Python in general), I'm actually quite fond of turtle. It's a useful, simple, fun drawing package that's a great tool to have in Python. But I think it's overprescribed to many curricula or individual learners when Scratch would be far easier and more effective at achieving the goals of engagement and communicating the basics of programming for most audiences, particularly young ones.
  
  I emphasize the quirks of Python turtle because, as experienced programmers and educators, it's easy to forget all of the countless frustrations that come with learning programming for the first time. The extent to which Scratch streamlines the development experience and lets users work at a high enough level that they can build cool stuff with a minimal amount of frustrations and gotchas is remarkable.
  
  Students will have plenty of time to learn how to navigate docs, engineering patterns and language quirks once their appetite for coding has been whet and they're confident with basic control structures and logic.
  
  ## Does Python/turtle offer anything to beginners?
  
  Of course. Students who've spent at least a bit of time with Scratch and are eager to move on to Python specifically and have a decent reason for pursuing the language should be a fine fit for turtle. Turtle can be used for a handful of lessons to gently help translate concepts from Scratch into written code while introducing Python syntax and concepts like objects and methods.
  
  Some students feel that Scratch is a silly toy (understandable, given the colorful drag 'n drop interface and chipper, wholesome look, but incorrect) and want the feeling of something more "grown up", i.e. a written language. In many cases, I've found ambitious students sometimes get more than they've bargained for and wind up going back to Scratch, at least temporarily, upon tasting the difficulty of Python: syntax errors, typing the code out, having no idea what to type or where to find help, little concept for the syntax and semantics of a program, etc.
  
  Students in typed languages are likely to require more hand-holding and guidance, and may develop less independence than block languages like Scratch.
  
  Python with turtle might be a better fit than Scratch for math classes for older students because stacking tons of math blocks in Scratch can get nasty. Peter Farrell has a great book and blog called [Hacking Math Class](http://hackingmathclass.blogspot.com/) (but then again, he's [using a ton of p5.js nowadays](https://codepen.io/peterfarrell66/); more on this below) that seems like a potential opportunity for turtle over Scratch. This use-case is mostly single-turtle (meaning you can use the procedural interface) and non-sprite-oriented, with coding based mostly on simple movement commands and focus on math formulas.
  
  That said, Python isn't necessarily my first choice to recommend as a beginner language, even after Scratch, because it's not as natively interactive as HTML5 (HTML, CSS and JavaScript). I think the benefits of Python for beginners are overrated, particularly for younger folk. Which brings me to my next point.
  
  ## Consider HTML (and HTML5, [p5.js](https://p5js.org/))
  
  It hasn't been mentioned yet in this thread, but HTML is a fantastic option to consider as an alternative to (or in addition to) a turtle-oriented curriculum. Yes, HTML is typed, isn't a genuine programming language, doesn't teach logic commands as turtle does and doesn't let you make games nearly as easily as Scratch (JavaScript required), but it has many benefits:
  
  * Instantaneous visual results with just a few lines of code.
  * Most everyone's used a webpage, so the motivation is obvious.
  * HTML is the most browser-native thing imaginable, so there are endless high-quality development environments that are robust and non-hacky.
  * You can have fun interacting with famous websites by changing text, background colors, images, etc, often to silly effect.
  * HTML is an extremely practical foundational lifelong skill even for people who don't consider themselves coders.
  * "Math-y" logic like loops and conditional statements are gone, so HTML can bring practical, creative computer skills to a different audience.
  * Web design scratches a different creative itch than Scratch, enabling students make a home on the internet and express their interests, values, personality, share images and ideas, link to other sites they like, and so forth.
  * With some assistance, it's not difficult to do quizzes and interactive fiction projects using text, links and images and introduce interactivity into projects incrementally.
  * HTML teaches tons of core CS concepts like trees/nesting/parent/child/ancestor, the idea of a *node* or *element* with state (input boxes) and properties, etc.
  * HTML is a forgiving language -- things can get messed up but even if the markup a student has written is pretty borked, you can get something on the screen and avoid intimidating errors. Linters and validators built into most IDEs these days will auto-close tags and show problems. The most typical problem is something not showing up because it's in the wrong spot or a missed closing tag.
  * HTML leads right into CSS and JavaScript, two outstanding domains for education. Adding style, buttons, alerts and forms to a basic HTML page can be tons of fun.
  * It's easy to add interactive videos and audio to pages.
  * CSS is extremely powerful and can do a lot with a little; cool animations can be added by copying and pasting from [w3schools](https://www.w3schools.com/) (yes, developers cringe, but just let beginners have fun making a mess!)
  * Ditto for JS: let students copy little trinkets and click handlers into their page that can flash alerts, change text and colors, etc.
  
  With these basics in place, [p5.js](https://p5js.org/) becomes a logical next step as an alternative to Pygame or Python turtle. JS is natively visual and p5 is easy to run; just navigate to [p5's web editor](https://editor.p5js.org/) or open a [Codepen template](https://codepen.io/p5js/pen/wreBKy). These environments are less brittle than the hacky Python graphics IDEs for browsers.
  
  HTML, CSS and JS offers a rich variety of next-steps for pretty much any interest, even traditionally Python-oriented domains like data visualization, robotics and AI. p5 can do turtle-style graphics with an arguably better/more intuitive design than Python turtle (particularly the setup/draw loop).
  
  p5's [docs](https://p5js.org/reference/) and [examples](https://p5js.org/examples/) are fantastic.
  
  Going the JS route instead of Python as a next step after Scratch seems like a great fit for students who are visually-oriented and prefer interactivity to console-based programs and utilities (although NodeJS does that just fine, too).
  
  ## Consider Code.org
  
  As [another post](https://cseducators.stackexchange.com/a/6937/9426) mentioned, [code.org](https://code.org/) is also great! The benefit of code.org over Scratch is that Scratch is a relatively unstructured sandbox which can overwhelm some learners. Code.org offers short block programming puzzles with clear structure and goals, teaching control flow, state and basic logic.
  
  Among many other small apps and sites, there's a code.org-like [Google Doodle](https://www.google.com/doodles/celebrating-50-years-of-kids-coding) that I've gotten good mileage out of with coding novices of all ages and might make a fantastic day-one start to a curriculum.
  
  ## Honorable mentions
  
  I don't have much experience with these, but [Racket](https://en.wikipedia.org/wiki/Racket_(programming_language)) (for older students -- it does turtle graphics nicely, but the language is a Lisp) and something like [Lego Mindstorms](https://en.wikipedia.org/wiki/Lego_Mindstorms), a block language for robotics, deserve mention (controlling a robot in Mindstorms is the same as controlling an on-screen turtle).
  
  > **Comments:**
  > **username_1**: This is a fantastic answer -- I'm not sure how I missed it before.  (I tend to read every word on this site, so it's rare that something slips my gaze) -- welcome to CSEd!!  
  > **username_3**: Thanks for reading and the welcome! I was worried the answer didn't recommend enough Python Turtle courses after writing it all out, but I'll update it if I find more.  
  
  ---
  
  ### Answer by username_4 on 2020-12-04. Score: 1
  
  I disagree with other commenters who say Turtle is not the best intro to programming. I've explained a planned curriculum in another answer, <https://cseducators.stackexchange.com/a/6651/9632>
  
  The great thing about turtle is that it can be used to teach modularity through procedures. Teach to extract the repeating pattern. Teach to name things (and yes, sensible naming of things is a problem for beginners). Teach typing familiarity with full names `turtle.forward(50)`, rather some simplified. Teach procedure parameters and how they pass through functions. Teach procedure as an argument to procedure. Teach Descartes coords and coords manipulation. Teach events.
  
  Each of these is hard topic, and turtle can provide lots of visual feedback to simplify understanding. Parametric graphics/animation is a good start.
  
  > **Comments:**
  > **username_1**: I'm glad to be wrong about this one! :)  
  > **username_3**: These concepts are very important foundational software engineering principles, but complete novices could care less. They want to make interactive stories, animations and games as quickly as possible, and Python is a huge barrier to this happening initially. It's a blank slate where one typo causes the program to stop. Typing is hard to learn and struggling with two things at once can kill interest. Once students have spent a semester or two mastering Scratch and have naturally run into limitations and frustrating bugs, then they'll be receptive to typed languages and SWE principles.  
  
  ---
  
  ### Answer by username_5 on 2020-08-08. Score: 1
  
  If these kids are true beginners Python is a bit much. Try Scratch or Alice. If you really want a line-code language go for Small Basic. All of these have excellent resources available on their website. Thunkable and App Inventor can also be a good start if you want to try something different.
  
  
  ---
  
  