]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Sun Jun 26 02:19:01 1994 Steen Lumholt (lumholt@login.dkuug.dk)
authorGuido van Rossum <guido@python.org>
Mon, 27 Jun 1994 07:55:12 +0000 (07:55 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 27 Jun 1994 07:55:12 +0000 (07:55 +0000)
* README: Doc fix.

* Dialog.py: tk_dialog wrapper widget.

* Tkinter.py: (Widget) Code moved from __init__ to _setup.

Sat Jun 25 00:27:24 1994  Steen Lumholt  (lumholt@login.dkuug.dk)

* Tkinter.py (Misc): selection_own and selection_own_get methods.
(Misc.winfo_toplevel): Return widget.

* kill.py: New demo.

* Tkinter.py: tk_menuBar method moved from Menu class to
Misc class.
(Scrollbar.get): Bug fix; self._getints not self.tk.getints.

Fri Jun 24 17:42:16 1994  Steen Lumholt  (lumholt@login.dkuug.dk)

* Tkinter.py
(Variable, StringVar, IntVar, BooleanVar): New classes.

* mklibapp: New shell script.

* Setup.in: moreButtons Tk extension support.

* tkintermodule.c (Tkapp_New): Remove #ifdef WITH_APPINIT.

* appinit.c (Tcl_AppInit): New file and function.

* Tkinter.py:
(Button): Dummy args in tk_* methods.
(Studbutton, Tributton): New widget by <tnb2d@cs.virginia.edu>;
morebuttons extension.

Thu Jun 23 22:22:43 1994  Steen Lumholt  (lumholt@login.dkuug.dk)

* tkintermodule.c (FileHandler): Make arg a tuple; bug found
by <tnb2d@cs.virginia.edu>.  Call the Python file handler
function with (file, mask) argument.  Fix a few of my refcnt bugs.

Lib/lib-tk/Tkinter.py
Lib/tkinter/Tkinter.py

index 7be94c75034699d36d753ffaf3c74bee7a57bdc9..4d2dd3ab1a1ebb0731309d73013fc29da1735b2f 100644 (file)
@@ -16,21 +16,72 @@ TupleType = type(())
 ListType = type([])
 CallableTypes = (FunctionType, MethodType)
 
+_default_root = None
+
 def _tkerror(err):
        pass
 
 class Event:
        pass
 
+_varnum = 0
+class Variable:
+       def __init__(self, master=None):
+               global _default_root
+               global _varnum
+               if master:
+                       self._tk = master.tk
+               else:
+                       self._tk = _default_root.tk
+               self._name = 'PY_VAR' + `_varnum`
+               _varnum = _varnum + 1
+       def __del__(self):
+               self._tk.unsetvar(self._name)
+       def __str__(self):
+               return self._name
+       def __call__(self, value=None):
+               if value == None:
+                       return self.get()
+               else:
+                       self.set(value)
+       def set(self, value):
+               return self._tk.setvar(self._name, value)
+
+class StringVar(Variable):
+       def __init__(self, master=None):
+               Variable.__init__(self, master)
+       def get(self):
+               return self._tk.getvar(self._name)
+
+class IntVar(Variable):
+       def __init__(self, master=None):
+               Variable.__init__(self, master)
+       def get(self):
+               return self._tk.getint(self._tk.getvar(self._name))
+
+class DoubleVar(Variable):
+       def __init__(self, master=None):
+               Variable.__init__(self, master)
+       def get(self):
+               return self._tk.getdouble(self._tk.getvar(self._name))
+
+class BooleanVar(Variable):
+       def __init__(self, master=None):
+               Variable.__init__(self, master)
+       def get(self):
+               return self._tk.getboolean(self._tk.getvar(self._name))
+
 class Misc:
        def tk_strictMotif(self, boolean=None):
                self.tk.getboolean(self.tk.call(
                        'set', 'tk_strictMotif', boolean))
-       def waitvar(self, name='VAR'):
+       def tk_menuBar(self, *args):
+               apply(self.tk.call, ('tk_menuBar', self._w) + args)
+       def waitvar(self, name='PY_VAR'):
                self.tk.call('tkwait', 'variable', name)
-       def setvar(self, name='VAR', value='1'):
+       def setvar(self, name='PY_VAR', value='1'):
                self.tk.setvar(name, value)
-       def getvar(self, name='VAR'):
+       def getvar(self, name='PY_VAR'):
                return self.tk.getvar(name)
        def getint(self, s):
                return self.tk.getint(s)
@@ -89,11 +140,14 @@ class Misc:
                self.tk.call('selection', 'get', type)
        def selection_handle(self, func, type=None, format=None):
                name = self._register(func)
-               self.tk.call('selection', 'handle',
-                            self._w, name, type, format)
-       #XXX def selection_own(self):
-       #       self.tk.call('selection', 'own', self._w)
-       def send(self, interp, cmd, *args): #XXX
+               self.tk.call('selection', 'handle', self._w, 
+                            name, type, format)
+       def selection_own(self, func=None):
+               name = self._register(func)
+               self.tk.call('selection', 'own', self._w, name)
+       def selection_own_get(self):
+               return self._nametowidget(self.tk.call('selection', 'own'))
+       def send(self, interp, cmd, *args):
                return apply(self.tk.call, ('send', interp, cmd) + args)
        def lower(self, belowThis=None):
                self.tk.call('lift', self._w, belowThis)
@@ -186,7 +240,8 @@ class Misc:
                return self.tk.getint(
                        self.tk.call('winfo', 'screenwidth', self._w))
        def winfo_toplevel(self):
-               return self.tk.call('winfo', 'toplevel', self._w)
+               return self._nametowidget(self.tk.call(
+                       'winfo', 'toplevel', self._w))
        def winfo_visual(self):
                return self.tk.call('winfo', 'visual', self._w)
        def winfo_vrootheight(self):
@@ -218,17 +273,17 @@ class Misc:
                if add: add = '+'
                name = self._register(func, self._substitute)
                self.tk.call('bind', self._w, sequence, 
-                            (add + name,) + self._subst_prefix)
+                            (add + name,) + self._subst_format)
        def bind_all(self, sequence, func, add=''):
                if add: add = '+'
                name = self._register(func, self._substitute)
                self.tk.call('bind', 'all' , sequence, 
-                            (add + `name`,) + self._subst_prefix)
+                            (add + `name`,) + self._subst_format)
        def bind_class(self, className, sequence, func, add=''):
                if add: add = '+'
                name = self._register(func, self._substitute)
                self.tk.call('bind', className , sequence, 
-                            (add + name,) + self._subst_prefix)
+                            (add + name,) + self._subst_format)
        def mainloop(self):
                self.tk.mainloop()
        def quit(self):
@@ -280,12 +335,12 @@ class Misc:
                w = self
                while w.master: w = w.master
                return w
-       _subst_prefix = ('%#', '%b', '%f', '%h', '%k', 
+       _subst_format = ('%#', '%b', '%f', '%h', '%k', 
                         '%s', '%t', '%w', '%x', '%y',
                         '%A', '%E', '%K', '%N', '%W', '%T', '%X', '%Y')
        def _substitute(self, *args):
                tk = self.tk
-               if len(args) != len(self._subst_prefix): return args
+               if len(args) != len(self._subst_format): return args
                nsign, b, f, h, k, s, t, w, x, y, A, E, K, N, W, T, X, Y = args
                # Missing: (a, c, d, m, o, v, B, R)
                e = Event()
@@ -480,10 +535,8 @@ class Place:
                                   self.tk.call(
                                           'place', 'slaves', self._w)))
 
-_default_root = None
-
 class Widget(Misc, Pack, Place):
-       def __init__(self, master, widgetName, cnf={}, extra=()):
+       def _setup(self, master, cnf):
                global _default_root
                if not master:
                        if not _default_root:
@@ -503,13 +556,15 @@ class Widget(Misc, Pack, Place):
                        self._w = '.' + name
                else:
                        self._w = master._w + '.' + name
+               self.children = {}
+               if self.master.children.has_key(self._name):
+                        self.master.children[self._name].destroy()
+               self.master.children[self._name] = self
+       def __init__(self, master, widgetName, cnf={}, extra=()):
+               Widget._setup(self, master, cnf)
                self.widgetName = widgetName
                apply(self.tk.call, (widgetName, self._w) + extra)
                Widget.config(self, cnf)
-               self.children = {}
-               if master.children.has_key(name):
-                        master.children[name].destroy()
-               master.children[name] = self
        def config(self, cnf=None):
                if cnf is None:
                        cnf = {}
@@ -528,7 +583,7 @@ class Widget(Misc, Pack, Place):
                apply(self.tk.call, (self._w, 'configure')
                      + self._options(cnf))
        def __getitem__(self, key):
-               v = self.tk.splitlist(self.tk.call(
+               v = self.tk.split(self.tk.call(
                        self._w, 'configure', '-' + key))
                return v[4]
        def __setitem__(self, key, value):
@@ -562,13 +617,13 @@ class Toplevel(Widget, Wm):
 class Button(Widget):
        def __init__(self, master=None, cnf={}):
                Widget.__init__(self, master, 'button', cnf)
-       def tk_butEnter(self):
+       def tk_butEnter(self, *dummy):
                self.tk.call('tk_butEnter', self._w)
-       def tk_butLeave(self):
+       def tk_butLeave(self, *dummy):
                self.tk.call('tk_butLeave', self._w)
-       def tk_butDown(self):
+       def tk_butDown(self, *dummy):
                self.tk.call('tk_butDown', self._w)
-       def tk_butUp(self):
+       def tk_butUp(self, *dummy):
                self.tk.call('tk_butUp', self._w)
        def flash(self):
                self.tk.call(self._w, 'flash')
@@ -618,7 +673,7 @@ class Canvas(Widget):
                if add: add='+'
                name = self._register(func, self._substitute)
                self.tk.call(self._w, 'bind', tagOrId, sequence, 
-                            (add + name,) + self._subst_prefix)
+                            (add + name,) + self._subst_format)
        def canvasx(self, screenx, gridspacing=None):
                return self.tk.getint(self.tk.call(
                        self._w, 'canvasx', screenx, gridspacing))
@@ -842,8 +897,6 @@ class Listbox(Widget):
 class Menu(Widget):
        def __init__(self, master=None, cnf={}):
                Widget.__init__(self, master, 'menu', cnf)
-       def tk_menuBar(self, *args):
-               apply(self.tk.call, ('tk_menuBar', self._w) + args)
        def tk_bindForTraversal(self):
                self.tk.call('tk_bindForTraversal', self._w)
        def tk_mbPost(self):
@@ -871,15 +924,23 @@ class Menu(Widget):
        def add(self, itemType, cnf={}):
                apply(self.tk.call, (self._w, 'add', itemType) 
                      + self._options(cnf))
+       def add_cascade(self, cnf={}):
+               self.add('cascade', cnf)
+       def add_checkbutton(self, cnf={}):
+               self.add('checkbutton', cnf)
+       def add_command(self, cnf={}):
+               self.add('command', cnf)
+       def add_radiobutton(self, cnf={}):
+               self.add('radiobutton', cnf)
+       def add_separator(self, cnf={}):
+               self.add('separator', cnf)
        def delete(self, index1, index2=None):
                self.tk.call(self._w, 'delete', index1, index2)
        def entryconfig(self, index, cnf={}):
                apply(self.tk.call, (self._w, 'entryconfigure', index)
                      + self._options(cnf))
        def index(self, index):
-               i = self.tk.call(self._w, 'index', index)
-               if i == 'none': return None
-               return self.tk.getint(i)
+               return self.tk.call(self._w, 'index', index)
        def invoke(self, index):
                return self.tk.call(self._w, 'invoke', index)
        def post(self, x, y):
@@ -922,7 +983,7 @@ class Scrollbar(Widget):
        def __init__(self, master=None, cnf={}):
                Widget.__init__(self, master, 'scrollbar', cnf)
        def get(self):
-               return self.tk.getints(self.tk.call(self._w, 'get'))
+               return self._getints(self.tk.call(self._w, 'get'))
        def set(self, totalUnits, windowUnits, firstUnit, lastUnit):
                self.tk.call(self._w, 'set', 
                             totalUnits, windowUnits, firstUnit, lastUnit)
@@ -971,7 +1032,7 @@ class Text(Widget):
                name = self._register(func, self._substitute)
                self.tk.call(self._w, 'tag', 'bind', 
                             tagName, sequence, 
-                            (add + name,) + self._subst_prefix)
+                            (add + name,) + self._subst_format)
        def tag_config(self, tagName, cnf={}):
                apply(self.tk.call, 
                      (self._w, 'tag', 'configure', tagName) 
@@ -1002,5 +1063,22 @@ class Text(Widget):
        def yview_pickplace(self, what):
                self.tk.call(self._w, 'yview', '-pickplace', what)
 
-#class Dialog:
-       
+######################################################################
+# Extensions:
+
+class Studbutton(Button):
+       def __init__(self, master=None, cnf={}):
+               Widget.__init__(self, master, 'studbutton', cnf)
+               self.bind('<Any-Enter>',       self.tk_butEnter)
+               self.bind('<Any-Leave>',       self.tk_butLeave)
+               self.bind('<1>',               self.tk_butDown)
+               self.bind('<ButtonRelease-1>', self.tk_butUp)
+
+class Tributton(Button):
+       def __init__(self, master=None, cnf={}):
+               Widget.__init__(self, master, 'tributton', cnf)
+               self.bind('<Any-Enter>',       self.tk_butEnter)
+               self.bind('<Any-Leave>',       self.tk_butLeave)
+               self.bind('<1>',               self.tk_butDown)
+               self.bind('<ButtonRelease-1>', self.tk_butUp)
+
index 7be94c75034699d36d753ffaf3c74bee7a57bdc9..4d2dd3ab1a1ebb0731309d73013fc29da1735b2f 100755 (executable)
@@ -16,21 +16,72 @@ TupleType = type(())
 ListType = type([])
 CallableTypes = (FunctionType, MethodType)
 
+_default_root = None
+
 def _tkerror(err):
        pass
 
 class Event:
        pass
 
+_varnum = 0
+class Variable:
+       def __init__(self, master=None):
+               global _default_root
+               global _varnum
+               if master:
+                       self._tk = master.tk
+               else:
+                       self._tk = _default_root.tk
+               self._name = 'PY_VAR' + `_varnum`
+               _varnum = _varnum + 1
+       def __del__(self):
+               self._tk.unsetvar(self._name)
+       def __str__(self):
+               return self._name
+       def __call__(self, value=None):
+               if value == None:
+                       return self.get()
+               else:
+                       self.set(value)
+       def set(self, value):
+               return self._tk.setvar(self._name, value)
+
+class StringVar(Variable):
+       def __init__(self, master=None):
+               Variable.__init__(self, master)
+       def get(self):
+               return self._tk.getvar(self._name)
+
+class IntVar(Variable):
+       def __init__(self, master=None):
+               Variable.__init__(self, master)
+       def get(self):
+               return self._tk.getint(self._tk.getvar(self._name))
+
+class DoubleVar(Variable):
+       def __init__(self, master=None):
+               Variable.__init__(self, master)
+       def get(self):
+               return self._tk.getdouble(self._tk.getvar(self._name))
+
+class BooleanVar(Variable):
+       def __init__(self, master=None):
+               Variable.__init__(self, master)
+       def get(self):
+               return self._tk.getboolean(self._tk.getvar(self._name))
+
 class Misc:
        def tk_strictMotif(self, boolean=None):
                self.tk.getboolean(self.tk.call(
                        'set', 'tk_strictMotif', boolean))
-       def waitvar(self, name='VAR'):
+       def tk_menuBar(self, *args):
+               apply(self.tk.call, ('tk_menuBar', self._w) + args)
+       def waitvar(self, name='PY_VAR'):
                self.tk.call('tkwait', 'variable', name)
-       def setvar(self, name='VAR', value='1'):
+       def setvar(self, name='PY_VAR', value='1'):
                self.tk.setvar(name, value)
-       def getvar(self, name='VAR'):
+       def getvar(self, name='PY_VAR'):
                return self.tk.getvar(name)
        def getint(self, s):
                return self.tk.getint(s)
@@ -89,11 +140,14 @@ class Misc:
                self.tk.call('selection', 'get', type)
        def selection_handle(self, func, type=None, format=None):
                name = self._register(func)
-               self.tk.call('selection', 'handle',
-                            self._w, name, type, format)
-       #XXX def selection_own(self):
-       #       self.tk.call('selection', 'own', self._w)
-       def send(self, interp, cmd, *args): #XXX
+               self.tk.call('selection', 'handle', self._w, 
+                            name, type, format)
+       def selection_own(self, func=None):
+               name = self._register(func)
+               self.tk.call('selection', 'own', self._w, name)
+       def selection_own_get(self):
+               return self._nametowidget(self.tk.call('selection', 'own'))
+       def send(self, interp, cmd, *args):
                return apply(self.tk.call, ('send', interp, cmd) + args)
        def lower(self, belowThis=None):
                self.tk.call('lift', self._w, belowThis)
@@ -186,7 +240,8 @@ class Misc:
                return self.tk.getint(
                        self.tk.call('winfo', 'screenwidth', self._w))
        def winfo_toplevel(self):
-               return self.tk.call('winfo', 'toplevel', self._w)
+               return self._nametowidget(self.tk.call(
+                       'winfo', 'toplevel', self._w))
        def winfo_visual(self):
                return self.tk.call('winfo', 'visual', self._w)
        def winfo_vrootheight(self):
@@ -218,17 +273,17 @@ class Misc:
                if add: add = '+'
                name = self._register(func, self._substitute)
                self.tk.call('bind', self._w, sequence, 
-                            (add + name,) + self._subst_prefix)
+                            (add + name,) + self._subst_format)
        def bind_all(self, sequence, func, add=''):
                if add: add = '+'
                name = self._register(func, self._substitute)
                self.tk.call('bind', 'all' , sequence, 
-                            (add + `name`,) + self._subst_prefix)
+                            (add + `name`,) + self._subst_format)
        def bind_class(self, className, sequence, func, add=''):
                if add: add = '+'
                name = self._register(func, self._substitute)
                self.tk.call('bind', className , sequence, 
-                            (add + name,) + self._subst_prefix)
+                            (add + name,) + self._subst_format)
        def mainloop(self):
                self.tk.mainloop()
        def quit(self):
@@ -280,12 +335,12 @@ class Misc:
                w = self
                while w.master: w = w.master
                return w
-       _subst_prefix = ('%#', '%b', '%f', '%h', '%k', 
+       _subst_format = ('%#', '%b', '%f', '%h', '%k', 
                         '%s', '%t', '%w', '%x', '%y',
                         '%A', '%E', '%K', '%N', '%W', '%T', '%X', '%Y')
        def _substitute(self, *args):
                tk = self.tk
-               if len(args) != len(self._subst_prefix): return args
+               if len(args) != len(self._subst_format): return args
                nsign, b, f, h, k, s, t, w, x, y, A, E, K, N, W, T, X, Y = args
                # Missing: (a, c, d, m, o, v, B, R)
                e = Event()
@@ -480,10 +535,8 @@ class Place:
                                   self.tk.call(
                                           'place', 'slaves', self._w)))
 
-_default_root = None
-
 class Widget(Misc, Pack, Place):
-       def __init__(self, master, widgetName, cnf={}, extra=()):
+       def _setup(self, master, cnf):
                global _default_root
                if not master:
                        if not _default_root:
@@ -503,13 +556,15 @@ class Widget(Misc, Pack, Place):
                        self._w = '.' + name
                else:
                        self._w = master._w + '.' + name
+               self.children = {}
+               if self.master.children.has_key(self._name):
+                        self.master.children[self._name].destroy()
+               self.master.children[self._name] = self
+       def __init__(self, master, widgetName, cnf={}, extra=()):
+               Widget._setup(self, master, cnf)
                self.widgetName = widgetName
                apply(self.tk.call, (widgetName, self._w) + extra)
                Widget.config(self, cnf)
-               self.children = {}
-               if master.children.has_key(name):
-                        master.children[name].destroy()
-               master.children[name] = self
        def config(self, cnf=None):
                if cnf is None:
                        cnf = {}
@@ -528,7 +583,7 @@ class Widget(Misc, Pack, Place):
                apply(self.tk.call, (self._w, 'configure')
                      + self._options(cnf))
        def __getitem__(self, key):
-               v = self.tk.splitlist(self.tk.call(
+               v = self.tk.split(self.tk.call(
                        self._w, 'configure', '-' + key))
                return v[4]
        def __setitem__(self, key, value):
@@ -562,13 +617,13 @@ class Toplevel(Widget, Wm):
 class Button(Widget):
        def __init__(self, master=None, cnf={}):
                Widget.__init__(self, master, 'button', cnf)
-       def tk_butEnter(self):
+       def tk_butEnter(self, *dummy):
                self.tk.call('tk_butEnter', self._w)
-       def tk_butLeave(self):
+       def tk_butLeave(self, *dummy):
                self.tk.call('tk_butLeave', self._w)
-       def tk_butDown(self):
+       def tk_butDown(self, *dummy):
                self.tk.call('tk_butDown', self._w)
-       def tk_butUp(self):
+       def tk_butUp(self, *dummy):
                self.tk.call('tk_butUp', self._w)
        def flash(self):
                self.tk.call(self._w, 'flash')
@@ -618,7 +673,7 @@ class Canvas(Widget):
                if add: add='+'
                name = self._register(func, self._substitute)
                self.tk.call(self._w, 'bind', tagOrId, sequence, 
-                            (add + name,) + self._subst_prefix)
+                            (add + name,) + self._subst_format)
        def canvasx(self, screenx, gridspacing=None):
                return self.tk.getint(self.tk.call(
                        self._w, 'canvasx', screenx, gridspacing))
@@ -842,8 +897,6 @@ class Listbox(Widget):
 class Menu(Widget):
        def __init__(self, master=None, cnf={}):
                Widget.__init__(self, master, 'menu', cnf)
-       def tk_menuBar(self, *args):
-               apply(self.tk.call, ('tk_menuBar', self._w) + args)
        def tk_bindForTraversal(self):
                self.tk.call('tk_bindForTraversal', self._w)
        def tk_mbPost(self):
@@ -871,15 +924,23 @@ class Menu(Widget):
        def add(self, itemType, cnf={}):
                apply(self.tk.call, (self._w, 'add', itemType) 
                      + self._options(cnf))
+       def add_cascade(self, cnf={}):
+               self.add('cascade', cnf)
+       def add_checkbutton(self, cnf={}):
+               self.add('checkbutton', cnf)
+       def add_command(self, cnf={}):
+               self.add('command', cnf)
+       def add_radiobutton(self, cnf={}):
+               self.add('radiobutton', cnf)
+       def add_separator(self, cnf={}):
+               self.add('separator', cnf)
        def delete(self, index1, index2=None):
                self.tk.call(self._w, 'delete', index1, index2)
        def entryconfig(self, index, cnf={}):
                apply(self.tk.call, (self._w, 'entryconfigure', index)
                      + self._options(cnf))
        def index(self, index):
-               i = self.tk.call(self._w, 'index', index)
-               if i == 'none': return None
-               return self.tk.getint(i)
+               return self.tk.call(self._w, 'index', index)
        def invoke(self, index):
                return self.tk.call(self._w, 'invoke', index)
        def post(self, x, y):
@@ -922,7 +983,7 @@ class Scrollbar(Widget):
        def __init__(self, master=None, cnf={}):
                Widget.__init__(self, master, 'scrollbar', cnf)
        def get(self):
-               return self.tk.getints(self.tk.call(self._w, 'get'))
+               return self._getints(self.tk.call(self._w, 'get'))
        def set(self, totalUnits, windowUnits, firstUnit, lastUnit):
                self.tk.call(self._w, 'set', 
                             totalUnits, windowUnits, firstUnit, lastUnit)
@@ -971,7 +1032,7 @@ class Text(Widget):
                name = self._register(func, self._substitute)
                self.tk.call(self._w, 'tag', 'bind', 
                             tagName, sequence, 
-                            (add + name,) + self._subst_prefix)
+                            (add + name,) + self._subst_format)
        def tag_config(self, tagName, cnf={}):
                apply(self.tk.call, 
                      (self._w, 'tag', 'configure', tagName) 
@@ -1002,5 +1063,22 @@ class Text(Widget):
        def yview_pickplace(self, what):
                self.tk.call(self._w, 'yview', '-pickplace', what)
 
-#class Dialog:
-       
+######################################################################
+# Extensions:
+
+class Studbutton(Button):
+       def __init__(self, master=None, cnf={}):
+               Widget.__init__(self, master, 'studbutton', cnf)
+               self.bind('<Any-Enter>',       self.tk_butEnter)
+               self.bind('<Any-Leave>',       self.tk_butLeave)
+               self.bind('<1>',               self.tk_butDown)
+               self.bind('<ButtonRelease-1>', self.tk_butUp)
+
+class Tributton(Button):
+       def __init__(self, master=None, cnf={}):
+               Widget.__init__(self, master, 'tributton', cnf)
+               self.bind('<Any-Enter>',       self.tk_butEnter)
+               self.bind('<Any-Leave>',       self.tk_butLeave)
+               self.bind('<1>',               self.tk_butDown)
+               self.bind('<ButtonRelease-1>', self.tk_butUp)
+