[Tkinter-discuss] Creating a new widget class

Fredrik Lundh fredrik at pythonware.com
Wed Aug 13 11:07:45 CEST 2008

Peter Milliken wrote:

> Well, here are some clues - the "multiple" inheritance doesn't seem to 
> work the way the manual *implies* it should i.e. multiple inheritance is 
> described as searching for methods in the first inheritance and then all 
> it's ancestors, then onto the next and all its ancestors and so on.

Tkinter widget instances are proxy objects that delegate method calls to 
an underlying Tk widget.  A widget instance can only be bound to a 
single Tk widget.

Multiple inheritance works as usual at the Tkinter class level, but that 
doesn't help if the widget instance is not bound to the right Tk object 
when you do a method call.

> To get an "insert" (Listbox) method on your class you need to invoke the 
> __init__ method on the super classes (sub-classes should always invoke 
> the initialisation of their super class anyway - so that is something 
> your class definition is definitely missing!) i.e.
>    Listbox.__init__(self)

That binds the widget to the underlying Tk listbox widget (see the code 
in Tkinter's BaseWidget for details).  After this call, any method calls 
will be forwarded to the Tk listbox.

 >    Listbox.__init__(self)
 >    Scrollbar.__init__(self)
 > And viola! ScrolledList now has the methods of Scrollbar - and "lost" 
 > the methods of Listbox.

After those calls, the widget instance ends up being bound to a Tk 
scrollbar widget.  There's no change in what methods the object has at 
the Python level, though.


More information about the Tkinter-discuss mailing list