IDLE3 on Ubuntu

07 Sep, 2019

Chris K writes (excerpted):

I'm teaching myself and home educating my three young daughters at the same time. Just a little bit every day (excepting Sunday which is entirely reserved for pancakes and not inter-computery-things) . Thank you for providing the opportunity for me to introduce the subject of computer programming in a fun way.
Anyhow, we hit a snag early on that does not seem to get a mention on the publishers site or your blog. When instructed to search for IDLE on the Ubuntu software centre nothing of relevance was listed. I had one of the girls do it and she was very disappointed...
...I've done some homework and followed vitux.com/how-to-install-idle-python-ide-on-your-ubuntu instructions on installing idle3, which worked. So we are all set to go today.

I don't know how useful this feedback is to you but this is an opportunity to express my appreciation for all your hard work and skill, so I'm taking it.

The next re-print of Python for Kids will include updated instructions for installing IDLE3 on Ubuntu - which obviously doesn't help anyone reading the current print of the book. My steps are pretty similar to the link you've referenced:

snippet from the book

Thanks for the email - it's a good prompting to put something on my site, which others in the same position might come across.


Not the normal knock-off

02 Aug, 2019

Usually on Amazon, we see Python for Kids knock-offs which are an exact copy of the book, with cruddy printing and/or binding. No Starch have a clever binding which allows books to open flat, without falling apart after reading a couple of chapters (clever enough that a few people thought it was actually a failure in the glue) - so these were pretty obviously cheap copies, even without the often misprinted and missing pages.

However, an eagle-eyed reader recently notified No Starch of a new type of knock-off -- where they have slightly rewritten the text (I assume just enough to fool a copyright-checking algorithm), and included content from (I think) other sources, to make it even less likely that any automation would flag the book.

For example, here's an excerpt from Python for Kids...

pfk excerpt 1

And here's the dodgy knock off...

knockoff excerpt 1

Erm... what the heck is a "Trump String"?

Here's another one from PfK:

pfk excerpt 2

And here's the knock off again...

knockoff excerpt 2

Yeah... way to rewrite it to be more boooooooring, Book Pirates!

The code examples are pretty much exactly the same in the knock-off (at least the examples I checked) - if badly formatted (including misprinted wingdings characters and other artifacts).

So, the first part of the book is basically a slightly (and extremely poorly) rewritten knock-off of mine. The second part of the book has things like bubble sort, insertion sort and...

knockoff pagerank

...because every self-respecting kid needs to how to write a sorting algorithm (by just looking at the code) and how to use numpy and pandas for page-rank???

And from there, on to games like Hangman, but written with Python2 and incorrectly formatted as well...

knockoff hangman

A garbage knock-off, and 29 five-star reviews in a couple of weeks, no less (I assume paid for). Interestingly, I clicked through a few of the other reviews by those same reviewers and found more poorly written texts. It's an Amazonian (sic) nest of crappy Python books!

Tick tick tick. I wonder how long it'll take Amazon to catch on...


String formatting

22 Jul, 2019

Lou O writes:

Hi Jason, Read a few good reviews of your book on Amazon.
One of the reviews pointed out "The explanation of String formatting needs to be updated. We don't do embedded values using %s anymore. I recommend skipping the chapters on Turtle Graphics and tkinter. The introductory chapter on classes and objects is not bad, but the topic is beyond what most kids will need, and they should really focus on imperative / procedural programming first using just lists and dictionaries as their basic data structures."
And I was wondering if those points had been taken into account and updated since then.

In terms of string formatting, the reviewer is correct but, on the other hand, % formatting hasn't actually been deprecated yet. From the official Python 3 documentation:

The formatting operations described here exhibit a variety of quirks that lead to a number of common errors (such as failing to display tuples and dictionaries correctly). Using the newer formatted string literals, the str.format() interface, or template strings may help avoid these errors. Each of these alternatives provides their own trade-offs and benefits of simplicity, flexibility, and/or extensibility.

I have thought about updating the section on formatting though, just because using str.format is the more accepted/modern method -- but this will probably have to wait for a second edition, or perhaps the next major reprint.

In terms of classes and objects, I don't agree at all. When originally writing the book, I thought rather hard about whether it was worth going into the complexity of that topic and, in the end, came to the conclusion that there is too much in Python which is object-oriented, and would be more confusing to explain without at least covering the basics (IMHO).

And finally, in regard to the comment about skipping the chapters on turtle and tkinter... sure, if they want a dry book on programming fundamentals, with nothing fun for a kid to experiment with -- one that they will then put down 10 minutes after opening and never return to -- by all means, skip those chapters.

For everyone else: will your child use the turtle and/or tkinter modules in the future? Probably not. But are they a useful tool to learn how to use those fundamental programming concepts (without needing to install any complicated third party libraries)? Personally, I believe so.


Bouncing in Polski

08 May, 2019

Marzena writes:

I'm writing to you because neither me nor my 11-year old daughter with whom we're learning Python can figure out where the problem is. We get the following error:
 ================ RESTART: C:/Users/Enarpol/Desktop/brajan.py ================
 Traceback (most recent call last):
   File "C:/Users/Enarpol/Desktop/brajan.py", line 5, in <module>
     class Piłka:
   File "C:/Users/Enarpol/Desktop/brajan.py", line 20, in Piłka
     if pozycja[1] <= 0:
 NameError: name 'pozycja' is not defined
And the code is exactly like in the book (some words are in Polish, but I assume it's not a problem for you to trace the error despite of it)

Your problem problem is caused by indentation and the idea of "scope" - I guess you're using the Polish language version of the book, so I'm not sure of the correct page number, but in the English language version of the book the section on Variables and Scope (page 84) would be useful to re-read.

In short, here is the incorrect bit of your code:

    def rysuj(self):
        self.płótno.move(self.id, self.x, self.y)
        pozycja = self.płótno.coords(self.id)
    if pozycja[1] <= 0:
        self.y = 3

If I re-indent this with visible spaces, to show how it should look, hopefully you can see what you need to fix in the rest of your code:

    def rysuj(self):
        self.płótno.move(self.id, self.x, self.y)
        pozycja = self.płótno.coords(self.id)
    ␣␣␣␣if pozycja[1] <= 0:
    ␣␣␣␣    self.y = 3

Why does this make a difference? Because in the case of rysuj above, the variable pozycja is only visible within the function - or to be exact, within the block of code that makes up the function. And how do we create a block of code? Basically through indentation. Your if statement was at the same indentation level as def rysuj(self), so it wasn't part of the function and that's why you're getting the error name 'pozycja' is not defined.

Hope that helps.


Traditional Chinese

16 Mar, 2019

你 好!

traditional chinese translation cover

Available from Wu Nan Books.


Stickman Moves

31 Jan, 2019

Alex Z writes (edited):

I'm playing with the last chapter game, cf. the stickmangame7.py file. I'm a little confused about how the key presses are expected to cause the character [to] move.

If the player hits the right or left key, the character starts moving but keeps moving and doesn't stop unless [colliding] against a wall or a platform. Even jumping on a platform doesn't cause the stick figure to stop. This makes hard to climb to the top parts of the area. Is it the expected behavior of the game ?

I am not the first to experience this problem, see the folowing message on stackoverflow: How to move character only when key is pressed down Python

Yes, that is the expected behaviour of the game. The point is to make it more difficult to reach the top platform, so once the character starts running he doesn't stop, unless he collides with something. However, if you do want to change it so that the character only moves when the key is held down, there's a few fairly minor modifications you can make (which are discussed in that stack overflow article):

i. Add a new function to stop the character moving, by changing the value of the x variable to 0. So in the StickFigureSprite sprite class we add this new function:

class StickFigureSprite(Sprite):
    ...
    ...
    ...
    def stop_moving(self, evt):
        self.x = 0

ii. Now we need a way to call the new function. So we add two new key bindings to the __init__ function of the same class, and set the starting value of the x variable to 0 (it's currently set to -2 so that the stick figure starts running as soon as the game starts):

class StickFigureSprite(Sprite):
    def __init__(self, game):
        ...
        ...
        self.x = 0
        ...
        ...
        game.canvas.bind_all('<KeyRelease-Left>', self.stop_moving)
        game.canvas.bind_all('<KeyRelease-Right>', self.stop_moving)

So with these changes the game starts and the stick man won't move. When you hold the left or right key down, the x variable is set to -2 or 2 respectively which starts "him" moving. When you release the key, it sets the value back to 0, which stops him moving again.

You might notice one slight problem when running the game after this change - the stickman starts quickly and then slows down. This is caused by the keyboard repeating which then impacts the performance of the mainloop function in the Game class. This is an unfortunate side effect of the way the code for the game is written (the stickman code is not the standard way to handle animation with tkinter -- however it was written this way to hopefully make animation concepts, in programming, slightly easier for a child to understand).


PFK and iPython

27 Jan, 2019

Jobakhan writes (edited):

Using this code
import sys
def moon_weight():
    print('Please enter your current Earth weight')
    weight = float(sys.stdin.readline())
    print('Please enter the amount your weight might increase each year')
    increase = float(sys.stdin.readline())
    print('Please enter the number of years')
    years = int(sys.stdin.readline())
    years = years + 1
    for year in range(1, years):
        weight = weight + increase
        moon_weight = weight * 0.165
        print('Year %s is %s' % (years , moon_weight))

then it gives me this:
error in ipython
Why is this happening?

It looks like you're using iPython/Jupyter Notebook to run the examples in the book. Python for Kids wasn't specifically written to work with iPython (nor was the code actually tested with that app), which is why you're having issues. Having said that, I think many of the examples will work, but some, like the code you sent, will need modification.

In the case of the moon_weight function, it's using sys.stdin.readline() (that's the sys module, "standard input" object, readline function) to read input from the user running the program. There are a couple of ways to read command line input in Python - and in the case of Jupyter it looks like stdin doesn't behave the same way as the Python shell. I found the following in the Jupyter client documentation:

This pattern of requesting user input is quite different from how stdin works at a lower level. The Jupyter protocol does not support everything code running in a terminal can do with stdin...

So what's actually happening when you run that code? The function sys.stdin.readline() returns straight away with an empty string (''), and Python then throws an error when trying to convert that empty string to a floating point number. If you replace sys.stdin.readline() in the above code with input(), the program should then work in jupyter:

weight = float(input())
...
increase = float(input())
...
years = int(input())

iPad Pro and Pythonista

26 Jan, 2019

Lucia C writes:

I am currently reading your book but do not have access to a computer. I do however have my Ipad pro.

There is an app available called Pythonista 3, are you familiar with this app and would you recomend it to follow your book?

Unfortunately, Pythonista has it's own custom UI library, so I don't believe it supports turtle or tkinter -- the latter chapters of the book rely heavily on tkinter for graphics in the games. Without this you're going to struggle completing all the examples.

If you only have an iPad, a cheap option might be to purchase a Raspberry Pi (at time of writing a Pi starter kit is UK£51.99/US$79.99) and use that for your programming activities. While you'll initially need a monitor as well, if you want to stick with the iPad, it looks like it is possible to connect from the iPad to the Pi (so your iPad effectively becomes the monitor) using VNC -- more info can be found here in this instructables article.

Hope that helps.


Trouble with GIMP

29 Sep, 2018

Tom writes (excerpted):

I'm learning Python from your book and I'm finding it a great resource. However, I'm at the point where I'm creating the StickMan game and I'm having issues. I'm using an iMac running MacOS Sierra 10.12.6 The version of GIMP that I downloaded is 2.8.18. Specifically, I'm at Part III, chapter 15, "Creating the Game Elements-Preparing a Transparent Image". Steps 1 through 3 go well, but when I go to "Select -> All", there is no "All" in the "Select" menu. I am also having issues with the paintbrush as a dot. It shows up as a large square and will blot out most of the 27x30 image that I'm trying to paint. Gimp seems to be prompting me to add other layers, but I'm not clear as to how that will affect the image I'm trying to create.

I'm only using a slightly later version of GIMP than you at the moment (2.10), and I don't see any issues - though I'm not running Sierra, I doubt that makes a significant difference. For example, in terms of the Select menu, I can see All at the top:

Gimp Select menu

In terms of your problem with the brush, if you look at the brushes palette, the single pixel (1x1 square) is almost at the bottom:

Gimp Brushes Palette

(Not entirely sure what you're seeing, but hopefully those screenshots help?)

Finally, regarding layers in Gimp, those aren't necessarily an issue. When you export the image (as a gif or png or anything else) it should collapse the layers into one -- and even if you find them annoying, you can click on the top layer in the layers dialog, select the Layers menu, and then click Merge Down to collapse into the next layer in the list.


Modified IDLE

23 Sep, 2018

Dean B writes:

I'm on page 137 of your book Python For Kids (chapter 10). I noticed a sentence at the top of the page, and have a question on it. It says "This won't work if you're using the modified version of IDLE that we set up in Chapter 1." I didn't remember seeing anything in chapter 1 on a modified version of IDLE. I looked back through chapter 1, but still don't see anything on the matter.

Would you please tell me what page that is on? I'm more curious than anything. I was frustrated with the "New File" window so I did a search and found IDLEX extensions and installed that. It works quite well for me. I would like to know though how your modified version works.

I'm new to programming and after searching for a good programming language to start with I chose Python, and after looking through a lot of books I chose your book "Python For Kids". I’m a senior citizen and have found this book to be a great introduction to Python. Certainly not just for kids as long as the adults are okay with the kid like context. Works for me, and thanks for such a good book.

Apologies for the confusion there -- this was a miss when we updated the book for later versions of Python 3. When Python for Kids was released in 2013 (end of 2012), you needed to make a minor modification to the shortcut used for starting up IDLE, to turn off "subprocess mode". Without going into too much detail about what that is, effectively if you ran IDLE with subprocess mode on, some of the graphical examples (tkinter, etc) would cause the Shell to hang. This was fixed in a later version of the IDLE runtime, and I removed those instructions from the first chapter on installation -- but completely missed the reference on page 137. Thanks very much for letting me know and I've updated the errata here.