summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2024-03-16 11:51:08 (GMT)
committerGitHub <noreply@github.com>2024-03-16 11:51:08 (GMT)
commit04e614663494b6b0fa7b24933fca7c8af3a5fa32 (patch)
treefaef953b0a645f656d8950c2ffa01b0fe8f6da06
parent716d482ba49a72adad4db98db92bb30667a566c7 (diff)
downloadcpython-04e614663494b6b0fa7b24933fca7c8af3a5fa32.zip
cpython-04e614663494b6b0fa7b24933fca7c8af3a5fa32.tar.gz
cpython-04e614663494b6b0fa7b24933fca7c8af3a5fa32.tar.bz2
[3.12] gh-116484: Fix collisions between Checkbutton and ttk.Checkbutton default names (GH-116495) (GH-116901)
Change automatically generated tkinter.Checkbutton widget names to avoid collisions with automatically generated tkinter.ttk.Checkbutton widget names within the same parent widget. (cherry picked from commit c61cb507c10c5b597928284e087a9a384ab267d0) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
-rw-r--r--Lib/test/test_ttk/test_widgets.py22
-rw-r--r--Lib/tkinter/__init__.py7
-rw-r--r--Misc/NEWS.d/next/Library/2024-03-08-11-31-49.gh-issue-116484.VMAsU7.rst3
3 files changed, 30 insertions, 2 deletions
diff --git a/Lib/test/test_ttk/test_widgets.py b/Lib/test/test_ttk/test_widgets.py
index fd1a748..e3e440c 100644
--- a/Lib/test/test_ttk/test_widgets.py
+++ b/Lib/test/test_ttk/test_widgets.py
@@ -285,9 +285,29 @@ class CheckbuttonTest(AbstractLabelTest, unittest.TestCase):
b.pack()
buttons.append(b)
variables = [str(b['variable']) for b in buttons]
- print(variables)
self.assertEqual(len(set(variables)), 4, variables)
+ def test_unique_variables2(self):
+ buttons = []
+ f = ttk.Frame(self.root)
+ f.pack()
+ f = ttk.Frame(self.root)
+ f.pack()
+ for j in 'AB':
+ b = tkinter.Checkbutton(f, text=j)
+ b.pack()
+ buttons.append(b)
+ # Should be larger than the number of all previously created
+ # tkinter.Checkbutton widgets:
+ for j in range(100):
+ b = ttk.Checkbutton(f, text=str(j))
+ b.pack()
+ buttons.append(b)
+ names = [str(b) for b in buttons]
+ self.assertEqual(len(set(names)), len(buttons), names)
+ variables = [str(b['variable']) for b in buttons]
+ self.assertEqual(len(set(variables)), len(buttons), variables)
+
@add_standard_options(IntegerSizeTests, StandardTtkOptionsTests)
class EntryTest(AbstractWidgetTest, unittest.TestCase):
diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py
index 8b8fdfe..43b0cbe 100644
--- a/Lib/tkinter/__init__.py
+++ b/Lib/tkinter/__init__.py
@@ -3074,11 +3074,16 @@ class Checkbutton(Widget):
Widget.__init__(self, master, 'checkbutton', cnf, kw)
def _setup(self, master, cnf):
+ # Because Checkbutton defaults to a variable with the same name as
+ # the widget, Checkbutton default names must be globally unique,
+ # not just unique within the parent widget.
if not cnf.get('name'):
global _checkbutton_count
name = self.__class__.__name__.lower()
_checkbutton_count += 1
- cnf['name'] = f'!{name}{_checkbutton_count}'
+ # To avoid collisions with ttk.Checkbutton, use the different
+ # name template.
+ cnf['name'] = f'!{name}-{_checkbutton_count}'
super()._setup(master, cnf)
def deselect(self):
diff --git a/Misc/NEWS.d/next/Library/2024-03-08-11-31-49.gh-issue-116484.VMAsU7.rst b/Misc/NEWS.d/next/Library/2024-03-08-11-31-49.gh-issue-116484.VMAsU7.rst
new file mode 100644
index 0000000..265c381
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-03-08-11-31-49.gh-issue-116484.VMAsU7.rst
@@ -0,0 +1,3 @@
+Change automatically generated :class:`tkinter.Checkbutton` widget names to
+avoid collisions with automatically generated
+:class:`tkinter.ttk.Checkbutton` widget names within the same parent widget.