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.


Pygame or App Development using Kivy or XCode?

19 May, 2018

Sunil writes:

I would, first of all, like to thank you for the amazing book you have written "Python for Kids"
It's really helped my nephew learn Coding in a very exciting and fun way.
He is now very keen on continuing with Python. He is 8.
But at this point, I do not know what would be the next set of things to teach him. Should we proceed with learning Pygame or App Development using Kivy or XCode. I am a little confused on this matter.
I tried a bit of reading online, but it did not help my decision making.

What would you suggest is the best Python learning path for an 8-year-old after having followed your book.

I'm quite partial to the idea of Pygame as a natural progression from the games in the book. Adapting the Bounce or Stickman game to use Pygame, instead of tkinter, seems like a good way to get started, and then Pygame has support for audio (mixer) and joystick modules, so there's opportunities to enhance and extend the games to add new features. This would be building on learning from the book, which I think is a nice way to move forward. It's certainly going to be the easiest way to get some instant feedback as well (since it's not hard to get up-and-running), so thumb's up from that perspective.

I don't know a lot about Kivy - so I can't really comment on how suitable it would be for an 8 year old -- but even if it proved too difficult, if he's interested in mobile apps, then I don't think that time would be wasted.

XCode will probably mean learning a new language (depending on what your nephew wants to do with it). If iOS apps, then the options are Objective-C or Swift -- which is not to say you're entirely limited to those languages, but you're going to find the most community support with one of the primary languages. Of the two, Swift is the most approachable (IMO), but I still wouldn't call that easy going for a child to pick up.

So with very limited experience in the other two options, I guess my personal preference would be Pygame, then Kivy, finally XCode. Do let me know how you get on...

Reference links for other readers:


A question about tkinter update

09 May, 2018

Feng writes:

I bought a chinese version of your book. when i tried the paddle ball at this step: 'Bounce (example 4) - ball moving up and down' at the first part of the code, you add a line tk.update(). I cannot see why this is necessary, since there are no balls moving at all. Then, i comment it with a '#'.

Now, it comes with a problem, i failed to see the ball move down, it seems stuck at the top line of the canvas. I tried to print the variable 'pos', and it shows as follows:
------------------(some part of the outcome)
[255.0, 1.0, 270.0, 16.0]
[255.0, 0.0, 270.0, 15.0]
[255.0, -1.0, 270.0, 14.0]
how did this happen, why the first 'tk.update()' cannot be omitted?

The first call to tk.update() isn't strictly necessary - but what it does do is to force a "wait" until all the Tk user interface events have been processed.

When you call pack to tell your Tk components to resize and display themselves in the right place, you're actually sending a message to a whole separate process (this is the Tk event loop). Let's imagine it took 1 minute for each component to set itself up, and you had 10 components in the window. If you called pack it wouldn't take 10 minutes to complete that function call -- it would actually complete almost instantly. Behind the scenes however, the components are busy re-arranging themselves to fit in the window (and in this imaginary scenario, that process would then take 10 minutes to complete).

Try running this code (create a file and run it in IDLE):

from tkinter import *
tk = Tk()
canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()
print(canvas.winfo_height())

You'll get 1. That's because the canvas hasn't finished rearranging itself by the time you call winfo_height. Now try typing the first 4 lines of the code into the IDLE shell -- wait a few seconds then enter the last line:

print(canvas.winfo_height())

Now you'll get 400 (i.e. 400 pixels high). Because you've given the canvas time to complete.

In summary, pack is saying "ok Tk components, re-arrange yourselves on the screen" and update is saying: "ok Tk, I want to wait for that to complete". Which is why, if you remove the update call, inside the __init__ function of the Ball class, it calculates a height of 1, and the code no longer works correctly.


Just in time?

01 Apr, 2018

Perhaps just in time for Google shutting down its goo.gl url shortener, here's a potential alternative: nimwhistle, an algorithmic URL shortener loosely based on the ideas in Whistle, but with a few minor modifications (URL patterns in the form of dir/YYYY/mm/dd/filename; 'favourite', fixed or non-standard URLs stored in a fixed-line-length file), and a CGI-based redirection service. 462KB compiled, Apache2 licensed. Not guaranteed for any purpose, because it was a hack-job/experiment, put together in a few hours.

Update: somewhat stupidly, forgot to mention, nimwhistle is already in use here (for example, https://jasonrbriggs.com/u/f1 redirects to Python for Kids)


Restarting the Bounce game (revisited)

04 Mar, 2018

Robin T writes (excerpted):

I am currently at chapter 14, i already made my first game called "Bounce". When the game is over, i want the user to push a button or a mouse click to restart the game. But i don't know how to do this.

Someone else asked a similar question a few years ago, so here's my post from back then, with some ideas about adding a restart button: "Restarting the game". In terms of creating a function to restart the game, you might want to use the canvas coords function to move the ball and paddle back to their starting position, and then set the values of all the other variables to the same as they started as well (for example, setting the hit_bottom variable to False; if you've added a score, setting the score back to zero; and so on). coords takes 5 parameters: the id of the object to move, the x and y position and the width and height of the object. So moving both objects back to their starting position might look something like this:

self.canvas.coords(self.paddle.id, 200, 300, 300, 310)
self.canvas.coords(self.ball.id, 245, 100, 260, 115)

Hopefully that helps.


Problem with paddle-ball animation

19 Feb, 2018

Hayden B writes:

I am trying to code the bouncing red ball in Chapter 13 but the animation is not working. I have checked the code, and it makes sense, but I am getting these errors when I run:

RESTART: C:\Users\rf\AppData\Local\Programs\Python\Python36-32\Files .py\paddleball.py Traceback (most recent call last):   File "C:\Users\rf\AppData\Local\Programs\Python\Python36-32\Files .py\paddleball.py", line 33, in <module>     ball.draw()   File "C:\Users\rf\AppData\Local\Programs\Python\Python36-32\Files .py\paddleball.py", line 15, in draw     self.canvas.move(self.id, self.x, self.y)   File "C:\Users\rf\AppData\Local\Programs\Python\Python36-32\lib\tkinter_init.py", line 2585, in move_ _    self.tk.call((self.w, 'move') + args) _tkinter.TclError: invalid command name ".!canvas"

...and the red ball gets "stuck" at the top "jiggling" but not bouncing or returning down as it is supposed to. I cannot figure out what the problem is. Can you help?

Your code is almost right, there's just one thing you've mistyped. Here's a snippet from my code:

canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()
tk.update()

And here's your code:

canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()
tk.update

Check the difference in the last line. Why do the missing brackets cause such a problem? The reason is that Python can't calculate the height of the canvas (400 pixels) until you call pack() and then update(). You are calling tk.update which is effectively just dumping information about the function, rather than calling the function itself. Here's what happens if I try that code:

>>> tk.update
<bound method Misc.update of <tkinter.Tk object .>>

And, because you aren't actually calling the update function, this line...

        self.canvas_height = self.canvas.winfo_height()

...actually results in canvas_height being 1 pixel, rather than 400. As a consequence, your ball then gets stuck jiggling at the top of the screen because both these if-statements end up being true:

        if pos[1] <= 0:
             self.y = 1
        if pos[3] >= self.canvas_height:
             self.y = -1

(so pos[1] ends up being less than or equal to 0, and pos[3] ends up being >= to the canvas_height)

By the way, you can ignore the error message -- that has nothing to do with your code. When you close the game window, your program is still trying to call the move function and so you get an error message because the canvas no longer exists (effectively).

Hope that helps.


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.