<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-2" http-equiv="Content-Type">
  <title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
So, in the following line<br>
<pre wrap="">self.can.bind("&lt;ButtonRelease-1&gt;",lambda x:self.handler(x,'release'))</pre>
the event-handler will call handler(event, 'release') when the
mousebutton is released, but the 'self' reference is automatically
passed over, so the result will be the handler(self,event, 'release')
call.<br>
<br>
Correct me, if I'm wrong.<br>
<br>
<blockquote cite="mid44EA0C7E.1040505@gmail.com" type="cite">
  <pre wrap=""><hr size="4" width="90%">
#!/usr/bin/python

# This program implements &lt;B1-motion&gt;.  it was originally written by
#Zsiros Levente.  all rights of this modified version go to him :)

from Tkinter import *

class ButtonHandler(object):
    def __init__(self):
        #our self.mousedown variable is what we'll use to check the state
        #of the button, since we're going to be passing a copy of 'self'
        #around, we don't have to deal with scoping of the variables.
        #I.E. self.mousedown is global to functions in the class
        #that accept a 'self' argument.
        self.mousedown = 0
        
        #we make the window normally. note all these are 'self' variables
        #so we can change them easily elsewhere in the class.
        self.root = Tk()
        self.root.geometry('600x500+200+200')
        self.label = Label(self.root, text=str(self.mousedown))
        self.can = Canvas(self.root, width='500', height='400', bg='white')
        #lambda is a way we can add extra arguments to a function.
        #since the callback of bound events is only a single argument,
        #we use 'lambda x' to get the 'event' instance, and pass it
        #along with another string identifying which event it came from.
        #this may or may not be necessary, but it's cool and it
        #makes the handler function make more sense.
        #also, we only need one handler function this way.
        self.can.bind("&lt;Motion&gt;",lambda x:self.handler(x,'motion'))
        self.can.bind("&lt;Button-1&gt;",lambda x:self.handler(x,'press'))
        self.can.bind("&lt;ButtonRelease-1&gt;",lambda x:self.handler(x,'release'))
        self.label.pack()
        self.can.pack()
        self.root.mainloop()
        
    def handler(self,event,x):
        #the first two clauses of the if-elif branch implement your
        #'press' and 'release' functions.
        if x == 'press':
            self.mousedown = 1
        elif x == 'release':
            self.mousedown = 0
        elif x == 'motion':
            if self.mousedown:
                #you could do something really cool here, like store the time
                #that the button was last pressed, and increase the radius of the circle
                #depending on how long it's been since then.
                r = 5
                self.can.create_oval(event.x-r, event.y-r, event.x+r, event.y+r, fill="orange")
        self.label.config(text=str(self.mousedown))
        

#we create an instance of the class which automatically
#calls the '__init__' method.
x = ButtonHandler()
  </pre>
</blockquote>
<br>
</body>
</html>