[Tkinter-discuss] Creating a new widget class
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
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.
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
> 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.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.
> tk isn't one of them. When I try to invoke the methods, I am informed
> 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) :
> What am I doing wrong, or not doing right?
> View this message in context:
> Sent from the Python - tkinter-discuss mailing list archive at Nabble.com.
> Tkinter-discuss mailing list
> Tkinter-discuss at python.org
More information about the Tkinter-discuss