mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
[3.11] gh-116484: Fix collisions between Checkbutton and ttk.Checkbutton default names (GH-116495) (GH-116902)
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 c61cb507c1
)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
eddfdb3e50
commit
02497b7ac2
3 changed files with 30 additions and 2 deletions
|
@ -3073,11 +3073,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):
|
||||
|
|
|
@ -287,9 +287,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):
|
||||
|
|
|
@ -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.
|
Loading…
Add table
Add a link
Reference in a new issue