[Python-checkins] bpo-45160: Ttk optionmenu only set variable once (GH-28291)

ambv webhook-mailer at python.org
Thu Oct 21 16:26:02 EDT 2021


https://github.com/python/cpython/commit/add46f84769a7e6fafa50954f79b7c248231fa4e
commit: add46f84769a7e6fafa50954f79b7c248231fa4e
branch: main
author: E-Paine <63801254+E-Paine at users.noreply.github.com>
committer: ambv <lukasz at langa.pl>
date: 2021-10-21T22:25:52+02:00
summary:

bpo-45160: Ttk optionmenu only set variable once (GH-28291)

files:
A Misc/NEWS.d/next/Library/2021-09-11-14-47-05.bpo-45160.VzMXbW.rst
M Lib/tkinter/test/test_ttk/test_extensions.py
M Lib/tkinter/ttk.py

diff --git a/Lib/tkinter/test/test_ttk/test_extensions.py b/Lib/tkinter/test/test_ttk/test_extensions.py
index 438d21d0b3733..cddd1f2e84834 100644
--- a/Lib/tkinter/test/test_ttk/test_extensions.py
+++ b/Lib/tkinter/test/test_ttk/test_extensions.py
@@ -301,6 +301,19 @@ def test_unique_radiobuttons(self):
         optmenu.destroy()
         optmenu2.destroy()
 
+    def test_trace_variable(self):
+        # prior to bpo45160, tracing a variable would cause the callback to be made twice
+        success = []
+        items = ('a', 'b', 'c')
+        textvar = tkinter.StringVar(self.root)
+        def cb_test(*args):
+            self.assertEqual(textvar.get(), items[1])
+            success.append(True)
+        optmenu = ttk.OptionMenu(self.root, textvar, "a", *items)
+        textvar.trace("w", cb_test)
+        optmenu['menu'].invoke(1)
+        self.assertEqual(success, [True])
+
 
 class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase):
 
diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py
index b854235a62679..acdd565ec48a9 100644
--- a/Lib/tkinter/ttk.py
+++ b/Lib/tkinter/ttk.py
@@ -1643,7 +1643,10 @@ def set_menu(self, default=None, *values):
         menu.delete(0, 'end')
         for val in values:
             menu.add_radiobutton(label=val,
-                command=tkinter._setit(self._variable, val, self._callback),
+                command=(
+                    None if self._callback is None
+                    else lambda val=val: self._callback(val)
+                ),
                 variable=self._variable)
 
         if default:
diff --git a/Misc/NEWS.d/next/Library/2021-09-11-14-47-05.bpo-45160.VzMXbW.rst b/Misc/NEWS.d/next/Library/2021-09-11-14-47-05.bpo-45160.VzMXbW.rst
new file mode 100644
index 0000000000000..9d11ed0e55d24
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-09-11-14-47-05.bpo-45160.VzMXbW.rst
@@ -0,0 +1 @@
+When tracing a tkinter variable used by a ttk OptionMenu, callbacks are no longer made twice.
\ No newline at end of file



More information about the Python-checkins mailing list