summaryrefslogtreecommitdiffstats
path: root/Lib/lib-tk/Tkinter.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/lib-tk/Tkinter.py')
-rw-r--r--Lib/lib-tk/Tkinter.py277
1 files changed, 166 insertions, 111 deletions
diff --git a/Lib/lib-tk/Tkinter.py b/Lib/lib-tk/Tkinter.py
index f009afd..1f3d46e 100644
--- a/Lib/lib-tk/Tkinter.py
+++ b/Lib/lib-tk/Tkinter.py
@@ -119,6 +119,7 @@ def getdouble(s):
def getboolean(s):
return _default_root.tk.getboolean(s)
+# Methods defined on both toplevel and interior widgets
class Misc:
_tclCommands = None
def destroy(self):
@@ -568,7 +569,7 @@ class Misc:
root = self._root()
root.report_callback_exception(exc, val, tb)
# These used to be defined in Widget:
- def config(self, cnf=None, **kw):
+ def configure(self, cnf=None, **kw):
# XXX ought to generalize this so tag_config etc. can use it
if kw:
cnf = _cnfmerge((cnf, kw))
@@ -586,17 +587,117 @@ class Misc:
return (x[0][1:],) + x[1:]
apply(self.tk.call, (self._w, 'configure')
+ self._options(cnf))
- configure = config
+ config = configure
def cget(self, key):
return self.tk.call(self._w, 'cget', '-' + key)
__getitem__ = cget
def __setitem__(self, key, value):
- Widget.config(self, {key: value})
+ self.configure({key: value})
def keys(self):
return map(lambda x: x[0][1:],
self.tk.split(self.tk.call(self._w, 'configure')))
def __str__(self):
return self._w
+ # Pack methods that apply to the master
+ _noarg_ = ['_noarg_']
+ def pack_propagate(self, flag=_noarg_):
+ if flag is Misc._noarg_:
+ return self._getboolean(self.tk.call(
+ 'pack', 'propagate', self._w))
+ else:
+ self.tk.call('pack', 'propagate', self._w, flag)
+ propagate = pack_propagate
+ def pack_slaves(self):
+ return map(self._nametowidget,
+ self.tk.splitlist(
+ self.tk.call('pack', 'slaves', self._w)))
+ slaves = pack_slaves
+ # Place method that applies to the master
+ def place_slaves(self):
+ return map(self._nametowidget,
+ self.tk.splitlist(
+ self.tk.call(
+ 'place', 'slaves', self._w)))
+ # Grid methods that apply to the master
+ def grid_bbox(self, column, row):
+ return self._getints(
+ self.tk.call(
+ 'grid', 'bbox', self._w, column, row)) or None
+ bbox = grid_bbox
+ def grid_columnconfigure(self, index, cnf={}, **kw):
+ if type(cnf) is not DictionaryType and not kw:
+ options = self._options({cnf: None})
+ else:
+ options = self._options(cnf, kw)
+ if not options:
+ res = self.tk.call('grid',
+ 'columnconfigure', self._w, index)
+ words = self.tk.splitlist(res)
+ dict = {}
+ for i in range(0, len(words), 2):
+ key = words[i][1:]
+ value = words[i+1]
+ if not value:
+ value = None
+ elif '.' in value:
+ value = self.tk.getdouble(value)
+ else:
+ value = self.tk.getint(value)
+ dict[key] = value
+ return dict
+ res = apply(self.tk.call,
+ ('grid', 'columnconfigure', self._w, index)
+ + options)
+ if options == ('-minsize', None):
+ return self.tk.getint(res) or None
+ elif options == ('-weight', None):
+ return self.tk.getdouble(res) or None
+ columnconfigure = grid_columnconfigure
+ def grid_propagate(self, flag=_noarg_):
+ if flag is Misc._noarg_:
+ return self._getboolean(self.tk.call(
+ 'grid', 'propagate', self._w))
+ else:
+ self.tk.call('grid', 'propagate', self._w, flag)
+ def grid_rowconfigure(self, index, cnf={}, **kw):
+ if type(cnf) is not DictionaryType and not kw:
+ options = self._options({cnf: None})
+ else:
+ options = self._options(cnf, kw)
+ if not options:
+ res = self.tk.call('grid',
+ 'rowconfigure', self._w, index)
+ words = self.tk.splitlist(res)
+ dict = {}
+ for i in range(0, len(words), 2):
+ key = words[i][1:]
+ value = words[i+1]
+ if not value:
+ value = None
+ elif '.' in value:
+ value = self.tk.getdouble(value)
+ else:
+ value = self.tk.getint(value)
+ dict[key] = value
+ return dict
+ res = apply(self.tk.call,
+ ('grid', 'rowconfigure', self._w, index)
+ + options)
+ if len(options) == 2 and options[-1] is None:
+ if not res: return None
+ # In Tk 7.5, -width can be a float
+ if '.' in res: return self.tk.getdouble(res)
+ return self.tk.getint(res)
+ rowconfigure = grid_rowconfigure
+ def grid_size(self):
+ return self._getints(
+ self.tk.call('grid', 'size', self._w)) or None
+ size = grid_size
+ def grid_slaves(self, *args):
+ return map(self._nametowidget,
+ self.tk.splitlist(
+ apply(self.tk.call,
+ ('grid', 'slaves', self._w) + args)))
class CallWrapper:
def __init__(self, func, subst, widget):
@@ -767,19 +868,30 @@ class Tk(Misc, Wm):
print "Exception in Tkinter callback"
traceback.print_exception(exc, val, tb)
+# Ideally, the classes Pack, Place and Grid disappear, the
+# pack/place/grid methods are defined on the Widget class, and
+# everybody uses w.pack_whatever(...) instead of Pack.whatever(w,
+# ...), with pack(), place() and grid() being short for
+# pack_configure(), place_configure() and grid_columnconfigure(), and
+# forget() being short for pack_forget(). As a practical matter, I'm
+# afraid that there is too much code out there that may be using the
+# Pack, Place or Grid class, so I leave them intact -- but only as
+# backwards compatibility features. Also note that those methods that
+# take a master as argument (e.g. pack_propagate) have been moved to
+# the Misc class (which now incorporates all methods common between
+# toplevel and interior widgets). Again, for compatibility, these are
+# copied into the Pack, Place or Grid class.
+
class Pack:
- def config(self, cnf={}, **kw):
+ def pack_configure(self, cnf={}, **kw):
apply(self.tk.call,
('pack', 'configure', self._w)
+ self._options(cnf, kw))
- configure = config
- pack = config
- def __setitem__(self, key, value):
- Pack.config({key: value})
- def forget(self):
+ pack = configure = config = pack_configure
+ def pack_forget(self):
self.tk.call('pack', 'forget', self._w)
- pack_forget = forget
- def info(self):
+ forget = pack_forget
+ def pack_info(self):
words = self.tk.splitlist(
self.tk.call('pack', 'info', self._w))
dict = {}
@@ -790,23 +902,12 @@ class Pack:
value = self._nametowidget(value)
dict[key] = value
return dict
- pack_info = info
- _noarg_ = ['_noarg_']
- def propagate(self, flag=_noarg_):
- if flag is Pack._noarg_:
- return self._getboolean(self.tk.call(
- 'pack', 'propagate', self._w))
- else:
- self.tk.call('pack', 'propagate', self._w, flag)
- pack_propagate = propagate
- def slaves(self):
- return map(self._nametowidget,
- self.tk.splitlist(
- self.tk.call('pack', 'slaves', self._w)))
- pack_slaves = slaves
+ info = pack_info
+ propagate = pack_propagate = Misc.pack_propagate
+ slaves = pack_slaves = Misc.pack_slaves
class Place:
- def config(self, cnf={}, **kw):
+ def place_configure(self, cnf={}, **kw):
for k in ['in_']:
if kw.has_key(k):
kw[k[:-1]] = kw[k]
@@ -814,14 +915,11 @@ class Place:
apply(self.tk.call,
('place', 'configure', self._w)
+ self._options(cnf, kw))
- configure = config
- place = config
- def __setitem__(self, key, value):
- Place.config({key: value})
- def forget(self):
+ place = configure = config = place_configure
+ def place_forget(self):
self.tk.call('place', 'forget', self._w)
- place_forget = forget
- def info(self):
+ forget = place_forget
+ def place_info(self):
words = self.tk.splitlist(
self.tk.call('place', 'info', self._w))
dict = {}
@@ -832,44 +930,22 @@ class Place:
value = self._nametowidget(value)
dict[key] = value
return dict
- place_info = info
- def slaves(self):
- return map(self._nametowidget,
- self.tk.splitlist(
- self.tk.call(
- 'place', 'slaves', self._w)))
- place_slaves = slaves
+ info = place_info
+ slaves = place_slaves = Misc.place_slaves
class Grid:
# Thanks to Masazumi Yoshikawa (yosikawa@isi.edu)
- def config(self, cnf={}, **kw):
+ def grid_configure(self, cnf={}, **kw):
apply(self.tk.call,
('grid', 'configure', self._w)
+ self._options(cnf, kw))
- grid = config
- def __setitem__(self, key, value):
- Grid.config({key: value})
- def bbox(self, column, row):
- return self._getints(
- self.tk.call(
- 'grid', 'bbox', self._w, column, row)) or None
- grid_bbox = bbox
- def columnconfigure(self, index, cnf={}, **kw):
- if type(cnf) is not DictionaryType and not kw:
- options = self._options({cnf: None})
- else:
- options = self._options(cnf, kw)
- res = apply(self.tk.call,
- ('grid', 'columnconfigure', self._w, index)
- + options)
- if options == ('-minsize', None):
- return self.tk.getint(res) or None
- elif options == ('-weight', None):
- return self.tk.getdouble(res) or None
- def forget(self):
+ grid = configure = config = grid_configure
+ bbox = grid_bbox = Misc.grid_bbox
+ columnconfigure = grid_columnconfigure = Misc.grid_columnconfigure
+ def grid_forget(self):
self.tk.call('grid', 'forget', self._w)
- grid_forget = forget
- def info(self):
+ forget = grid_forget
+ def grid_info(self):
words = self.tk.splitlist(
self.tk.call('grid', 'info', self._w))
dict = {}
@@ -880,42 +956,18 @@ class Grid:
value = self._nametowidget(value)
dict[key] = value
return dict
- grid_info = info
- def location(self, x, y):
+ info = grid_info
+ def grid_location(self, x, y):
return self._getints(
self.tk.call(
'grid', 'location', self._w, x, y)) or None
- _noarg_ = ['_noarg_']
- def propagate(self, flag=_noarg_):
- if flag is Grid._noarg_:
- return self._getboolean(self.tk.call(
- 'grid', 'propagate', self._w))
- else:
- self.tk.call('grid', 'propagate', self._w, flag)
- grid_propagate = propagate
- def rowconfigure(self, index, cnf={}, **kw):
- if type(cnf) is not DictionaryType and not kw:
- options = self._options({cnf: None})
- else:
- options = self._options(cnf, kw)
- res = apply(self.tk.call,
- ('grid', 'rowconfigure', self._w, index)
- + options)
- if options == ('-minsize', None):
- return self.tk.getint(res) or None
- elif options == ('-weight', None):
- return self.tk.getdouble(res) or None
- def size(self):
- return self._getints(
- self.tk.call('grid', 'size', self._w)) or None
- def slaves(self, *args):
- return map(self._nametowidget,
- self.tk.splitlist(
- apply(self.tk.call,
- ('grid', 'slaves', self._w) + args)))
- grid_slaves = slaves
+ location = grid_location
+ propagate = grid_propagate = Misc.grid_propagate
+ rowconfigure = grid_rowconfigure = Misc.grid_rowconfigure
+ size = grid_size = Misc.grid_size
+ slaves = grid_slaves = Misc.grid_slaves
-class Widget(Misc, Pack, Place, Grid):
+class BaseWidget(Misc):
def _setup(self, master, cnf):
global _default_root
if not master:
@@ -945,7 +997,7 @@ class Widget(Misc, Pack, Place, Grid):
if kw:
cnf = _cnfmerge((cnf, kw))
self.widgetName = widgetName
- Widget._setup(self, master, cnf)
+ BaseWidget._setup(self, master, cnf)
classes = []
for k in cnf.keys():
if type(k) is ClassType:
@@ -954,7 +1006,7 @@ class Widget(Misc, Pack, Place, Grid):
apply(self.tk.call,
(widgetName, self._w) + extra + self._options(cnf))
for k, v in classes:
- k.config(self, v)
+ k.configure(self, v)
def destroy(self):
for c in self.children.values(): c.destroy()
if self.master.children.has_key(self._name):
@@ -964,7 +1016,10 @@ class Widget(Misc, Pack, Place, Grid):
def _do(self, name, args=()):
return apply(self.tk.call, (self._w, name) + args)
-class Toplevel(Widget, Wm):
+class Widget(BaseWidget, Pack, Place, Grid):
+ pass
+
+class Toplevel(BaseWidget, Wm):
def __init__(self, master=None, cnf={}, **kw):
if kw:
cnf = _cnfmerge((cnf, kw))
@@ -979,7 +1034,7 @@ class Toplevel(Widget, Wm):
else: opt = '-'+wmkey
extra = extra + (opt, val)
del cnf[wmkey]
- Widget.__init__(self, master, 'toplevel', cnf, {}, extra)
+ BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra)
root = self._root()
self.iconname(root.iconname())
self.title(root.title())
@@ -1119,7 +1174,7 @@ class Canvas(Widget):
self._do('insert', args)
def itemcget(self, tagOrId, option):
return self._do('itemcget', (tagOrId, '-'+option))
- def itemconfig(self, tagOrId, cnf=None, **kw):
+ def itemconfigure(self, tagOrId, cnf=None, **kw):
if cnf is None and not kw:
cnf = {}
for x in self.tk.split(
@@ -1132,7 +1187,7 @@ class Canvas(Widget):
return (x[0][1:],) + x[1:]
self._do('itemconfigure', (tagOrId,)
+ self._options(cnf, kw))
- itemconfigure = itemconfig
+ itemconfig = itemconfigure
def lower(self, *args):
self._do('lower', args)
def move(self, *args):
@@ -1360,7 +1415,7 @@ class Menu(Widget):
self.insert(index, 'separator', cnf or kw)
def delete(self, index1, index2=None):
self.tk.call(self._w, 'delete', index1, index2)
- def entryconfig(self, index, cnf=None, **kw):
+ def entryconfigure(self, index, cnf=None, **kw):
if cnf is None and not kw:
cnf = {}
for x in self.tk.split(apply(self.tk.call,
@@ -1373,7 +1428,7 @@ class Menu(Widget):
return (x[0][1:],) + x[1:]
apply(self.tk.call, (self._w, 'entryconfigure', index)
+ self._options(cnf, kw))
- entryconfigure = entryconfig
+ entryconfig = entryconfigure
def index(self, index):
i = self.tk.call(self._w, 'index', index)
if i == 'none': return None
@@ -1512,7 +1567,7 @@ class Text(Widget):
if option[-1:] == '_':
option = option[:-1]
return self.tk.call(self._w, 'tag', 'cget', tagName, option)
- def tag_config(self, tagName, cnf={}, **kw):
+ def tag_configure(self, tagName, cnf={}, **kw):
if type(cnf) == StringType:
x = self.tk.split(self.tk.call(
self._w, 'tag', 'configure', tagName, '-'+cnf))
@@ -1520,7 +1575,7 @@ class Text(Widget):
apply(self.tk.call,
(self._w, 'tag', 'configure', tagName)
+ self._options(cnf, kw))
- tag_configure = tag_config
+ tag_config = tag_configure
def tag_delete(self, *tagNames):
apply(self.tk.call, (self._w, 'tag', 'delete') + tagNames)
def tag_lower(self, tagName, belowThis=None):
@@ -1542,7 +1597,7 @@ class Text(Widget):
self._w, 'tag', 'remove', tagName, index1, index2)
def window_cget(self, index, option):
return self.tk.call(self._w, 'window', 'cget', index, option)
- def window_config(self, index, cnf={}, **kw):
+ def window_configure(self, index, cnf={}, **kw):
if type(cnf) == StringType:
x = self.tk.split(self.tk.call(
self._w, 'window', 'configure',
@@ -1551,7 +1606,7 @@ class Text(Widget):
apply(self.tk.call,
(self._w, 'window', 'configure', index)
+ self._options(cnf, kw))
- window_configure = window_config
+ window_config = window_configure
def window_create(self, index, cnf={}, **kw):
apply(self.tk.call,
(self._w, 'window', 'create', index)
@@ -1629,7 +1684,7 @@ class Image:
self.tk.call(self.name, 'configure', '-'+key, value)
def __getitem__(self, key):
return self.tk.call(self.name, 'configure', '-'+key)
- def config(self, **kw):
+ def configure(self, **kw):
res = ()
for k, v in _cnfmerge(kw).items():
if v is not None:
@@ -1638,7 +1693,7 @@ class Image:
v = self._register(v)
res = res + ('-'+k, v)
apply(self.tk.call, (self.name, 'config') + res)
- configure = config
+ config = configure
def height(self):
return self.tk.getint(
self.tk.call('image', 'height', self.name))
@@ -1724,7 +1779,7 @@ def _test():
label = Label(root, text="Proof-of-existence test for Tk")
label.pack()
test = Button(root, text="Click me!",
- command=lambda root=root: root.test.config(
+ command=lambda root=root: root.test.configure(
text="[%s]" % root.test['text']))
test.pack()
root.test = test