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.pack()
    self.test_widget1.bind('<1>', self.callback)

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

  def callback(self, event):
    print event

Main = Tk()
g = gui(Main)
Main.mainloop()
#----------------------------------------
Same class approach but I have initialised a master-window with Tk() and
passed
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

http://www.pythonware.com/library.htm

cheers
Nick/Oxford






More information about the Python-list mailing list