469,909 Members | 1,617 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,909 developers. It's quick & easy.

before I forget it...Tkinter XMas Graphics

kudos
127 Expert 100+
Expand|Select|Wrap|Line Numbers
  1. import Tkinter
  2. import random
  3.  
  4. root = Tkinter.Tk()
  5. w = Tkinter.Canvas(root, width=400, height=300, background="#000000")
  6. w.create_text(200,150,text="Happy Christmas 2006",font="Arial 20",fill="#ff0000")
  7. w.create_text(200,170,text="from kudos",font="Arial 12",fill="#00ff00")
  8. w.pack()
  9.  
  10. flake = [];
  11. moves = []
  12. for i in range(50):
  13.  flake.append(w.create_text(random.randrange(400),random.randrange(300),text="*",fill="#ffffff",font="Times 30"))
  14.  moves.append([0.04 + random.random()/10,0.7 + random.random()])
  15. try:
  16.  while 1:
  17.   for i in range(len(flake)):
  18.    p = w.coords(flake[i])
  19.    p[0]+=moves[i][0]
  20.    p[1]+=moves[i][1]
  21.    w.coords(flake[i],p[0],p[1])
  22.    if(p[1]>310):
  23.     w.coords(flake[i],random.randrange(400),-10)
  24.    root.update_idletasks() # redraw
  25.    root.update() # process events
  26. except:
  27.  pass
  28.  
run it on your computer..
-best wishes kudos
Dec 14 '06 #1
6 2311
bartonc
6,596 Expert 4TB
Very cool! Thanks kudos. Happy Christmas to you, too.
Nice, elegant piece of software, my friend. Keep posting,
Barton
Dec 15 '06 #2
bartonc
6,596 Expert 4TB
Expand|Select|Wrap|Line Numbers
  1. import Tkinter
  2. import random
  3.  
  4. root = Tkinter.Tk()
  5. w = Tkinter.Canvas(root, width=400, height=300, background="#000000")
  6. w.create_text(200,150,text="Happy Christmas 2006",font="Arial 20",fill="#ff0000")
  7. w.create_text(200,170,text="from kudos",font="Arial 12",fill="#00ff00")
  8. w.pack()
  9.  
  10. flake = [];
  11. moves = []
  12. for i in range(50):
  13.  flake.append(w.create_text(random.randrange(400),random.randrange(300),text="*",fill="#ffffff",font="Times 30"))
  14.  moves.append([0.04 + random.random()/10,0.7 + random.random()])
  15. try:
  16.  while 1:
  17.   for i in range(len(flake)):
  18.    p = w.coords(flake[i])
  19.    p[0]+=moves[i][0]
  20.    p[1]+=moves[i][1]
  21.    w.coords(flake[i],p[0],p[1])
  22.    if(p[1]>310):
  23.     w.coords(flake[i],random.randrange(400),-10)
  24.    root.update_idletasks() # redraw
  25.    root.update() # process events
  26. except:
  27.  pass
  28.  
run it on your computer..
-best wishes kudos
I do, howerver, have one critique:
The naked except opens the door to bad things (especially when all you do is pass). If, for example, you should run out of memory (or something along those lines) your loop will keep running, which could be very bad indeed. The best practice is to narrow the focus of any try block to errors that you WANT to handle, then let built-in error handling take over. If you really want to catch all error that can possibly occur (naked except), then you should (at least) break out of the loop. Typically, this is called "over wrapping" the try block. Otherwise, I really like the graphics and the simplicity of you code.
Dec 15 '06 #3
kudos
127 Expert 100+
Very true. I wrote this at the end of the day at work (+ I hardly ever use Tkinter)

This should be better:

Expand|Select|Wrap|Line Numbers
  1. import Tkinter
  2. import random
  3.  
  4. root = Tkinter.Tk()
  5. w = Tkinter.Canvas(root, width=400, height=300, background="#000000")
  6. w.create_text(200,150,text="Happy Christmas 2006",font="Arial 20",fill="#ff0000")
  7. w.create_text(200,170,text="from kudos",font="Arial 12",fill="#00ff00")
  8. w.pack()
  9.  
  10. flake = [];
  11. moves = []
  12. for i in range(50):
  13.  flake.append(w.create_text(random.randrange(400),random.randrange(300),text="*",fill="#ffffff",font="Times 30"))
  14.  moves.append([0.04 + random.random()/10,0.7 + random.random()])
  15. try:
  16.  while 1:
  17.   for i in range(len(flake)):
  18.    p = w.coords(flake[i])
  19.    p[0]+=moves[i][0]
  20.    p[1]+=moves[i][1]
  21.    w.coords(flake[i],p[0],p[1])
  22.    if(p[1]>310):
  23.     w.coords(flake[i],random.randrange(400),-10)
  24.    root.update_idletasks()
  25.    root.update()
  26. except TclError:
  27.  pass
  28.  
-kudos


I do, howerver, have one critique:
The naked except opens the door to bad things (especially when all you do is pass). If, for example, you should run out of memory (or something along those lines) your loop will keep running, which could be very bad indeed. The best practice is to narrow the focus of any try block to errors that you WANT to handle, then let built-in error handling take over. If you really want to catch all error that can possibly occur (naked except), then you should (at least) break out of the loop. Typically, this is called "over wrapping" the try block. Otherwise, I really like the graphics and the simplicity of you code.
Dec 15 '06 #4
bartonc
6,596 Expert 4TB
Very true. I wrote this at the end of the day at work (+ I hardly ever use Tkinter)

This should be better:

Expand|Select|Wrap|Line Numbers
  1. import Tkinter
  2. import random
  3.  
  4. root = Tkinter.Tk()
  5. w = Tkinter.Canvas(root, width=400, height=300, background="#000000")
  6. w.create_text(200,150,text="Happy Christmas 2006",font="Arial 20",fill="#ff0000")
  7. w.create_text(200,170,text="from kudos",font="Arial 12",fill="#00ff00")
  8. w.pack()
  9.  
  10. flake = [];
  11. moves = []
  12. for i in range(50):
  13.  flake.append(w.create_text(random.randrange(400),random.randrange(300),text="*",fill="#ffffff",font="Times 30"))
  14.  moves.append([0.04 + random.random()/10,0.7 + random.random()])
  15. try:
  16.  while 1:
  17.   for i in range(len(flake)):
  18.    p = w.coords(flake[i])
  19.    p[0]+=moves[i][0]
  20.    p[1]+=moves[i][1]
  21.    w.coords(flake[i],p[0],p[1])
  22.    if(p[1]>310):
  23.     w.coords(flake[i],random.randrange(400),-10)
  24.    root.update_idletasks()
  25.    root.update()
  26. except TclError:
  27.  pass
  28.  
-kudos
I like it! It would have taken me a while to figure on using that error type. Thanks kudos. The critique is more for the benefit of others reading this.

But what happens if you get a tcl error? No window? No way to stop it?
These are mostly academic questions because (as you say) you don't us Tk much, but good for us to think about. I'm not actually going to break my tk installation to test it.
Dec 15 '06 #5
kudos
127 Expert 100+
Hi,
yeah true, it would be a problem if the try except would be inside the while loop, but since it outside, I guess the only Tclerror you going to get is when the window is closed. But I really haven't used Tcl much, not even when programming applications on IRIX and Solaris (used Xlib)

Expand|Select|Wrap|Line Numbers
  1. import Tkinter
  2. import random
  3.  
  4. root = Tkinter.Tk()
  5. w = Tkinter.Canvas(root, width=400, height=300, background="#000000")
  6. w.create_text(200,150,text="Happy Christmas 2006",font="Arial 20",fill="#ff0000")
  7. w.create_text(200,170,text="from kudos",font="Arial 12",fill="#00ff00")
  8. w.pack()
  9.  
  10. flake = [];
  11. moves = []
  12. for i in range(50):
  13.  flake.append(w.create_text(random.randrange(400),random.randrange(300),text="*",fill="#ffffff",font="Times 30"))
  14.  moves.append([0.04 + random.random()/10,0.7 + random.random()])
  15. try:
  16.  while 1:
  17.   for i in range(len(flake)):
  18.    p = w.coords(flake[i])
  19.    p[0]+=moves[i][0]
  20.    p[1]+=moves[i][1]
  21.    w.coords(flake[i],p[0],p[1])
  22.    if(p[1]>310):
  23.     w.coords(flake[i],random.randrange(400),-10)
  24.    root.update_idletasks()
  25.    root.update()
  26. except Tkinter.TclError:
  27.  pass
  28.  
(there is a tiny fix)

-kudos



I like it! It would have taken me a while to figure on using that error type. Thanks kudos. The critique is more for the benefit of others reading this.

But what happens if you get a tcl error? No window? No way to stop it?
These are mostly academic questions because (as you say) you don't us Tk much, but good for us to think about. I'm not actually going to break my tk installation to test it.
Dec 15 '06 #6
bartonc
6,596 Expert 4TB
Dang! You got me! I missed that. I wish you had pointed that out when I started this rant. Now I have to go and take it all back. You are always one step ahead of me. Keep it up.
Dec 15 '06 #7

Post your reply

Sign in to post your reply or Sign up for a free account.

Similar topics

7 posts views Thread by John Slimick | last post: by
7 posts views Thread by SeeBelow | last post: by
5 posts views Thread by Andrew | last post: by
8 posts views Thread by Erik Johnson | last post: by
5 posts views Thread by Ben Kovitz | last post: by
2 posts views Thread by David Lees | last post: by
kudos
8 posts views Thread by kudos | last post: by
kudos
reply views Thread by kudos | last post: by
1 post views Thread by Waqarahmed | last post: by
reply views Thread by Salome Sato | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.