Inherit Class Dynamicly
Laura Creighton
lac at strakt.com
Tue Feb 5 10:06:25 EST 2002
> Hi, everybody,
>
> from Tkinter import *
> class NewWidget:
> ...
> def __init__(self, widget_name = "Button", **dict):
> # What is needed here to make the new born object(self)
> # behavior like both the class specified by widget_name
> # and NewWidget?
>
> Thanks from
>
> Xiao-Qin
>
I do it like this:
import Tkinter
class MyButton(Tkinter.Button): # single
"""
This is a simple wrapper for the Tkinter Button, which just makes
an alias, 'data' for 'text' in the button.
"""
def __init__(self, parent, **kw):
"""
Function name: __init__
Description: Initialise MyButton.
Arguments: parent - the parent frame,
**kw - a dictionary containing all the option=value
pairs as {opt1:val1, opt2:val2 ...} If you put
things in here which are not valid options to a
Tkinter.Button you must remember to del them
from the dictionary before you call
Tkinter.Button.__init_
"""
self.parent = parent
if kw.has_key('data'):
kw['text'] = kw['data']
del kw['data']
Tkinter.Button.__init__(self, parent, **kw)
#This assumes you have 2.0 or better. If you have 1.5.2
#apply(Tkinter.Button.__init__, (self, parent), kw)
# go add some more methods here as part of MyButton. Here is a
# good one for me to add since I just made an alias.
def cget(self, property):
"""
Function name: cget
Description: Add return values for the additional attribute
data in case somebody wants to find it this way.
Arguments: None
Returns: the data that is contained in the widget
"""
if property == 'data':
return(Tkinter.Button.cget(self, 'text'))
else:
return(Tkinter.Button.cget(self, property))
###########################################################
if __name__ == '__main__':
root = Tkinter.Tk()
w = MyButton(root, width= 30, fg='green',
text='This is a very green button')
widgetList = (
['show', lambda x = w: x.grid(row=0, col=0, columnspan=5)],
['pink', lambda x = w: x.configure(fg='pink')],
['yellow', lambda x = w: x.configure(bg='yellow')],
['Exit', root.destroy],
)
column = 0
for txt, cmd in widgetList:
button = Tkinter.Button(root, text=txt, command=cmd)
button.grid(row=1, col=column, sticky='w')
column += 1
root.mainloop()
----------------------------------------------------
If you want multiple inheritance, that is fine too, i.e.
class MyButton(MyWidgetMixin, Tkinter.Button):
but somewhere in the __init__ you need to do this
MyWidgetMixin.__init__(self, whatever_you_want)
---------------------------
Laura Creighton
More information about the Python-list
mailing list