[Tkinter-discuss] Creating a new widget class

Ron Longo ron.longo at cox.net
Tue Aug 5 23:45:16 CEST 2008


There are two ways to create your own widgets with Tkinter: subclass from an 
existing widget or construct your new widget in a Frame.  Subclassing from a 
Frame is the more general method.  Subclassing an existing widget is usually 
only useful if you are creating a specialized version of an existing widget. 
If your widget is a composite of two or more existing widgets (often called 
a megawidget), you should almost always use the Frame approach. 
Alternatively you can use a widget-building framework such as PMW.

Here's how to get started:  In your constructor you first initialize the 
superclass then create your childwidgets.  The parent of the subwidgets is 
self.

class ScrolledList( Tkinter.Frame ):
   def __init__( self, parent, **options ):
      Tkinter.Frame.__init__( self, parent, **options )

      self._list = Tkinter.List( self )
      self._scrollbar = Tkinter.Scrollbar( self )

      self._list.pack( side=Tkinter.LEFT )
      self._scrollbar.pack( side=Tkinter.LEFT )


This allows your widget to behave like any other widget.  That is to use 
your widget, you construct it:

   myWidgetInstance = ScrolledList( aParentWidget, ... )

Then you pack, grid or place it to display it.

   myWidgetInstance.pack( )

If you want to allow your widget to handle its own custom widget options, 
you need to pull these options out of the **options argument before calling 
Tkinter.Frame.__init__( ... ).

If you don't like the .pack() methods being in __init__, you could override 
pack(), grid() and place() and pack the list and scrollbar there instead.

Hope this helps


----- Original Message ----- 
From: "vtcodger" <donaldkenney at gmail.com>
To: <tkinter-discuss at python.org>
Sent: Sunday, August 03, 2008 5:34 PM
Subject: [Tkinter-discuss] Creating a new widget class


>
> I wonder if someone who understands Python and Tkinter a bit better than I
> could help me out.  Basically, I'm trying to encapsulate the kind of messy
> stuff associated with setting up a listbox with a scrollbar in a Python
> class.  From my probably incredibly naive point of view, it doesn't look 
> too
> hard.
>
> class ScrolledList(Frame,Listbox,Scrollbar) :
>  #At this point we have a template for objects that have all the
>  #attributes and methods of Frames,Listboxes,and Scrollbars.  For
>  #names that occur in all, the Frame version takes precedence over
>  #the Listbox version and that in turn takes precedence over
>  #Scrollbar version
>
>  def __init__ (self, Tkobject, height=4, width=50) :
>    #This code is executed whenever a new scrolled list object is
>    #created (instantiated)
>    self.f = Frame(Tkobject)
>    s = Scrollbar(self.f,orient=VERTICAL)
>    self.l = Listbox(self.f, height=height, width=width,
> yscrollcommand=s.set, exportselection=0)
>   #We have now created a frame, scrollbar and listbox
>
>    s.config(command=self.l.yview)
>    s.pack(side=RIGHT, fill=Y); self.l.pack()
>   #And configured the listbox and scrollbar to interact
>
> And it creates a Tkinter object with a gazillion attributes. 
> Unfortunately
> tk isn't one of them.  When I try to invoke the methods, I am informed 
> that
> the new object has no 'tk' attribute.  That's correct.  It doesn't.
> Apparently I have failed to call some necessary constructor.  But which?
>
> Maybe I'm close to having it right because if I create a grid attribute in
> the class and pass the parameters to the frame grid method, the scrolled
> listbox can be configured and displayed.
>
>  def grid(self,row=90,column=1,rowspan=5,columnspan=4,sticky=W) :
>
> self.f.grid(row=row,column=column,rowspan=rowspan,columnspan=columnspan,sticky=sticky)
>
> What am I doing wrong, or not doing right?
> -- 
> View this message in context: 
> http://www.nabble.com/Creating-a-new-widget-class-tp18802754p18802754.html
> Sent from the Python - tkinter-discuss mailing list archive at Nabble.com.
>
> _______________________________________________
> Tkinter-discuss mailing list
> Tkinter-discuss at python.org
> http://mail.python.org/mailman/listinfo/tkinter-discuss 



More information about the Tkinter-discuss mailing list