Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Doc/whatsnew/3.15.rst
Original file line number Diff line number Diff line change
Expand Up @@ -792,6 +792,12 @@ tkinter
using Tcl's ``-all`` and ``-overlap`` options.
(Contributed by Rihaan Meher in :gh:`130848`)

* Added new methods :meth:`!pack_content`, :meth:`!place_content` and
:meth:`!grid_content` which use Tk commands with new names (introduced
in Tk 8.6) instead of :meth:`!*_slaves` methods which use Tk commands
with outdated names.
(Contributed by Serhiy Storchaka in :gh:`143754`)

types
------

Expand Down
66 changes: 50 additions & 16 deletions Lib/test/test_tkinter/test_geometry_managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@ def test_pack_configure_after(self):
b.pack_configure(side='top')
c.pack_configure(side='top')
d.pack_configure(side='top')
self.assertEqual(pack.pack_slaves(), [a, b, c, d])
self.assertEqual(pack.pack_content(), [a, b, c, d])
a.pack_configure(after=b)
self.assertEqual(pack.pack_slaves(), [b, a, c, d])
self.assertEqual(pack.pack_content(), [b, a, c, d])
a.pack_configure(after=a)
self.assertEqual(pack.pack_slaves(), [b, a, c, d])
self.assertEqual(pack.pack_content(), [b, a, c, d])

def test_pack_configure_anchor(self):
pack, a, b, c, d = self.create2()
Expand Down Expand Up @@ -73,11 +73,11 @@ def test_pack_configure_before(self):
b.pack_configure(side='top')
c.pack_configure(side='top')
d.pack_configure(side='top')
self.assertEqual(pack.pack_slaves(), [a, b, c, d])
self.assertEqual(pack.pack_content(), [a, b, c, d])
a.pack_configure(before=d)
self.assertEqual(pack.pack_slaves(), [b, c, a, d])
self.assertEqual(pack.pack_content(), [b, c, a, d])
a.pack_configure(before=a)
self.assertEqual(pack.pack_slaves(), [b, c, a, d])
self.assertEqual(pack.pack_content(), [b, c, a, d])

def test_pack_configure_expand(self):
pack, a, b, c, d = self.create2()
Expand Down Expand Up @@ -110,10 +110,10 @@ def test_pack_configure_in(self):
c.pack_configure(side='top')
d.pack_configure(side='top')
a.pack_configure(in_=pack)
self.assertEqual(pack.pack_slaves(), [b, c, d, a])
self.assertEqual(pack.pack_content(), [b, c, d, a])
a.pack_configure(in_=c)
self.assertEqual(pack.pack_slaves(), [b, c, d])
self.assertEqual(c.pack_slaves(), [a])
self.assertEqual(pack.pack_content(), [b, c, d])
self.assertEqual(c.pack_content(), [a])
with self.assertRaisesRegex(
TclError, """can't pack "?%s"? inside itself""" % (a,)):
a.pack_configure(in_=a)
Expand Down Expand Up @@ -223,11 +223,11 @@ def test_pack_forget(self):
a.pack_configure()
b.pack_configure()
c.pack_configure()
self.assertEqual(pack.pack_slaves(), [a, b, c])
self.assertEqual(pack.pack_content(), [a, b, c])
b.pack_forget()
self.assertEqual(pack.pack_slaves(), [a, c])
self.assertEqual(pack.pack_content(), [a, c])
b.pack_forget()
self.assertEqual(pack.pack_slaves(), [a, c])
self.assertEqual(pack.pack_content(), [a, c])
d.pack_forget()

def test_pack_info(self):
Expand Down Expand Up @@ -273,6 +273,14 @@ def test_pack_propagate(self):
self.assertEqual(pack.winfo_reqwidth(), 20)
self.assertEqual(pack.winfo_reqheight(), 40)

def test_pack_content(self):
pack, a, b, c, d = self.create2()
self.assertEqual(pack.pack_content(), [])
a.pack_configure()
self.assertEqual(pack.pack_content(), [a])
b.pack_configure()
self.assertEqual(pack.pack_content(), [a, b])

def test_pack_slaves(self):
pack, a, b, c, d = self.create2()
self.assertEqual(pack.pack_slaves(), [])
Expand Down Expand Up @@ -477,6 +485,15 @@ def test_place_info(self):
with self.assertRaises(TypeError):
f2.place_info(0)

def test_place_content(self):
foo = tkinter.Frame(self.root)
bar = tkinter.Frame(self.root)
self.assertEqual(foo.place_content(), [])
bar.place_configure(in_=foo)
self.assertEqual(foo.place_content(), [bar])
with self.assertRaises(TypeError):
foo.place_content(0)

def test_place_slaves(self):
foo = tkinter.Frame(self.root)
bar = tkinter.Frame(self.root)
Expand Down Expand Up @@ -729,10 +746,10 @@ def test_grid_forget(self):
c = tkinter.Button(self.root)
b.grid_configure(row=2, column=2, rowspan=2, columnspan=2,
padx=3, pady=4, sticky='ns')
self.assertEqual(self.root.grid_slaves(), [b])
self.assertEqual(self.root.grid_content(), [b])
b.grid_forget()
c.grid_forget()
self.assertEqual(self.root.grid_slaves(), [])
self.assertEqual(self.root.grid_content(), [])
self.assertEqual(b.grid_info(), {})
b.grid_configure(row=0, column=0)
info = b.grid_info()
Expand All @@ -749,10 +766,10 @@ def test_grid_remove(self):
c = tkinter.Button(self.root)
b.grid_configure(row=2, column=2, rowspan=2, columnspan=2,
padx=3, pady=4, sticky='ns')
self.assertEqual(self.root.grid_slaves(), [b])
self.assertEqual(self.root.grid_content(), [b])
b.grid_remove()
c.grid_remove()
self.assertEqual(self.root.grid_slaves(), [])
self.assertEqual(self.root.grid_content(), [])
self.assertEqual(b.grid_info(), {})
b.grid_configure(row=0, column=0)
info = b.grid_info()
Expand Down Expand Up @@ -887,6 +904,23 @@ def test_grid_size(self):
f.grid_configure(row=4, column=5)
self.assertEqual(self.root.grid_size(), (6, 5))

def test_grid_content(self):
self.assertEqual(self.root.grid_content(), [])
a = tkinter.Label(self.root)
a.grid_configure(row=0, column=1)
b = tkinter.Label(self.root)
b.grid_configure(row=1, column=0)
c = tkinter.Label(self.root)
c.grid_configure(row=1, column=1)
d = tkinter.Label(self.root)
d.grid_configure(row=1, column=1)
self.assertEqual(self.root.grid_content(), [d, c, b, a])
self.assertEqual(self.root.grid_content(row=0), [a])
self.assertEqual(self.root.grid_content(row=1), [d, c, b])
self.assertEqual(self.root.grid_content(column=0), [b])
self.assertEqual(self.root.grid_content(column=1), [d, c, a])
self.assertEqual(self.root.grid_content(row=1, column=1), [d, c])

def test_grid_slaves(self):
self.assertEqual(self.root.grid_slaves(), [])
a = tkinter.Label(self.root)
Expand Down
46 changes: 43 additions & 3 deletions Lib/tkinter/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1885,19 +1885,41 @@ def pack_propagate(self, flag=_noarg_):

propagate = pack_propagate

def pack_slaves(self):
def pack_content(self):
"""Returns a list of all of the content widgets in the packing order
for this container."""
try:
res = self.tk.call('pack', 'content', self._w)
except TclError:
if self.info_patchlevel() >= (8, 6):
raise
res = self.tk.call('pack', 'slaves', self._w)
return [self._nametowidget(x) for x in self.tk.splitlist(res)]

content = pack_content

def pack_slaves(self):
"""Synonym for pack_content()."""
return [self._nametowidget(x) for x in
self.tk.splitlist(
self.tk.call('pack', 'slaves', self._w))]

slaves = pack_slaves

# Place method that applies to the container widget
def place_slaves(self):
def place_content(self):
"""Returns a list of all the content widgets for which this widget is
the container."""
try:
res = self.tk.call('place', 'content', self._w)
except TclError:
if self.info_patchlevel() >= (8, 6):
raise
res = self.tk.call('place', 'slaves', self._w)
return [self._nametowidget(x) for x in self.tk.splitlist(res)]

def place_slaves(self):
"""Synonym for place_content()."""
return [self._nametowidget(x) for x in
self.tk.splitlist(
self.tk.call(
Expand Down Expand Up @@ -2018,7 +2040,7 @@ def grid_size(self):

size = grid_size

def grid_slaves(self, row=None, column=None):
def grid_content(self, row=None, column=None):
"""Returns a list of the content widgets.

If no arguments are supplied, a list of all of the content in this
Expand All @@ -2027,6 +2049,21 @@ def grid_slaves(self, row=None, column=None):
column is returned.
"""
args = ()
if row is not None:
args = args + ('-row', row)
if column is not None:
args = args + ('-column', column)
try:
res = self.tk.call('grid', 'content', self._w, *args)
except TclError:
if self.info_patchlevel() >= (8, 6):
raise
res = self.tk.call('grid', 'slaves', self._w, *args)
return [self._nametowidget(x) for x in self.tk.splitlist(res)]

def grid_slaves(self, row=None, column=None):
"""Synonym for grid_content()."""
args = ()
if row is not None:
args = args + ('-row', row)
if column is not None:
Expand Down Expand Up @@ -2641,6 +2678,7 @@ def pack_info(self):

info = pack_info
propagate = pack_propagate = Misc.pack_propagate
content = pack_content = Misc.pack_content
slaves = pack_slaves = Misc.pack_slaves


Expand Down Expand Up @@ -2698,6 +2736,7 @@ def place_info(self):
return d

info = place_info
content = place_content = Misc.place_content
slaves = place_slaves = Misc.place_slaves


Expand Down Expand Up @@ -2753,6 +2792,7 @@ def grid_info(self):
propagate = grid_propagate = Misc.grid_propagate
rowconfigure = grid_rowconfigure = Misc.grid_rowconfigure
size = grid_size = Misc.grid_size
content = grid_content = Misc.grid_content
slaves = grid_slaves = Misc.grid_slaves


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Add new :mod:`tkinter` widget methods :meth:`!pack_content`,
:meth:`!place_content` and :meth:`!grid_content` which are alternative
spelling of old :meth:`!*_slaves` methods.
Loading