Added dictionary mapping names to children, and _name attribute.
Renamed tkerror to _tkerror, default_root to _default_root. (_substitute, _subst_prefix): move back into class Misc; added widget Event attribute. Added functions that return widgets or widget lists: winfo_children; focus_get; grab_current. (Pack.slaves, Place.slaves): return Widget objects instead of pathnames. Renamed __del__() to destroy() (because of circular refs, __del__ won't ever be called). Added some names with explicit _set: focus_set, focus_default_set, grab_set. Added focus_default_none. (Misc._getints): use tk.splitlist() instead of tk.split(), return None if string empty.
This commit is contained in:
parent
e7571856f3
commit
45853db868
|
@ -12,7 +12,7 @@ FunctionType = type(_isfunctype)
|
||||||
ClassType = type(_Dummy)
|
ClassType = type(_Dummy)
|
||||||
MethodType = type(_Dummy.meth)
|
MethodType = type(_Dummy.meth)
|
||||||
|
|
||||||
def tkerror(err):
|
def _tkerror(err):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class Event:
|
class Event:
|
||||||
|
@ -34,20 +34,31 @@ class Misc:
|
||||||
return self.tk.getdouble(s)
|
return self.tk.getdouble(s)
|
||||||
def getboolean(self, s):
|
def getboolean(self, s):
|
||||||
return self.tk.getboolean(s)
|
return self.tk.getboolean(s)
|
||||||
def focus(self):
|
def focus_set(self):
|
||||||
self.tk.call('focus', self._w)
|
self.tk.call('focus', self._w)
|
||||||
def focus_default(self):
|
focus = focus_set # XXX b/w compat?
|
||||||
|
def focus_default_set(self):
|
||||||
self.tk.call('focus', 'default', self._w)
|
self.tk.call('focus', 'default', self._w)
|
||||||
|
def focus_default_none(self):
|
||||||
|
self.tk.call('focus', 'default', 'none')
|
||||||
|
focus_default = focus_default_set
|
||||||
def focus_none(self):
|
def focus_none(self):
|
||||||
self.tk.call('focus', 'none')
|
self.tk.call('focus', 'none')
|
||||||
#XXX focus_get?
|
def focus_get(self):
|
||||||
|
name = self.tk.call('focus')
|
||||||
|
if name == 'none': return None
|
||||||
|
return self._nametowidget(name)
|
||||||
def after(self, ms, func=None, *args):
|
def after(self, ms, func=None, *args):
|
||||||
if not func:
|
if not func:
|
||||||
self.tk.call('after', ms)
|
self.tk.call('after', ms)
|
||||||
else:
|
else:
|
||||||
name = self._register(func)
|
name = self._register(func)
|
||||||
apply(self.tk.call, ('after', ms, name) + args)
|
apply(self.tk.call, ('after', ms, name) + args)
|
||||||
#XXX grab_current
|
# XXX grab current w/o window argument
|
||||||
|
def grab_current(self):
|
||||||
|
name = self.tk.call('grab', 'current', self._w)
|
||||||
|
if not name: return None
|
||||||
|
return self._nametowidget(name)
|
||||||
def grab_release(self):
|
def grab_release(self):
|
||||||
self.tk.call('grab', 'release', self._w)
|
self.tk.call('grab', 'release', self._w)
|
||||||
def grab_set(self):
|
def grab_set(self):
|
||||||
|
@ -55,7 +66,9 @@ class Misc:
|
||||||
def grab_set_global(self):
|
def grab_set_global(self):
|
||||||
self.tk.call('grab', 'set', '-global', self._w)
|
self.tk.call('grab', 'set', '-global', self._w)
|
||||||
def grab_status(self):
|
def grab_status(self):
|
||||||
self.tk.call('grab', 'status', self._w)
|
status = self.tk.call('grab', 'status', self._w)
|
||||||
|
if status == 'none': status = None
|
||||||
|
return status
|
||||||
def lower(self, belowThis=None):
|
def lower(self, belowThis=None):
|
||||||
self.tk.call('lower', self._w, belowThis)
|
self.tk.call('lower', self._w, belowThis)
|
||||||
def selection_clear(self):
|
def selection_clear(self):
|
||||||
|
@ -84,7 +97,10 @@ class Misc:
|
||||||
def winfo_cells(self):
|
def winfo_cells(self):
|
||||||
return self.tk.getint(
|
return self.tk.getint(
|
||||||
self.tk.call('winfo', 'cells', self._w))
|
self.tk.call('winfo', 'cells', self._w))
|
||||||
#XXX winfo_children
|
def winfo_children(self):
|
||||||
|
return map(self._nametowidget,
|
||||||
|
self.tk.splitlist(self.tk.call(
|
||||||
|
'winfo', 'children', self._w)))
|
||||||
def winfo_class(self):
|
def winfo_class(self):
|
||||||
return self.tk.call('winfo', 'class', self._w)
|
return self.tk.call('winfo', 'class', self._w)
|
||||||
def winfo_containing(self, rootX, rootY):
|
def winfo_containing(self, rootX, rootY):
|
||||||
|
@ -188,32 +204,30 @@ class Misc:
|
||||||
self.tk.call('update', 'idletasks')
|
self.tk.call('update', 'idletasks')
|
||||||
def bind(self, sequence, func, add=''):
|
def bind(self, sequence, func, add=''):
|
||||||
if add: add = '+'
|
if add: add = '+'
|
||||||
name = self._register(func, _substitute)
|
name = self._register(func, self._substitute)
|
||||||
self.tk.call('bind', self._w, sequence,
|
self.tk.call('bind', self._w, sequence,
|
||||||
(add + name,) + _subst_prefix)
|
(add + name,) + self._subst_prefix)
|
||||||
def bind_all(self, sequence, func, add=''):
|
def bind_all(self, sequence, func, add=''):
|
||||||
if add: add = '+'
|
if add: add = '+'
|
||||||
name = self._register(func, _substitute)
|
name = self._register(func, self._substitute)
|
||||||
self.tk.call('bind', 'all' , sequence,
|
self.tk.call('bind', 'all' , sequence,
|
||||||
(add + `name`,) + _subst_prefix)
|
(add + `name`,) + self._subst_prefix)
|
||||||
def bind_class(self, className, sequence, func, add=''):
|
def bind_class(self, className, sequence, func, add=''):
|
||||||
if add: add = '+'
|
if add: add = '+'
|
||||||
name = self._register(func, _substitute)
|
name = self._register(func, self._substitute)
|
||||||
self.tk.call('bind', className , sequence,
|
self.tk.call('bind', className , sequence,
|
||||||
(add + name,) + _subst_prefix)
|
(add + name,) + self._subst_prefix)
|
||||||
def mainloop(self):
|
def mainloop(self):
|
||||||
self.tk.mainloop()
|
self.tk.mainloop()
|
||||||
def quit(self):
|
def quit(self):
|
||||||
self.tk.quit()
|
self.tk.quit()
|
||||||
# Utilities
|
# Utilities
|
||||||
def _getints(self, string):
|
def _getints(self, string):
|
||||||
if string:
|
if not string: return None
|
||||||
res = ()
|
res = ()
|
||||||
for v in self.tk.split(string):
|
for v in self.tk.splitlist(string):
|
||||||
res = res + (self.tk.getint(v),)
|
res = res + (self.tk.getint(v),)
|
||||||
return res
|
return res
|
||||||
else:
|
|
||||||
return string
|
|
||||||
def _getboolean(self, string):
|
def _getboolean(self, string):
|
||||||
if string:
|
if string:
|
||||||
return self.tk.getboolean(string)
|
return self.tk.getboolean(string)
|
||||||
|
@ -225,8 +239,22 @@ class Misc:
|
||||||
v = self._register(v)
|
v = self._register(v)
|
||||||
res = res + ('-'+k, v)
|
res = res + ('-'+k, v)
|
||||||
return res
|
return res
|
||||||
|
def _nametowidget(self, name):
|
||||||
|
w = self
|
||||||
|
if name[0] == '.':
|
||||||
|
w = w._root()
|
||||||
|
name = name[1:]
|
||||||
|
from string import find
|
||||||
|
while name:
|
||||||
|
i = find(name, '.')
|
||||||
|
if i >= 0:
|
||||||
|
name, tail = name[:i], name[i+1:]
|
||||||
|
else:
|
||||||
|
tail = ''
|
||||||
|
w = w.children[name]
|
||||||
|
name = tail
|
||||||
|
return w
|
||||||
def _register(self, func, subst=None):
|
def _register(self, func, subst=None):
|
||||||
f = func
|
|
||||||
f = _CallSafely(func, subst).__call__
|
f = _CallSafely(func, subst).__call__
|
||||||
name = `id(f)`
|
name = `id(f)`
|
||||||
if hasattr(func, 'im_func'):
|
if hasattr(func, 'im_func'):
|
||||||
|
@ -236,39 +264,40 @@ class Misc:
|
||||||
name = name + func.func_name
|
name = name + func.func_name
|
||||||
self.tk.createcommand(name, f)
|
self.tk.createcommand(name, f)
|
||||||
return name
|
return name
|
||||||
|
def _root(self):
|
||||||
_subst_prefix = ('%#', '%b', '%f', '%h', '%k',
|
w = self
|
||||||
'%s', '%t', '%w', '%x', '%y',
|
while w.master: w = w.master
|
||||||
'%A', '%E', '%K', '%N', '%T', '%X', '%Y')
|
return w
|
||||||
|
_subst_prefix = ('%#', '%b', '%f', '%h', '%k',
|
||||||
def _substitute(*args):
|
'%s', '%t', '%w', '%x', '%y',
|
||||||
tk = default_root.tk
|
'%A', '%E', '%K', '%N', '%W', '%T', '%X', '%Y')
|
||||||
if len(args) != len(_subst_prefix): return args
|
def _substitute(self, *args):
|
||||||
nsign, b, f, h, k, s, t, w, x, y, A, E, K, N, T, X, Y = args
|
tk = self.tk
|
||||||
# Missing: (a, c, d, m, o, v, B, R, W)
|
if len(args) != len(self._subst_prefix): return args
|
||||||
#XXX Convert %W (_w) to class instance?
|
nsign, b, f, h, k, s, t, w, x, y, A, E, K, N, W, T, X, Y = args
|
||||||
e = Event()
|
# Missing: (a, c, d, m, o, v, B, R)
|
||||||
e.serial = tk.getint(nsign)
|
e = Event()
|
||||||
e.num = tk.getint(b)
|
e.serial = tk.getint(nsign)
|
||||||
try: e.focus = tk.getboolean(f)
|
e.num = tk.getint(b)
|
||||||
except TclError: pass
|
try: e.focus = tk.getboolean(f)
|
||||||
e.height = tk.getint(h)
|
except TclError: pass
|
||||||
e.keycode = tk.getint(k)
|
e.height = tk.getint(h)
|
||||||
e.state = tk.getint(s)
|
e.keycode = tk.getint(k)
|
||||||
e.time = tk.getint(t)
|
e.state = tk.getint(s)
|
||||||
e.width = tk.getint(w)
|
e.time = tk.getint(t)
|
||||||
e.x = tk.getint(x)
|
e.width = tk.getint(w)
|
||||||
e.y = tk.getint(y)
|
e.x = tk.getint(x)
|
||||||
e.char = A
|
e.y = tk.getint(y)
|
||||||
try: e.send_event = tk.getboolean(E)
|
e.char = A
|
||||||
except TclError: pass
|
try: e.send_event = tk.getboolean(E)
|
||||||
e.keysym = K
|
except TclError: pass
|
||||||
e.keysym_num = tk.getint(N)
|
e.keysym = K
|
||||||
e.type = T
|
e.keysym_num = tk.getint(N)
|
||||||
#XXX %W stuff
|
e.type = T
|
||||||
e.x_root = tk.getint(X)
|
e.widget = self._nametowidget(W)
|
||||||
e.y_root = tk.getint(Y)
|
e.x_root = tk.getint(X)
|
||||||
return (e,)
|
e.y_root = tk.getint(Y)
|
||||||
|
return (e,)
|
||||||
|
|
||||||
class _CallSafely:
|
class _CallSafely:
|
||||||
def __init__(self, func, subst=None):
|
def __init__(self, func, subst=None):
|
||||||
|
@ -282,6 +311,8 @@ class _CallSafely:
|
||||||
import sys
|
import sys
|
||||||
try:
|
try:
|
||||||
return apply(func, args)
|
return apply(func, args)
|
||||||
|
except SystemExit, msg:
|
||||||
|
raise SystemExit, msg
|
||||||
except:
|
except:
|
||||||
try:
|
try:
|
||||||
try:
|
try:
|
||||||
|
@ -296,6 +327,13 @@ class _CallSafely:
|
||||||
sys.stderr.write('%s: %s\n' %
|
sys.stderr.write('%s: %s\n' %
|
||||||
(sys.exc_type,
|
(sys.exc_type,
|
||||||
sys.exc_value))
|
sys.exc_value))
|
||||||
|
(sys.last_type,
|
||||||
|
sys.last_value,
|
||||||
|
sys.last_traceback) = (sys.exc_type,
|
||||||
|
sys.exc_value,
|
||||||
|
sys.exc_traceback)
|
||||||
|
import pdb
|
||||||
|
pdb.pm()
|
||||||
except:
|
except:
|
||||||
print '*** Error in error handling ***'
|
print '*** Error in error handling ***'
|
||||||
print sys.exc_type, ':', sys.exc_value
|
print sys.exc_type, ':', sys.exc_value
|
||||||
|
@ -373,16 +411,20 @@ class Wm:
|
||||||
class Tk(Misc, Wm):
|
class Tk(Misc, Wm):
|
||||||
_w = '.'
|
_w = '.'
|
||||||
def __init__(self, screenName=None, baseName=None, className='Tk'):
|
def __init__(self, screenName=None, baseName=None, className='Tk'):
|
||||||
|
self.master = None
|
||||||
|
self.children = {}
|
||||||
if baseName is None:
|
if baseName is None:
|
||||||
import sys, os
|
import sys, os
|
||||||
baseName = os.path.basename(sys.argv[0])
|
baseName = os.path.basename(sys.argv[0])
|
||||||
if baseName[-3:] == '.py': baseName = baseName[:-3]
|
if baseName[-3:] == '.py': baseName = baseName[:-3]
|
||||||
self.tk = tkinter.create(screenName, baseName, className)
|
self.tk = tkinter.create(screenName, baseName, className)
|
||||||
self.tk.createcommand('tkerror', tkerror)
|
self.tk.createcommand('tkerror', _tkerror)
|
||||||
def __del__(self):
|
def destroy(self):
|
||||||
self.tk.call('destroy', '.')
|
for c in self.children.values(): c.destroy()
|
||||||
|
del self.master.children[self._name]
|
||||||
|
self.tk.call('destroy', self._w)
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '.'
|
return self._w
|
||||||
|
|
||||||
class Pack:
|
class Pack:
|
||||||
def config(self, cnf={}):
|
def config(self, cnf={}):
|
||||||
|
@ -404,8 +446,9 @@ class Pack:
|
||||||
return self._getboolean(self.tk.call(
|
return self._getboolean(self.tk.call(
|
||||||
'pack', 'propagate', self._w))
|
'pack', 'propagate', self._w))
|
||||||
def slaves(self):
|
def slaves(self):
|
||||||
return self.tk.splitlist(self.tk.call(
|
return map(self._nametowidget,
|
||||||
'pack', 'slaves', self._w))
|
self.tk.splitlist(
|
||||||
|
self.tk.call('pack', 'slaves', self._w)))
|
||||||
|
|
||||||
class Place:
|
class Place:
|
||||||
def config(self, cnf={}):
|
def config(self, cnf={}):
|
||||||
|
@ -420,20 +463,22 @@ class Place:
|
||||||
def info(self):
|
def info(self):
|
||||||
return self.tk.call('place', 'info', self._w)
|
return self.tk.call('place', 'info', self._w)
|
||||||
def slaves(self):
|
def slaves(self):
|
||||||
return self.tk.splitlist(self.tk.call(
|
return map(self._nametowidget,
|
||||||
'place', 'slaves', self._w))
|
self.tk.splitlist(
|
||||||
|
self.tk.call(
|
||||||
|
'place', 'slaves', self._w)))
|
||||||
|
|
||||||
default_root = None
|
_default_root = None
|
||||||
|
|
||||||
class Widget(Misc, Pack, Place):
|
class Widget(Misc, Pack, Place):
|
||||||
def __init__(self, master, widgetName, cnf={}, extra=()):
|
def __init__(self, master, widgetName, cnf={}, extra=()):
|
||||||
global default_root
|
global _default_root
|
||||||
if not master:
|
if not master:
|
||||||
if not default_root:
|
if not _default_root:
|
||||||
default_root = Tk()
|
_default_root = Tk()
|
||||||
master = default_root
|
master = _default_root
|
||||||
if not default_root:
|
if not _default_root:
|
||||||
default_root = master
|
_default_root = master
|
||||||
self.master = master
|
self.master = master
|
||||||
self.tk = master.tk
|
self.tk = master.tk
|
||||||
if cnf.has_key('name'):
|
if cnf.has_key('name'):
|
||||||
|
@ -441,6 +486,7 @@ class Widget(Misc, Pack, Place):
|
||||||
del cnf['name']
|
del cnf['name']
|
||||||
else:
|
else:
|
||||||
name = `id(self)`
|
name = `id(self)`
|
||||||
|
self._name = name
|
||||||
if master._w=='.':
|
if master._w=='.':
|
||||||
self._w = '.' + name
|
self._w = '.' + name
|
||||||
else:
|
else:
|
||||||
|
@ -448,6 +494,10 @@ class Widget(Misc, Pack, Place):
|
||||||
self.widgetName = widgetName
|
self.widgetName = widgetName
|
||||||
apply(self.tk.call, (widgetName, self._w) + extra)
|
apply(self.tk.call, (widgetName, self._w) + extra)
|
||||||
Widget.config(self, cnf)
|
Widget.config(self, cnf)
|
||||||
|
self.children = {}
|
||||||
|
if master.children.has_key(name):
|
||||||
|
master.children[name].destroy()
|
||||||
|
master.children[name] = self
|
||||||
def config(self, cnf={}):
|
def config(self, cnf={}):
|
||||||
for k in cnf.keys():
|
for k in cnf.keys():
|
||||||
if type(k) == ClassType:
|
if type(k) == ClassType:
|
||||||
|
@ -463,9 +513,10 @@ class Widget(Misc, Pack, Place):
|
||||||
Widget.config(self, {key: value})
|
Widget.config(self, {key: value})
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self._w
|
return self._w
|
||||||
def __del__(self):
|
def destroy(self):
|
||||||
|
for c in self.children.values(): c.destroy()
|
||||||
|
del self.master.children[self._name]
|
||||||
self.tk.call('destroy', self._w)
|
self.tk.call('destroy', self._w)
|
||||||
destroy = __del__
|
|
||||||
def _do(self, name, args=()):
|
def _do(self, name, args=()):
|
||||||
apply(self.tk.call, (self._w, name) + args)
|
apply(self.tk.call, (self._w, name) + args)
|
||||||
|
|
||||||
|
@ -479,8 +530,9 @@ class Toplevel(Widget, Wm):
|
||||||
extra = extra + ('-class', cnf['class'])
|
extra = extra + ('-class', cnf['class'])
|
||||||
del cnf['class']
|
del cnf['class']
|
||||||
Widget.__init__(self, master, 'toplevel', cnf, extra)
|
Widget.__init__(self, master, 'toplevel', cnf, extra)
|
||||||
self.iconname(self.tk.call('wm', 'iconname', '.'))
|
root = self._root()
|
||||||
self.title(self.tk.call('wm', 'title', '.'))
|
self.iconname(root.iconname())
|
||||||
|
self.title(root.title())
|
||||||
|
|
||||||
class Button(Widget):
|
class Button(Widget):
|
||||||
def __init__(self, master=None, cnf={}):
|
def __init__(self, master=None, cnf={}):
|
||||||
|
@ -525,9 +577,9 @@ class Canvas(Widget):
|
||||||
return self._getints(self._do('bbox', args))
|
return self._getints(self._do('bbox', args))
|
||||||
def bind(self, tagOrId, sequence, func, add=''):
|
def bind(self, tagOrId, sequence, func, add=''):
|
||||||
if add: add='+'
|
if add: add='+'
|
||||||
name = self._register(func, _substitute)
|
name = self._register(func, self._substitute)
|
||||||
self.tk.call(self._w, 'bind', tagOrId, sequence,
|
self.tk.call(self._w, 'bind', tagOrId, sequence,
|
||||||
(add + name,) + _subst_prefix)
|
(add + name,) + self._subst_prefix)
|
||||||
def canvasx(self, screenx, gridspacing=None):
|
def canvasx(self, screenx, gridspacing=None):
|
||||||
return self.tk.getint(self.tk.call(
|
return self.tk.getint(self.tk.call(
|
||||||
self._w, 'canvasx', screenx, gridspacing))
|
self._w, 'canvasx', screenx, gridspacing))
|
||||||
|
@ -569,7 +621,7 @@ class Canvas(Widget):
|
||||||
def dtag(self, *args):
|
def dtag(self, *args):
|
||||||
self._do('dtag', args)
|
self._do('dtag', args)
|
||||||
def find(self, *args):
|
def find(self, *args):
|
||||||
self.tk.splitlist(self._do('find', args))
|
return self.tk.splitlist(self._do('find', args))
|
||||||
def focus(self, *args):
|
def focus(self, *args):
|
||||||
return self._do('focus', args)
|
return self._do('focus', args)
|
||||||
def gettags(self, *args):
|
def gettags(self, *args):
|
||||||
|
@ -845,10 +897,10 @@ class Text(Widget):
|
||||||
self._w, 'tag', 'add', tagName, index1, index2)
|
self._w, 'tag', 'add', tagName, index1, index2)
|
||||||
def tag_bind(self, tagName, sequence, func, add=''):
|
def tag_bind(self, tagName, sequence, func, add=''):
|
||||||
if add: add='+'
|
if add: add='+'
|
||||||
name = self._register(func, _substitute)
|
name = self._register(func, self._substitute)
|
||||||
self.tk.call(self._w, 'tag', 'bind',
|
self.tk.call(self._w, 'tag', 'bind',
|
||||||
tagName, sequence,
|
tagName, sequence,
|
||||||
(add + name,) + _subst_prefix)
|
(add + name,) + self._subst_prefix)
|
||||||
def tag_config(self, tagName, cnf={}):
|
def tag_config(self, tagName, cnf={}):
|
||||||
apply(self.tk.call,
|
apply(self.tk.call,
|
||||||
(self._w, 'tag', 'configure', tagName)
|
(self._w, 'tag', 'configure', tagName)
|
||||||
|
|
|
@ -12,7 +12,7 @@ FunctionType = type(_isfunctype)
|
||||||
ClassType = type(_Dummy)
|
ClassType = type(_Dummy)
|
||||||
MethodType = type(_Dummy.meth)
|
MethodType = type(_Dummy.meth)
|
||||||
|
|
||||||
def tkerror(err):
|
def _tkerror(err):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class Event:
|
class Event:
|
||||||
|
@ -34,20 +34,31 @@ class Misc:
|
||||||
return self.tk.getdouble(s)
|
return self.tk.getdouble(s)
|
||||||
def getboolean(self, s):
|
def getboolean(self, s):
|
||||||
return self.tk.getboolean(s)
|
return self.tk.getboolean(s)
|
||||||
def focus(self):
|
def focus_set(self):
|
||||||
self.tk.call('focus', self._w)
|
self.tk.call('focus', self._w)
|
||||||
def focus_default(self):
|
focus = focus_set # XXX b/w compat?
|
||||||
|
def focus_default_set(self):
|
||||||
self.tk.call('focus', 'default', self._w)
|
self.tk.call('focus', 'default', self._w)
|
||||||
|
def focus_default_none(self):
|
||||||
|
self.tk.call('focus', 'default', 'none')
|
||||||
|
focus_default = focus_default_set
|
||||||
def focus_none(self):
|
def focus_none(self):
|
||||||
self.tk.call('focus', 'none')
|
self.tk.call('focus', 'none')
|
||||||
#XXX focus_get?
|
def focus_get(self):
|
||||||
|
name = self.tk.call('focus')
|
||||||
|
if name == 'none': return None
|
||||||
|
return self._nametowidget(name)
|
||||||
def after(self, ms, func=None, *args):
|
def after(self, ms, func=None, *args):
|
||||||
if not func:
|
if not func:
|
||||||
self.tk.call('after', ms)
|
self.tk.call('after', ms)
|
||||||
else:
|
else:
|
||||||
name = self._register(func)
|
name = self._register(func)
|
||||||
apply(self.tk.call, ('after', ms, name) + args)
|
apply(self.tk.call, ('after', ms, name) + args)
|
||||||
#XXX grab_current
|
# XXX grab current w/o window argument
|
||||||
|
def grab_current(self):
|
||||||
|
name = self.tk.call('grab', 'current', self._w)
|
||||||
|
if not name: return None
|
||||||
|
return self._nametowidget(name)
|
||||||
def grab_release(self):
|
def grab_release(self):
|
||||||
self.tk.call('grab', 'release', self._w)
|
self.tk.call('grab', 'release', self._w)
|
||||||
def grab_set(self):
|
def grab_set(self):
|
||||||
|
@ -55,7 +66,9 @@ class Misc:
|
||||||
def grab_set_global(self):
|
def grab_set_global(self):
|
||||||
self.tk.call('grab', 'set', '-global', self._w)
|
self.tk.call('grab', 'set', '-global', self._w)
|
||||||
def grab_status(self):
|
def grab_status(self):
|
||||||
self.tk.call('grab', 'status', self._w)
|
status = self.tk.call('grab', 'status', self._w)
|
||||||
|
if status == 'none': status = None
|
||||||
|
return status
|
||||||
def lower(self, belowThis=None):
|
def lower(self, belowThis=None):
|
||||||
self.tk.call('lower', self._w, belowThis)
|
self.tk.call('lower', self._w, belowThis)
|
||||||
def selection_clear(self):
|
def selection_clear(self):
|
||||||
|
@ -84,7 +97,10 @@ class Misc:
|
||||||
def winfo_cells(self):
|
def winfo_cells(self):
|
||||||
return self.tk.getint(
|
return self.tk.getint(
|
||||||
self.tk.call('winfo', 'cells', self._w))
|
self.tk.call('winfo', 'cells', self._w))
|
||||||
#XXX winfo_children
|
def winfo_children(self):
|
||||||
|
return map(self._nametowidget,
|
||||||
|
self.tk.splitlist(self.tk.call(
|
||||||
|
'winfo', 'children', self._w)))
|
||||||
def winfo_class(self):
|
def winfo_class(self):
|
||||||
return self.tk.call('winfo', 'class', self._w)
|
return self.tk.call('winfo', 'class', self._w)
|
||||||
def winfo_containing(self, rootX, rootY):
|
def winfo_containing(self, rootX, rootY):
|
||||||
|
@ -188,32 +204,30 @@ class Misc:
|
||||||
self.tk.call('update', 'idletasks')
|
self.tk.call('update', 'idletasks')
|
||||||
def bind(self, sequence, func, add=''):
|
def bind(self, sequence, func, add=''):
|
||||||
if add: add = '+'
|
if add: add = '+'
|
||||||
name = self._register(func, _substitute)
|
name = self._register(func, self._substitute)
|
||||||
self.tk.call('bind', self._w, sequence,
|
self.tk.call('bind', self._w, sequence,
|
||||||
(add + name,) + _subst_prefix)
|
(add + name,) + self._subst_prefix)
|
||||||
def bind_all(self, sequence, func, add=''):
|
def bind_all(self, sequence, func, add=''):
|
||||||
if add: add = '+'
|
if add: add = '+'
|
||||||
name = self._register(func, _substitute)
|
name = self._register(func, self._substitute)
|
||||||
self.tk.call('bind', 'all' , sequence,
|
self.tk.call('bind', 'all' , sequence,
|
||||||
(add + `name`,) + _subst_prefix)
|
(add + `name`,) + self._subst_prefix)
|
||||||
def bind_class(self, className, sequence, func, add=''):
|
def bind_class(self, className, sequence, func, add=''):
|
||||||
if add: add = '+'
|
if add: add = '+'
|
||||||
name = self._register(func, _substitute)
|
name = self._register(func, self._substitute)
|
||||||
self.tk.call('bind', className , sequence,
|
self.tk.call('bind', className , sequence,
|
||||||
(add + name,) + _subst_prefix)
|
(add + name,) + self._subst_prefix)
|
||||||
def mainloop(self):
|
def mainloop(self):
|
||||||
self.tk.mainloop()
|
self.tk.mainloop()
|
||||||
def quit(self):
|
def quit(self):
|
||||||
self.tk.quit()
|
self.tk.quit()
|
||||||
# Utilities
|
# Utilities
|
||||||
def _getints(self, string):
|
def _getints(self, string):
|
||||||
if string:
|
if not string: return None
|
||||||
res = ()
|
res = ()
|
||||||
for v in self.tk.split(string):
|
for v in self.tk.splitlist(string):
|
||||||
res = res + (self.tk.getint(v),)
|
res = res + (self.tk.getint(v),)
|
||||||
return res
|
return res
|
||||||
else:
|
|
||||||
return string
|
|
||||||
def _getboolean(self, string):
|
def _getboolean(self, string):
|
||||||
if string:
|
if string:
|
||||||
return self.tk.getboolean(string)
|
return self.tk.getboolean(string)
|
||||||
|
@ -225,8 +239,22 @@ class Misc:
|
||||||
v = self._register(v)
|
v = self._register(v)
|
||||||
res = res + ('-'+k, v)
|
res = res + ('-'+k, v)
|
||||||
return res
|
return res
|
||||||
|
def _nametowidget(self, name):
|
||||||
|
w = self
|
||||||
|
if name[0] == '.':
|
||||||
|
w = w._root()
|
||||||
|
name = name[1:]
|
||||||
|
from string import find
|
||||||
|
while name:
|
||||||
|
i = find(name, '.')
|
||||||
|
if i >= 0:
|
||||||
|
name, tail = name[:i], name[i+1:]
|
||||||
|
else:
|
||||||
|
tail = ''
|
||||||
|
w = w.children[name]
|
||||||
|
name = tail
|
||||||
|
return w
|
||||||
def _register(self, func, subst=None):
|
def _register(self, func, subst=None):
|
||||||
f = func
|
|
||||||
f = _CallSafely(func, subst).__call__
|
f = _CallSafely(func, subst).__call__
|
||||||
name = `id(f)`
|
name = `id(f)`
|
||||||
if hasattr(func, 'im_func'):
|
if hasattr(func, 'im_func'):
|
||||||
|
@ -236,39 +264,40 @@ class Misc:
|
||||||
name = name + func.func_name
|
name = name + func.func_name
|
||||||
self.tk.createcommand(name, f)
|
self.tk.createcommand(name, f)
|
||||||
return name
|
return name
|
||||||
|
def _root(self):
|
||||||
_subst_prefix = ('%#', '%b', '%f', '%h', '%k',
|
w = self
|
||||||
'%s', '%t', '%w', '%x', '%y',
|
while w.master: w = w.master
|
||||||
'%A', '%E', '%K', '%N', '%T', '%X', '%Y')
|
return w
|
||||||
|
_subst_prefix = ('%#', '%b', '%f', '%h', '%k',
|
||||||
def _substitute(*args):
|
'%s', '%t', '%w', '%x', '%y',
|
||||||
tk = default_root.tk
|
'%A', '%E', '%K', '%N', '%W', '%T', '%X', '%Y')
|
||||||
if len(args) != len(_subst_prefix): return args
|
def _substitute(self, *args):
|
||||||
nsign, b, f, h, k, s, t, w, x, y, A, E, K, N, T, X, Y = args
|
tk = self.tk
|
||||||
# Missing: (a, c, d, m, o, v, B, R, W)
|
if len(args) != len(self._subst_prefix): return args
|
||||||
#XXX Convert %W (_w) to class instance?
|
nsign, b, f, h, k, s, t, w, x, y, A, E, K, N, W, T, X, Y = args
|
||||||
e = Event()
|
# Missing: (a, c, d, m, o, v, B, R)
|
||||||
e.serial = tk.getint(nsign)
|
e = Event()
|
||||||
e.num = tk.getint(b)
|
e.serial = tk.getint(nsign)
|
||||||
try: e.focus = tk.getboolean(f)
|
e.num = tk.getint(b)
|
||||||
except TclError: pass
|
try: e.focus = tk.getboolean(f)
|
||||||
e.height = tk.getint(h)
|
except TclError: pass
|
||||||
e.keycode = tk.getint(k)
|
e.height = tk.getint(h)
|
||||||
e.state = tk.getint(s)
|
e.keycode = tk.getint(k)
|
||||||
e.time = tk.getint(t)
|
e.state = tk.getint(s)
|
||||||
e.width = tk.getint(w)
|
e.time = tk.getint(t)
|
||||||
e.x = tk.getint(x)
|
e.width = tk.getint(w)
|
||||||
e.y = tk.getint(y)
|
e.x = tk.getint(x)
|
||||||
e.char = A
|
e.y = tk.getint(y)
|
||||||
try: e.send_event = tk.getboolean(E)
|
e.char = A
|
||||||
except TclError: pass
|
try: e.send_event = tk.getboolean(E)
|
||||||
e.keysym = K
|
except TclError: pass
|
||||||
e.keysym_num = tk.getint(N)
|
e.keysym = K
|
||||||
e.type = T
|
e.keysym_num = tk.getint(N)
|
||||||
#XXX %W stuff
|
e.type = T
|
||||||
e.x_root = tk.getint(X)
|
e.widget = self._nametowidget(W)
|
||||||
e.y_root = tk.getint(Y)
|
e.x_root = tk.getint(X)
|
||||||
return (e,)
|
e.y_root = tk.getint(Y)
|
||||||
|
return (e,)
|
||||||
|
|
||||||
class _CallSafely:
|
class _CallSafely:
|
||||||
def __init__(self, func, subst=None):
|
def __init__(self, func, subst=None):
|
||||||
|
@ -282,6 +311,8 @@ class _CallSafely:
|
||||||
import sys
|
import sys
|
||||||
try:
|
try:
|
||||||
return apply(func, args)
|
return apply(func, args)
|
||||||
|
except SystemExit, msg:
|
||||||
|
raise SystemExit, msg
|
||||||
except:
|
except:
|
||||||
try:
|
try:
|
||||||
try:
|
try:
|
||||||
|
@ -296,6 +327,13 @@ class _CallSafely:
|
||||||
sys.stderr.write('%s: %s\n' %
|
sys.stderr.write('%s: %s\n' %
|
||||||
(sys.exc_type,
|
(sys.exc_type,
|
||||||
sys.exc_value))
|
sys.exc_value))
|
||||||
|
(sys.last_type,
|
||||||
|
sys.last_value,
|
||||||
|
sys.last_traceback) = (sys.exc_type,
|
||||||
|
sys.exc_value,
|
||||||
|
sys.exc_traceback)
|
||||||
|
import pdb
|
||||||
|
pdb.pm()
|
||||||
except:
|
except:
|
||||||
print '*** Error in error handling ***'
|
print '*** Error in error handling ***'
|
||||||
print sys.exc_type, ':', sys.exc_value
|
print sys.exc_type, ':', sys.exc_value
|
||||||
|
@ -373,16 +411,20 @@ class Wm:
|
||||||
class Tk(Misc, Wm):
|
class Tk(Misc, Wm):
|
||||||
_w = '.'
|
_w = '.'
|
||||||
def __init__(self, screenName=None, baseName=None, className='Tk'):
|
def __init__(self, screenName=None, baseName=None, className='Tk'):
|
||||||
|
self.master = None
|
||||||
|
self.children = {}
|
||||||
if baseName is None:
|
if baseName is None:
|
||||||
import sys, os
|
import sys, os
|
||||||
baseName = os.path.basename(sys.argv[0])
|
baseName = os.path.basename(sys.argv[0])
|
||||||
if baseName[-3:] == '.py': baseName = baseName[:-3]
|
if baseName[-3:] == '.py': baseName = baseName[:-3]
|
||||||
self.tk = tkinter.create(screenName, baseName, className)
|
self.tk = tkinter.create(screenName, baseName, className)
|
||||||
self.tk.createcommand('tkerror', tkerror)
|
self.tk.createcommand('tkerror', _tkerror)
|
||||||
def __del__(self):
|
def destroy(self):
|
||||||
self.tk.call('destroy', '.')
|
for c in self.children.values(): c.destroy()
|
||||||
|
del self.master.children[self._name]
|
||||||
|
self.tk.call('destroy', self._w)
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '.'
|
return self._w
|
||||||
|
|
||||||
class Pack:
|
class Pack:
|
||||||
def config(self, cnf={}):
|
def config(self, cnf={}):
|
||||||
|
@ -404,8 +446,9 @@ class Pack:
|
||||||
return self._getboolean(self.tk.call(
|
return self._getboolean(self.tk.call(
|
||||||
'pack', 'propagate', self._w))
|
'pack', 'propagate', self._w))
|
||||||
def slaves(self):
|
def slaves(self):
|
||||||
return self.tk.splitlist(self.tk.call(
|
return map(self._nametowidget,
|
||||||
'pack', 'slaves', self._w))
|
self.tk.splitlist(
|
||||||
|
self.tk.call('pack', 'slaves', self._w)))
|
||||||
|
|
||||||
class Place:
|
class Place:
|
||||||
def config(self, cnf={}):
|
def config(self, cnf={}):
|
||||||
|
@ -420,20 +463,22 @@ class Place:
|
||||||
def info(self):
|
def info(self):
|
||||||
return self.tk.call('place', 'info', self._w)
|
return self.tk.call('place', 'info', self._w)
|
||||||
def slaves(self):
|
def slaves(self):
|
||||||
return self.tk.splitlist(self.tk.call(
|
return map(self._nametowidget,
|
||||||
'place', 'slaves', self._w))
|
self.tk.splitlist(
|
||||||
|
self.tk.call(
|
||||||
|
'place', 'slaves', self._w)))
|
||||||
|
|
||||||
default_root = None
|
_default_root = None
|
||||||
|
|
||||||
class Widget(Misc, Pack, Place):
|
class Widget(Misc, Pack, Place):
|
||||||
def __init__(self, master, widgetName, cnf={}, extra=()):
|
def __init__(self, master, widgetName, cnf={}, extra=()):
|
||||||
global default_root
|
global _default_root
|
||||||
if not master:
|
if not master:
|
||||||
if not default_root:
|
if not _default_root:
|
||||||
default_root = Tk()
|
_default_root = Tk()
|
||||||
master = default_root
|
master = _default_root
|
||||||
if not default_root:
|
if not _default_root:
|
||||||
default_root = master
|
_default_root = master
|
||||||
self.master = master
|
self.master = master
|
||||||
self.tk = master.tk
|
self.tk = master.tk
|
||||||
if cnf.has_key('name'):
|
if cnf.has_key('name'):
|
||||||
|
@ -441,6 +486,7 @@ class Widget(Misc, Pack, Place):
|
||||||
del cnf['name']
|
del cnf['name']
|
||||||
else:
|
else:
|
||||||
name = `id(self)`
|
name = `id(self)`
|
||||||
|
self._name = name
|
||||||
if master._w=='.':
|
if master._w=='.':
|
||||||
self._w = '.' + name
|
self._w = '.' + name
|
||||||
else:
|
else:
|
||||||
|
@ -448,6 +494,10 @@ class Widget(Misc, Pack, Place):
|
||||||
self.widgetName = widgetName
|
self.widgetName = widgetName
|
||||||
apply(self.tk.call, (widgetName, self._w) + extra)
|
apply(self.tk.call, (widgetName, self._w) + extra)
|
||||||
Widget.config(self, cnf)
|
Widget.config(self, cnf)
|
||||||
|
self.children = {}
|
||||||
|
if master.children.has_key(name):
|
||||||
|
master.children[name].destroy()
|
||||||
|
master.children[name] = self
|
||||||
def config(self, cnf={}):
|
def config(self, cnf={}):
|
||||||
for k in cnf.keys():
|
for k in cnf.keys():
|
||||||
if type(k) == ClassType:
|
if type(k) == ClassType:
|
||||||
|
@ -463,9 +513,10 @@ class Widget(Misc, Pack, Place):
|
||||||
Widget.config(self, {key: value})
|
Widget.config(self, {key: value})
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self._w
|
return self._w
|
||||||
def __del__(self):
|
def destroy(self):
|
||||||
|
for c in self.children.values(): c.destroy()
|
||||||
|
del self.master.children[self._name]
|
||||||
self.tk.call('destroy', self._w)
|
self.tk.call('destroy', self._w)
|
||||||
destroy = __del__
|
|
||||||
def _do(self, name, args=()):
|
def _do(self, name, args=()):
|
||||||
apply(self.tk.call, (self._w, name) + args)
|
apply(self.tk.call, (self._w, name) + args)
|
||||||
|
|
||||||
|
@ -479,8 +530,9 @@ class Toplevel(Widget, Wm):
|
||||||
extra = extra + ('-class', cnf['class'])
|
extra = extra + ('-class', cnf['class'])
|
||||||
del cnf['class']
|
del cnf['class']
|
||||||
Widget.__init__(self, master, 'toplevel', cnf, extra)
|
Widget.__init__(self, master, 'toplevel', cnf, extra)
|
||||||
self.iconname(self.tk.call('wm', 'iconname', '.'))
|
root = self._root()
|
||||||
self.title(self.tk.call('wm', 'title', '.'))
|
self.iconname(root.iconname())
|
||||||
|
self.title(root.title())
|
||||||
|
|
||||||
class Button(Widget):
|
class Button(Widget):
|
||||||
def __init__(self, master=None, cnf={}):
|
def __init__(self, master=None, cnf={}):
|
||||||
|
@ -525,9 +577,9 @@ class Canvas(Widget):
|
||||||
return self._getints(self._do('bbox', args))
|
return self._getints(self._do('bbox', args))
|
||||||
def bind(self, tagOrId, sequence, func, add=''):
|
def bind(self, tagOrId, sequence, func, add=''):
|
||||||
if add: add='+'
|
if add: add='+'
|
||||||
name = self._register(func, _substitute)
|
name = self._register(func, self._substitute)
|
||||||
self.tk.call(self._w, 'bind', tagOrId, sequence,
|
self.tk.call(self._w, 'bind', tagOrId, sequence,
|
||||||
(add + name,) + _subst_prefix)
|
(add + name,) + self._subst_prefix)
|
||||||
def canvasx(self, screenx, gridspacing=None):
|
def canvasx(self, screenx, gridspacing=None):
|
||||||
return self.tk.getint(self.tk.call(
|
return self.tk.getint(self.tk.call(
|
||||||
self._w, 'canvasx', screenx, gridspacing))
|
self._w, 'canvasx', screenx, gridspacing))
|
||||||
|
@ -569,7 +621,7 @@ class Canvas(Widget):
|
||||||
def dtag(self, *args):
|
def dtag(self, *args):
|
||||||
self._do('dtag', args)
|
self._do('dtag', args)
|
||||||
def find(self, *args):
|
def find(self, *args):
|
||||||
self.tk.splitlist(self._do('find', args))
|
return self.tk.splitlist(self._do('find', args))
|
||||||
def focus(self, *args):
|
def focus(self, *args):
|
||||||
return self._do('focus', args)
|
return self._do('focus', args)
|
||||||
def gettags(self, *args):
|
def gettags(self, *args):
|
||||||
|
@ -845,10 +897,10 @@ class Text(Widget):
|
||||||
self._w, 'tag', 'add', tagName, index1, index2)
|
self._w, 'tag', 'add', tagName, index1, index2)
|
||||||
def tag_bind(self, tagName, sequence, func, add=''):
|
def tag_bind(self, tagName, sequence, func, add=''):
|
||||||
if add: add='+'
|
if add: add='+'
|
||||||
name = self._register(func, _substitute)
|
name = self._register(func, self._substitute)
|
||||||
self.tk.call(self._w, 'tag', 'bind',
|
self.tk.call(self._w, 'tag', 'bind',
|
||||||
tagName, sequence,
|
tagName, sequence,
|
||||||
(add + name,) + _subst_prefix)
|
(add + name,) + self._subst_prefix)
|
||||||
def tag_config(self, tagName, cnf={}):
|
def tag_config(self, tagName, cnf={}):
|
||||||
apply(self.tk.call,
|
apply(self.tk.call,
|
||||||
(self._w, 'tag', 'configure', tagName)
|
(self._w, 'tag', 'configure', tagName)
|
||||||
|
|
Loading…
Reference in New Issue