]> granicus.if.org Git - python/commitdiff
Issue #27025: Generated names for Tkinter widgets are now more meanful
authorSerhiy Storchaka <storchaka@gmail.com>
Mon, 13 Jun 2016 06:24:11 +0000 (09:24 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Mon, 13 Jun 2016 06:24:11 +0000 (09:24 +0300)
and recognizirable.

Lib/tkinter/__init__.py
Lib/tkinter/test/test_tkinter/test_misc.py

index cfb5268622017a473c6ed9df9d657f7f9384b00c..c687da580c5dc54c2327ae343e23acf501342f5e 100644 (file)
@@ -489,6 +489,9 @@ class Misc:
 
     Base class which defines methods common for interior widgets."""
 
+    # used for generating child widget names
+    _last_child_ids = None
+
     # XXX font command?
     _tclCommands = None
     def destroy(self):
@@ -2174,7 +2177,15 @@ class BaseWidget(Misc):
             name = cnf['name']
             del cnf['name']
         if not name:
-            name = repr(id(self))
+            name = self.__class__.__name__.lower()
+            if master._last_child_ids is None:
+                master._last_child_ids = {}
+            count = master._last_child_ids.get(name, 0) + 1
+            master._last_child_ids[name] = count
+            if count == 1:
+                name = '`%s' % (name,)
+            else:
+                name = '`%s%d' % (name, count)
         self._name = name
         if master._w=='.':
             self._w = '.' + name
@@ -3392,9 +3403,6 @@ class Image:
         if not name:
             Image._last_id += 1
             name = "pyimage%r" % (Image._last_id,) # tk itself would use image<x>
-            # The following is needed for systems where id(x)
-            # can return a negative number, such as Linux/m68k:
-            if name[0] == '-': name = '_' + name[1:]
         if kw and cnf: cnf = _cnfmerge((cnf, kw))
         elif kw: cnf = kw
         options = ()
index 85ee2c70b1bf426c86df801848522bf293aae0a3..9dc1e37547fcc24fd693ab288a4595a9330a66a8 100644 (file)
@@ -12,6 +12,14 @@ class MiscTest(AbstractTkTest, unittest.TestCase):
         f = tkinter.Frame(t, name='child')
         self.assertEqual(repr(f), '<tkinter.Frame object .top.child>')
 
+    def test_generated_names(self):
+        t = tkinter.Toplevel(self.root)
+        f = tkinter.Frame(t)
+        f2 = tkinter.Frame(t)
+        b = tkinter.Button(f2)
+        for name in str(b).split('.'):
+            self.assertFalse(name.isidentifier(), msg=repr(name))
+
     def test_tk_setPalette(self):
         root = self.root
         root.tk_setPalette('black')