mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	gh-116484: Fix collisions between Checkbutton and ttk.Checkbutton default names (GH-116495)
Change automatically generated tkinter.Checkbutton widget names to avoid collisions with automatically generated tkinter.ttk.Checkbutton widget names within the same parent widget.
This commit is contained in:
		
							parent
							
								
									1069a462f6
								
							
						
					
					
						commit
						c61cb507c1
					
				
					 3 changed files with 30 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -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):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3166,11 +3166,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):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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