[Tutor] tkinter canvas

Kent Johnson kent37 at tds.net
Thu Jan 15 13:24:29 CET 2009


On Thu, Jan 15, 2009 at 12:41 AM, Mr Gerard Kelly
<s4027340 at student.uq.edu.au> wrote:

> I want to be able to bind these boxes to an event - so that I can either
> click on them, or hold the mouse cursor over them, and have them change
> color.

Here is a version of your program that binds the Enter and Leave
events to each box and changes the box color when the mouse is over
it:

#########################

from Tkinter import *

master = Tk()

numboxes=6

width=40*(numboxes+2)
height=200
w = Canvas(master, width=width, height=height)
w.pack()

size=width/(numboxes+2)

box=[0]*numboxes

def enter(e, i):
    e.widget.itemconfigure(box[i], fill='red')

def leave(e, i):
    e.widget.itemconfigure(box[i], fill='blue')

for i in range(numboxes):
    box[i]=w.create_rectangle((1+i)*40, 40, (2+i)*40, height-40, fill="blue")
    w.tag_bind(box[i], '<Enter>', lambda e, i=i: enter(e, i))
    w.tag_bind(box[i], '<Leave>', lambda e, i=i: leave(e, i))

mainloop()

#######################

The 'i=i' in the lambda is needed due to the (surprising) way that
variables are bound to closures; without it, every event would be
bound to the same value of i. Some explanation here:
http://code.activestate.com/recipes/502271/

Kent


More information about the Tutor mailing list