Trouble with turtles

11 Feb, 2018

Theodore M writes:

Hello. Working in python with my daughter, but stuck on this error:

Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "copyright", "credits" or "license()" for more information. >>> import turtle Traceback (most recent call last): File "<pyshell#0>", line 1, in import turtle File "/Users/mac/Documents/turtle.py", line 2, in t=turtle.Pen() AttributeError: module 'turtle' has no attribute 'Pen'

It looks as if you might have created a file called turtle.py in your Documents directory (/Users/mac/Documents), and because you're running IDLE from the same directory (I assume), that file is being loaded before the actual turtle module. If you delete this file and try again, hopefully you'll have more success.

Update: for people having a similar problem on Windows (or really any Operating System), who can't find the file to delete, one option is to enter this into the shell:

import turtle
print(turtle.__file__)

That will give you the full path. For example:

>>> print(turtle.__file__)
C:\Users\jason\AppData\Local\Programs\Python\Python37-32\turtle.py

Becoming an expert?

12 Jan, 2018

Femi A writes:

I just got your book: Python for kids and I’m excited to start reading it. I am 36 years old and I would like to learn computer programming. I figure python would be a good place to start. Is it possible to become an expert at python in 6 months with intensive efforts? And if it is can you please let me know how to go about that, the steps to take etc...

I would say this isn't necessarily a Python, nor even a general computer programming question. It's more a question about how you define expertise, what that means from a learning perspective, and what your goals really are. If you define expertise in terms of Malcolm Gladwell's 10,000 hour rule and spend 4-5 hours a day at it, you'll be an "expert" in 6 years or so [1]. So if your goal is to call yourself an "expert", then that's probably your timeline.

If your goal is to develop some software, make a meaningful contribution to an open source project, or something along those lines, and are well motivated, it's certainly possible to do that, and more, with 6 months of dedicated effort. So, how to get to the point where you're at least confident in your coding? Start with a beginners book, funnel that knowledge in developing a few simple projects to build your experience; then perhaps look for a more advanced Python book (O'Reilly's Python Cookbook might be a good option), followed by some more advanced projects, again for the experience. Just remember, it's more important to be coding than reading about it.

Hope that helps.

[1]: Also see this Business Insider article for a counterpoint to the 10K hour principle.


Apple's Broken Parental Controls

12 Nov, 2017

What's a nice way to give a kid a limited amount of spending freedom, and letting them buy some things without being able to decimate your credit card? iTunes Voucher -- seems reasonable right?

So... redeeming voucher... Enter Apple ID password. Okay. Use camera to enter code. That's helpful. Please enter your credit card security code. Wait, what? Sigh. Fine.

Hand iPad back to kid. "Right, you can buy something now."

"How about this one?"

"Nooo that's too expensive. Find another one."

"What about this?"

"Yes okay, that works. You can click this Buy button here."

"Pa??" iPad thrust back into your hands.

Enter Apple ID password

Sigh. Okay. Why the heck did I bother to add a nice long, secure password for his account?

Ask for your parent's approval. Click Ask... time passes... Nothing happened. Huh? Click Buy again.

Enter Apple ID password.

WTH? Just did that! For. The. Same. Game.

Ask for your parent's approval (they can also authorise on this device). Yes, but that defeats the purpose. The whole point was to let the kid buy a few things himself. Click Ask.

A message arrives on my phone: Your iDevice-obsessed post-toddler wants to purchase lego-something-or-other-game. Are you sure he's not already spending too much time on devices already? Woohoo, finally got the request! Unlock phone. Wait, WTH! Where's the authorisation dialog gone? Settings > Parental controls? Nope nothing there. Search > Parental Controls. Nothing there either. Sigh. Back to the kid's device again. Click Buy... again.

Enter Apple ID password

Whatever. Stupid long passwords.

Ask for your parent's approval. Stab Ask. Kid now looking at you strangely because you're starting to mutter rude words under your breath.

A message arrives on my phone: Your iDevice-obsessed post-toddler wants to purchase lego-something-or-other-game. Yes I know. It's me not the kid -- how's a child supposed to figure this out? Touch the dialog correctly this time.

A message arrives on the kid's iPad: The bossy parental unit has authorised your purchase. Excellent. Hand back device to kid.

"Pa??" iPad thrust back into my hands.

What's the problem now? Oh, the buy button has turned into a get link. Only it doesn't look like a link at all. It's just the text GET. WTH? Where are the UI standards? Isn't this supposed to be a button??

Your purchase is downloading. Finally. Mutter mutter Apple mutter.

...5 mins passes...

"Pa?? I'm bored with this game. Can I try this one?"

"Fine, okay". Click Buy.

Enter Apple ID password

.

.

.

Angry, from Disney's Inside Out


How Many Hours

11 Nov, 2017

Xing Y writes:

This is Xing Yanchao from the city of Qingdao, Shandong province, China, a big beautiful coastal city with 7 million citizens. I'm very interested in teaching kids to program, and plan to choose your book as the teaching material (In Chinese, ^_^). The kids may be between 8~12, how many hours do you suggest for us to finish the whole book?

Thank you in advance!

I think at least an hour a chapter for Part 1 of the book, but the chapters on functions, modules, classes and objects will probably take a bit longer. 12-15 hours is probably reasonable to cover most of Part 1 in a classroom setting, especially considering there should be a bit of time for kids to play around and try things for themselves, rather than following it exactly. Learn through play is important, particularly with a subject that can be pretty dry. Parts 2 and 3 are more difficult to estimate. I would actually suggest to just use Part 1 in the class, then let the kids come up with projects for themselves, and use the last two parts of the book as a reference (for example, let them create something for themselves, but use chapters 13-18 to figure out some of what they decide to do). Just a thought.


Multiplying Strings

11 Oct, 2017

Robin L writes (excerpted):

I am trying to teach myself how to code and thought this was a good place to begin. I am having trouble with the "multiplying strings" section. I don't know anyone else who codes so I am hoping that you are still available at this email. This is the part about printing a letter in the shell. For some reason when I run mine the "print()" keeps actually printing "()".

Can you please help me figure out what I am doing wrong?

There's a pretty major difference between printing with older versions of Python (Python2.7 and earlier) and newer versions (Python3 and later). In Python2, print is a statement, which means this works fine:

print "hi there"

If you try that in Python3, you'll get an error:

print "hi there"
  File "<stdin>", line 1
    print "hi there"
               ^
SyntaxError: Missing parentheses in call to 'print'

That's because print in Python3 is a function not a statement.

Why does that make a difference? In Python2, this code...

print()

...is a print statement followed by an empty tuple. You're effectively telling Python to "print this empty tuple", and by quirk of the way the print statement works, you get (). The exact same code in Python3 is a function name (print) followed by an open bracket, no parameters, and a closing bracket. You're providing no parameters and the function prints nothing as a consequence. And that, basically, is the difference.

Cutting a long story short - all you're doing wrong is running an older version of Python. Check chapter one, and follow the instructions to install Python3, and the code will work as you expect.


Stickman Refusing To Move

17 Jul, 2017

Haran R writes:

I tried out the code for the two games and have successfully run the first game (bounce). The second game however did not run like how i wished it to. I followed the book’s instructions to the letter, used the GIMP software to create the images, saved it in a directory and saved the code in the same directory. The graphics came out fine but unfortunately I have not been able to get the stickman to move. I have followed the coding in the book to the letter and have checked my code against the coding in the book multiple times and i can see no mistakes.

The problem is with the indentation in your Stick Man class. If you look at the indentation of your code...

indentation 1

and then compare with mine...

indentation 2

...hopefully you'll see where you've gone wrong (if it's not immediately obvious, take a look at the vertical line coming down from the animate function in each of the code samples, and you'll see where the indentation isn't right). When I fixed the indentation on your code, it worked perfectly -- so you were almost there.

Hope that helps.


Tcl Error

12 May, 2017

丁明 writes (edited for spelling):

In your book <<python for kids>> chapter 13, when I run the program, the python shell has a error I can't understand. my python version 3.6.0. Thank you for your reply!!

error.png

I'm not sure if the Chinese edition has captured the text on page 199 of the English version of the book:

You may see error messages written to the shell when you close the game window. This is because when you close the window, the code is breaking out of the while loop, and Python is complaining about it.

The is exactly the error you are seeing when you run that code and then close the window. You are stopping (interrupting) Python while it is running the code, and an error message is displayed as a consequence.

Basically, you can ignore the message, but if you want to know how to get rid of it for good, one option is to replace the loop at the bottom:

while True:
    ball.draw()
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)

...with this...

try:
	while True:
	    ball.draw()
	    tk.update_idletasks()
	    tk.update()
	    time.sleep(0.01)
except TclError:
	pass

You can find more about error handling here: https://wiki.python.org/moin/HandlingExceptions


Windows 10

09 Apr, 2017

I've come across some uncorroborated reports that some of the instructions, or examples, in Python for Kids don't work with Windows 10. Uncorroborated because it's unfortunately nothing more than "it don't work". Not spectacularly useful, so I've finally gotten around to installing Windows 10 in VirtualBox to test this out.

Instructions for Python installation remain pretty much the same, except that the latest version of Python is now 3.6, whereas on the last printing of PfK, it was 3.5. The results of installation aren't too dissimilar to Windows 7 either:

windows-10 start menu (small image)

I cherry-picked a few of the code samples at the beginning of the book to test, but wasn't expecting any of those to be a problem (they weren't), and then went through the more complicated code (turtle, tkinter) in the rest. Everything works as expected, except there is a little bit of graphical weirdness in the Bounce game (chapters 13, 14) where the ball seems to deform as it moves. I'm pretty certain this is an artifact of using Windows inside VirtualBox (I've never found animated graphics to work particularly well when you're in an OS inside an OS) - it's certainly not a problem in Linux or on a Mac. But interested to hear if anyone else has experienced the same issue on Windows:

Deformed ball


That's pants!

06 Apr, 2017

Lee writes:

I'm not fully understanding the HugeHairyPants program on pages 72-73 of Python For Kids. I initially thought that the loop would produce "huge huge hairy hairy pants pants," reasoning that the program would assign the first value to i, then the identical value to j, and continue the loop. So why is the variable j assigned all of the values? My thought was that the program commands i to be the first variable ('huge'), then stops there because the variable j is introduced next. Since there is no other variables after j, it then gets assigned every variable. Is this correct? (It doesn't sound right to me, though.)

So let's break the code down a bit more then. Here's the list...

hugehairypants = ['huge', 'hairy', 'pants']

...and then the first two lines of the loop code:

for i in hugehairypants:
	print(i)

If we run this code right now we get:

huge
hairy
pants

Each time the value in i is (effectively) replaced with the next value in the list (it's actually not quite as simple as that, but it can be easier to think of it that way when you start programming).

It's important to remember that every time we loop here, we're executing all the statements in the block of code - that's the indented part. And that's why if we look at the original example...

for i in hugehairypants:
	print(i)
	for j in hugehairypants:
		print(j)

...it first executes print(i), then it executes the second for-loop - that's looping over the hugehairypants list again, calling print(j) three times, then back to print(i) again, and so on. If we just look at the print statements Python is executing in these two loops, this is what it looks like:

print(i) # first for-loop - the value in i is now 'huge'
print(j) # second for-loop - the value in j is now 'huge'
print(j) # second for-loop - the value in j is now 'hairy'
print(j) # second for-loop - the value in j is now 'pants'
print(i) # first for-loop - the value in i is now 'hairy'
print(j) # second for-loop - the value in j is now 'huge'
print(j) # second for-loop - the value in j is now 'hairy'
print(j) # second for-loop - the value in j is now 'pants'
print(i) # first for-loop - the value in i is now 'pants'
print(j) # second for-loop - the value in j is now 'huge'
print(j) # second for-loop - the value in j is now 'hairy'
print(j) # second for-loop - the value in j is now 'pants'

If you need something more visual, I suggest drawing two rectangles on a piece of paper with 3 cells. Write the 3 values from the list in the cells (obviously it's not really two lists, but easier this way). Get two small coins; the first coin marks the value in i, the second coin marks the value in j. Work through the code as though you were running it yourself - move each coin to show how the value changes as we loop:

Visual guide


Epic Amazon Fail

22 Mar, 2017

Frankly this is bizarre, but if you're looking for Python for Kids, I suggest you don't buy on Amazon for the moment:

Expensive!! (small image)

Much as I'd like to be getting a cut of that price, I somehow doubt I'm getting anything -- and you're possibly getting a poor quality knock off, going by this:

https://twitter.com/billpollock/status/844030960333152256

(Some more discussion on Hacker News here: https://news.ycombinator.com/item?id=13924546)

Barnes and Noble looks to be a safer option - and you can still buy directly from No Starch Press of course.

Further update: Inc.com "Amazon's Tepid Response to Counterfeiters Frustrates Sellers"