<!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("<ButtonRelease-1>",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 <B1-motion>. 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("<Motion>",lambda x:self.handler(x,'motion'))
self.can.bind("<Button-1>",lambda x:self.handler(x,'press'))
self.can.bind("<ButtonRelease-1>",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>