event handling in classes?

Nick Belshaw nickb at earth.ox.ac.uk
Mon Jun 7 07:57:31 EDT 1999

bgue at my-deja.com wrote:

> Hi, I'm stumped on how to accomplish event handling with a Tkinter app
> that's a class. I didn't find anything on a Dejanews search either...can
> anybody tell me what the following example is doing wrong?
> from Tkinter import *
> class gui(Frame):
>   def __init__(self, parent=None):
>     Frame.__init__(self, parent)
>     self.grid()
>     self.bind("<Key>", self.callback)
>     self.str = ""
>     self.mainloop()
>   def callback(self, event):
>     print event.char
>     self.str = self.str + event.char
> g = gui()
> -----

I don't see any replies so I'll try a little clumsy help.

Your code seems a bit confused so if I modify it slightly....
from Tkinter import *

class gui(Frame):
  def __init__(self, parent=None):
    self.test_widget1 = Canvas(parent,width=50,height=50)
    self.test_widget1.bind('<1>', self.callback)

    self.test_widget2 = Text(parent,width=10,height=10)
    self.test_widget2.bind('<Key>', self.callback)

  def callback(self, event):
    print event

Main = Tk()
g = gui(Main)
Same class approach but I have initialised a master-window with Tk() and
it to the instance on creation and finally started the Tk.event-loop
outside the instance with Main.mainloop()

Your main problem is with the widget bindings. You can only bind things to
a widget that the widget can recognise.

So the Canvas will recognise the mouse '<1>' press but if you bind a
<KeyPress> it will not see it.
A Text widget will then see the <Key> event ok of course.

You had a Frame which might take entry and motion bindings (not sure -
maybe none) but a Frame is a holder for other widgets.

Anyway - hope that sets you on the right track.

For more info try



More information about the Python-list mailing list